<?php

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

/**
 * Los permisos de la pantalla de tokens de la API de administración (PRODSECU-215).
 *
 * Solo datos: la tabla `personal_access_tokens` ya existía y no se toca el esquema.
 *
 * **No confundir con `admin.tokens.index`**, que es ver el `moodletoken` de un entorno.
 *
 * Solo Admin: un token de esta API crea clientes y licencias, y quien lo emite decide qué
 * puede hacer Sistemas en el Manager. Si otro rol lo necesitara, se le da desde el panel.
 */
return new class extends Migration
{
    private const PERMISOS = [
        'admin.api-tokens.index' => 'Tokens de la API: Ver los tokens y la documentación',
        'admin.api-tokens.create' => 'Tokens de la API: Crear',
        'admin.api-tokens.destroy' => 'Tokens de la API: Revocar',
    ];

    private const ROLES = ['Admin'];

    public function up(): void
    {
        foreach (self::PERMISOS as $nombre => $descripcion) {
            $permiso = Permission::firstOrCreate(
                ['name' => $nombre, 'guard_name' => 'web'],
                ['model' => 'api_tokens', 'description' => $descripcion]
            );

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

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

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

    public function down(): void
    {
        Permission::whereIn('name', array_keys(self::PERMISOS))->delete();

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