<?php

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

class RecreatePermissionsAndRoles extends Migration
{
    public function up()
    {
        // Limpiar tablas existentes
        DB::table('permission_role')->truncate();
        DB::table('role_user')->truncate();
        DB::table('permission_user')->truncate();
        DB::table('roles')->truncate();
        DB::table('permissions')->truncate();

        // Crear roles
        $roles = [
            [
                'id' => 1,
                'name' => 'root',
                'display_name' => 'Super Administrador',
                'description' => 'Usuario con acceso total al sistema',
                'created_at' => now(),
                'updated_at' => now()
            ],
            [
                'id' => 2,
                'name' => 'admin',
                'display_name' => 'Administrador',
                'description' => 'Administrador del sistema',
                'created_at' => now(),
                'updated_at' => now()
            ],
            [
                'id' => 3,
                'name' => 'receptionist',
                'display_name' => 'Recepcionista',
                'description' => 'Recepcionista del sistema',
                'created_at' => now(),
                'updated_at' => now()
            ]
        ];

        DB::table('roles')->insert($roles);

        // Crear permisos
        $permissions = [
            // Citas
            ['name' => 'create-appointment', 'display_name' => 'Crear Citas', 'description' => 'Puede crear citas'],
            ['name' => 'view-appointment', 'display_name' => 'Ver Citas', 'description' => 'Puede ver citas'],
            ['name' => 'edit-appointment', 'display_name' => 'Editar Citas', 'description' => 'Puede editar citas'],
            ['name' => 'delete-appointment', 'display_name' => 'Eliminar Citas', 'description' => 'Puede eliminar citas'],
            
            // Pacientes
            ['name' => 'create-patient', 'display_name' => 'Crear Pacientes', 'description' => 'Puede crear pacientes'],
            ['name' => 'view-patient', 'display_name' => 'Ver Pacientes', 'description' => 'Puede ver pacientes'],
            ['name' => 'edit-patient', 'display_name' => 'Editar Pacientes', 'description' => 'Puede editar pacientes'],
            ['name' => 'delete-patient', 'display_name' => 'Eliminar Pacientes', 'description' => 'Puede eliminar pacientes'],
            
            // Historias
            ['name' => 'create-history', 'display_name' => 'Crear Historias', 'description' => 'Puede crear historias'],
            ['name' => 'view-history', 'display_name' => 'Ver Historias', 'description' => 'Puede ver historias'],
            ['name' => 'edit-history', 'display_name' => 'Editar Historias', 'description' => 'Puede editar historias'],
            ['name' => 'delete-history', 'display_name' => 'Eliminar Historias', 'description' => 'Puede eliminar historias'],
            
            // Representantes
            ['name' => 'create-representative', 'display_name' => 'Crear Representantes', 'description' => 'Puede crear representantes'],
            ['name' => 'view-representative', 'display_name' => 'Ver Representantes', 'description' => 'Puede ver representantes'],
            ['name' => 'edit-representative', 'display_name' => 'Editar Representantes', 'description' => 'Puede editar representantes'],
            ['name' => 'delete-representative', 'display_name' => 'Eliminar Representantes', 'description' => 'Puede eliminar representantes'],
            
            // Usuarios
            ['name' => 'create-user', 'display_name' => 'Crear Usuarios', 'description' => 'Puede crear usuarios'],
            ['name' => 'view-user', 'display_name' => 'Ver Usuarios', 'description' => 'Puede ver usuarios'],
            ['name' => 'edit-user', 'display_name' => 'Editar Usuarios', 'description' => 'Puede editar usuarios'],
            ['name' => 'delete-user', 'display_name' => 'Eliminar Usuarios', 'description' => 'Puede eliminar usuarios'],
            
            // Áreas
            ['name' => 'create-area', 'display_name' => 'Crear Áreas', 'description' => 'Puede crear áreas'],
            ['name' => 'view-area', 'display_name' => 'Ver Áreas', 'description' => 'Puede ver áreas'],
            ['name' => 'edit-area', 'display_name' => 'Editar Áreas', 'description' => 'Puede editar áreas'],
            ['name' => 'delete-area', 'display_name' => 'Eliminar Áreas', 'description' => 'Puede eliminar áreas'],
            
            // Control de historias
            ['name' => 'create-control-history', 'display_name' => 'Crear Control de Historia', 'description' => 'Puede crear controles de historia'],
            ['name' => 'view-control-history', 'display_name' => 'Ver Control de Historia', 'description' => 'Puede ver controles de historia'],
            ['name' => 'edit-control-history', 'display_name' => 'Editar Control de Historia', 'description' => 'Puede editar controles de historia'],
            ['name' => 'delete-control-history', 'display_name' => 'Eliminar Control de Historia', 'description' => 'Puede eliminar controles de historia'],
            
            // Configuración
            ['name' => 'view-config', 'display_name' => 'Ver Configuración', 'description' => 'Puede ver configuración'],
            ['name' => 'edit-config', 'display_name' => 'Editar Configuración', 'description' => 'Puede editar configuración'],
            
            // Auditoría
            ['name' => 'view-audit', 'display_name' => 'Ver Auditoría', 'description' => 'Puede ver auditoría'],
            
            // Presupuestos
            ['name' => 'create-budget', 'display_name' => 'Crear Presupuestos', 'description' => 'Puede crear presupuestos'],
            ['name' => 'view-budget', 'display_name' => 'Ver Presupuestos', 'description' => 'Puede ver presupuestos'],
            ['name' => 'edit-budget', 'display_name' => 'Editar Presupuestos', 'description' => 'Puede editar presupuestos'],
            ['name' => 'delete-budget', 'display_name' => 'Eliminar Presupuestos', 'description' => 'Puede eliminar presupuestos'],
            ['name' => 'approve-budget', 'display_name' => 'Aprobar Presupuestos', 'description' => 'Puede aprobar presupuestos'],
            ['name' => 'reject-budget', 'display_name' => 'Rechazar Presupuestos', 'description' => 'Puede rechazar presupuestos'],
            
            // Servicios médicos
            ['name' => 'create-medical-service', 'display_name' => 'Crear Servicios Médicos', 'description' => 'Puede crear servicios médicos'],
            ['name' => 'view-medical-service', 'display_name' => 'Ver Servicios Médicos', 'description' => 'Puede ver servicios médicos'],
            ['name' => 'edit-medical-service', 'display_name' => 'Editar Servicios Médicos', 'description' => 'Puede editar servicios médicos'],
            ['name' => 'delete-medical-service', 'display_name' => 'Eliminar Servicios Médicos', 'description' => 'Puede eliminar servicios médicos']
        ];

        foreach ($permissions as $permission) {
            $permission['created_at'] = now();
            $permission['updated_at'] = now();
            DB::table('permissions')->insert($permission);
        }

        // Obtener todos los IDs de permisos
        $allPermissionIds = DB::table('permissions')->pluck('id')->toArray();
        
        // Asignar TODOS los permisos a root y admin
        foreach ([1, 2] as $roleId) { // 1 = root, 2 = admin
            foreach ($allPermissionIds as $permissionId) {
                DB::table('permission_role')->insert([
                    'permission_id' => $permissionId,
                    'role_id' => $roleId
                ]);
            }
        }

        // Permisos para recepcionista (solo los básicos, sin eliminar ni configurar)
        $receptionistPermissions = [
            'create-appointment', 'view-appointment', 'edit-appointment',
            'create-patient', 'view-patient',
            'view-history',
            'create-representative', 'view-representative',
            'view-user',
            'view-area',
            'view-control-history',
            'view-budget', 'create-budget',
            'view-medical-service'
        ];

        foreach ($receptionistPermissions as $permissionName) {
            $permissionId = DB::table('permissions')->where('name', $permissionName)->value('id');
            if ($permissionId) {
                DB::table('permission_role')->insert([
                    'permission_id' => $permissionId,
                    'role_id' => 3 // 3 = receptionist
                ]);
            }
        }

        // Asignar rol root al usuario root si existe
        $rootUser = DB::table('users')->where('email', 'root@root.com')->first();
        if ($rootUser) {
            DB::table('role_user')->insert([
                'role_id' => 1,
                'user_id' => $rootUser->id,
                'user_type' => 'App\\Models\\User',
                'created_at' => now(),
                'updated_at' => now()
            ]);
        }
    }

    public function down()
    {
        DB::table('permission_role')->truncate();
        DB::table('role_user')->truncate();
        DB::table('permission_user')->truncate();
        DB::table('roles')->truncate();
        DB::table('permissions')->truncate();
    }
} 