<?php

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

/**
 * El permiso para borrar un tipo de soporte del catálogo.
 *
 * **Es el mismo permiso que se borró hace un rato, y vuelve por el motivo correcto.**
 * `admin.supports.destroy` existía **sin gatear nada** y se fue con los otros 26 huérfanos
 * (MGR-101). Ahora vuelve **con su pantalla en el mismo cambio**, que es exactamente la
 * regla que se estableció al limpiarlos:
 *
 * > Un permiso nuevo o tiene su pantalla en el mismo cambio, o se declara en
 * > `PERMISOS_DE_ROADMAP` con el motivo. No hay tercera opción.
 *
 * Y esa ida y vuelta es la prueba de que la regla sirve: **el permiso no era la función**.
 * Tenerlo declarado durante meses no hizo que el catálogo pudiera borrar nada; lo que ha
 * hecho falta es la modal, el impacto y el bloqueo.
 *
 * ## El hueco que cierra
 *
 * El catálogo de `/supports` tenía listado, alta y edición, y **ninguna forma de quitar un
 * tipo**. Es el mismo hueco que tenían los tipos de entorno (MGR-062) y la octava aparición
 * del patrón en este release: *funcionalidad que parecía existir y no tenía puerta*.
 *
 * ## Solo Admin
 *
 * Igual que `admin.configurations.environments-types.destroy`. Quitar un tipo del catálogo
 * es una decisión de catálogo, no de gestión diaria: Soporte y Jefe de Proyecto pueden dar
 * de alta y quitar **contratos** de un entorno —eso sí es su trabajo, con
 * `admin.environments.supports.destroy`—, pero decidir que un tipo de soporte ya no se
 * vende es otra cosa.
 */
return new class extends Migration
{
    private const PERMISO = 'admin.supports.destroy';

    public function up(): void
    {
        $permiso = Permission::firstOrCreate(
            ['name' => self::PERMISO, 'guard_name' => 'web'],
            [
                'model' => 'supports',
                'description' => 'Soporte: Borrar tipo del catálogo',
            ]
        );

        $admin = Role::where('name', 'Admin')->first();

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

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

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

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