<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;

return new class extends Migration
{
    private const PERMISOS = [
        ['clave' => 'pos.acceso', 'nombre' => 'Caja / POS (facturar, imprimir y reimprimir)', 'categoria' => 'Facturación'],
        ['clave' => 'facturas.consultar', 'nombre' => 'Consultar historial de facturas', 'categoria' => 'Facturación'],
        ['clave' => 'inventario.gestionar', 'nombre' => 'Gestionar inventario, ajustes y entradas', 'categoria' => 'Inventario'],
        ['clave' => 'catalogos.gestionar', 'nombre' => 'Gestionar catálogos y datos del negocio', 'categoria' => 'Catálogos'],
        ['clave' => 'caja.gestionar', 'nombre' => 'Notas de crédito y corte de caja', 'categoria' => 'Caja'],
        ['clave' => 'reportes.ver', 'nombre' => 'Reportes y estadísticas', 'categoria' => 'Reportes'],
        ['clave' => 'cupones.gestionar', 'nombre' => 'Gestionar cupones de descuento', 'categoria' => 'Administración'],
        ['clave' => 'auditoria.ver', 'nombre' => 'Ver auditoría', 'categoria' => 'Administración'],
        ['clave' => 'backup.gestionar', 'nombre' => 'Backup de base de datos', 'categoria' => 'Administración'],
    ];

    public function up(): void
    {
        $ahora = now();

        foreach (self::PERMISOS as $permiso) {
            DB::table('permisos')->insert($permiso + ['created_at' => $ahora, 'updated_at' => $ahora]);
        }

        $permisoIds = DB::table('permisos')->pluck('id', 'clave');

        $adminId = DB::table('roles')->insertGetId([
            'nombre' => 'Administrador',
            'descripcion' => 'Acceso total al sistema.',
            'es_admin' => true,
            'created_at' => $ahora,
            'updated_at' => $ahora,
        ]);

        $operadorId = DB::table('roles')->insertGetId([
            'nombre' => 'Operador',
            'descripcion' => 'Uso general del sistema, sin administración de usuarios/roles ni funciones sensibles.',
            'es_admin' => false,
            'created_at' => $ahora,
            'updated_at' => $ahora,
        ]);

        $cajeroId = DB::table('roles')->insertGetId([
            'nombre' => 'Cajero',
            'descripcion' => 'Solo puede facturar e imprimir/reimprimir facturas desde la caja.',
            'es_admin' => false,
            'pantalla_inicio' => 'facturacion.index',
            'created_at' => $ahora,
            'updated_at' => $ahora,
        ]);

        // Administrador: todos los permisos togglables (ademas de es_admin=true, que ya implica acceso total en codigo).
        foreach ($permisoIds as $permisoId) {
            DB::table('permiso_role')->insert([
                'role_id' => $adminId, 'permiso_id' => $permisoId, 'created_at' => $ahora, 'updated_at' => $ahora,
            ]);
        }

        // Operador: todo lo que hoy es "no admin" en la practica (todo menos cupones/auditoria/backup).
        foreach (['pos.acceso', 'facturas.consultar', 'inventario.gestionar', 'catalogos.gestionar', 'caja.gestionar', 'reportes.ver'] as $clave) {
            DB::table('permiso_role')->insert([
                'role_id' => $operadorId, 'permiso_id' => $permisoIds[$clave], 'created_at' => $ahora, 'updated_at' => $ahora,
            ]);
        }

        // Cajero: unicamente caja/POS.
        DB::table('permiso_role')->insert([
            'role_id' => $cajeroId, 'permiso_id' => $permisoIds['pos.acceso'], 'created_at' => $ahora, 'updated_at' => $ahora,
        ]);

        // Backfill: usuarios existentes conservan su nivel de acceso equivalente.
        DB::table('users')->where('nivel', 2)->update(['role_id' => $adminId]);
        DB::table('users')->where('nivel', 1)->update(['role_id' => $operadorId]);
    }

    public function down(): void
    {
        DB::table('users')->update(['role_id' => null]);
        DB::table('permiso_role')->delete();
        DB::table('roles')->whereIn('nombre', ['Administrador', 'Operador', 'Cajero'])->delete();
        DB::table('permisos')->whereIn('clave', array_column(self::PERMISOS, 'clave'))->delete();
    }
};
