<?php

use Illuminate\Database\Migrations\Migration;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
use Spatie\Permission\PermissionRegistrar;

/**
 * El permiso para anotar que un entorno está pendiente de revisar.
 *
 * ## Por qué NO vale `admin.environments.edit`
 *
 * Era lo cómodo y habría dejado la función inútil. **Soporte no tiene ese permiso** —solo
 * `index`, `refresh` y `supports.index`—, y Soporte es justo quien va a anotar: son los que
 * hablan con el cliente y los que ven que algo está mal. Colgar la anotación de `edit`
 * significaba que la gente que detecta los problemas no puede escribirlos.
 *
 * Y abrirles `edit` entero sería peor: ese permiso cambia el dominio, la licencia y el tipo
 * de un entorno. **Anotar no es configurar**, y son dos decisiones de confianza distintas.
 *
 * ## Quién lo recibe
 *
 * Admin, Manager y Support. Developer no: no habla con clientes y su trabajo no genera esta
 * clase de observación. Si hiciera falta, se le da desde el panel — desde hoy los permisos
 * de los roles se editan ahí (`ProtectsSystemRoles`), y este es exactamente el caso que
 * justificó abrirlo.
 *
 * Y viene **con su pantalla en el mismo cambio**, que es la regla de la casa desde MGR-101:
 * un permiso sin función no es una función.
 */
return new class extends Migration
{
    private const PERMISO = 'admin.environments.review';

    private const ROLES = ['Admin', 'Manager', 'Support'];

    public function up(): void
    {
        $permiso = Permission::firstOrCreate(
            ['name' => self::PERMISO, 'guard_name' => 'web'],
            [
                'model' => 'environments',
                'description' => 'Entornos: Anotar que está pendiente de revisar',
            ]
        );

        foreach (self::ROLES as $nombre) {
            $rol = Role::where('name', $nombre)->first();

            if ($rol && ! $rol->hasPermissionTo($permiso)) {
                $rol->givePermissionTo($permiso);
            }
        }

        app(PermissionRegistrar::class)->forgetCachedPermissions();
    }

    public function down(): void
    {
        Permission::where('name', self::PERMISO)->delete();

        app(PermissionRegistrar::class)->forgetCachedPermissions();
    }
};
