<?php

namespace Database\Seeders;

use App\Models\User;
use App\Models\ClienteCorporativo;
use App\Models\Deudor;
use App\Models\Proceso;
use App\Models\Asignacion;
use App\Models\Actuacion;
use App\Models\Alerta;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Schema;
use Carbon\Carbon;

class DemoSeeder extends Seeder
{
    public function run(): void
    {
        $this->command->info('');
        $this->command->info('══════════════════════════════════════');
        $this->command->info('👥 Creando Usuarios del Equipo...');
        $this->command->info('══════════════════════════════════════');

        // ─── USUARIOS ───
        $admin = User::firstOrCreate(
            ['email' => 'admin@yber.com'],
            ['name' => 'Administrador YBER', 'password' => Hash::make('YberAdmin2025*'), 'is_active' => true]
        );
        if (!$admin->hasRole('admin')) $admin->assignRole('admin');

        $gerente = User::firstOrCreate(
            ['email' => 'yolima@yber.com'],
            ['name' => 'Dra. Yolima Bermúdez', 'password' => Hash::make('Yber2025*'), 'is_active' => true]
        );
        if (!$gerente->hasRole('gerente')) $gerente->assignRole('gerente');

        $sustanciador = User::firstOrCreate(
            ['email' => 'carolina@yber.com'],
            ['name' => 'Carolina Méndez', 'password' => Hash::make('Yber2025*'), 'is_active' => true]
        );
        if (!$sustanciador->hasRole('sustanciador')) $sustanciador->assignRole('sustanciador');

        $dependiente = User::firstOrCreate(
            ['email' => 'andres@yber.com'],
            ['name' => 'Andrés Patiño', 'password' => Hash::make('Yber2025*'), 'is_active' => true]
        );
        if (!$dependiente->hasRole('dependiente')) $dependiente->assignRole('dependiente');

        $asistente = User::firstOrCreate(
            ['email' => 'laura@yber.com'],
            ['name' => 'Laura Castillo', 'password' => Hash::make('Yber2025*'), 'is_active' => true]
        );
        if (!$asistente->hasRole('asistente')) $asistente->assignRole('asistente');

        $negociador = User::firstOrCreate(
            ['email' => 'felipe@yber.com'],
            ['name' => 'Felipe Rodríguez', 'password' => Hash::make('Yber2025*'), 'is_active' => true]
        );
        if (!$negociador->hasRole('negociador')) $negociador->assignRole('negociador');

        $this->command->info('✅ 6 usuarios creados');
        $this->command->table(
            ['Email', 'Nombre', 'Rol', 'Contraseña'],
            [
                ['admin@yber.com', 'Administrador YBER', 'admin', 'YberAdmin2025*'],
                ['yolima@yber.com', 'Dra. Yolima Bermúdez', 'gerente', 'Yber2025*'],
                ['carolina@yber.com', 'Carolina Méndez', 'sustanciador', 'Yber2025*'],
                ['andres@yber.com', 'Andrés Patiño', 'dependiente', 'Yber2025*'],
                ['laura@yber.com', 'Laura Castillo', 'asistente', 'Yber2025*'],
                ['felipe@yber.com', 'Felipe Rodríguez', 'negociador', 'Yber2025*'],
            ]
        );

        // ─── CLIENTES CORPORATIVOS ───
        $this->command->info('');
        $this->command->info('══════════════════════════════════════');
        $this->command->info('🏦 Creando Clientes Corporativos...');
        $this->command->info('══════════════════════════════════════');

        $clientes = [];
        $clientesData = [
            [
                'nombre' => 'Banco Colpatria',
                'nit' => '860034313-1',
                'contacto_nombre' => 'Dr. Mauricio Cárdenas',
                'contacto_email' => 'juridica@colpatria.com.co',
                'plataforma_externa' => 'Cyber',
                'sla_dias_radicacion' => 5,
            ],
            [
                'nombre' => 'Colsubsidio',
                'nit' => '860007336-1',
                'contacto_nombre' => 'Dra. Patricia Gómez',
                'contacto_email' => 'cartera@colsubsidio.com',
                'plataforma_externa' => 'ISC',
                'sla_dias_radicacion' => 7,
            ],
            [
                'nombre' => 'Banco de Bogotá',
                'nit' => '860002964-4',
                'contacto_nombre' => 'Dr. Camilo Restrepo',
                'contacto_email' => 'cobranzas@bancodebogota.com.co',
                'plataforma_externa' => 'AdminInfo',
                'sla_dias_radicacion' => 5,
            ],
            [
                'nombre' => 'Megalínea S.A.',
                'nit' => '830053700-2',
                'contacto_nombre' => 'Ing. Sandra Ruiz',
                'contacto_email' => 'juridica@megalinea.com.co',
                'plataforma_externa' => null,
                'sla_dias_radicacion' => 10,
            ],
        ];

        foreach ($clientesData as $data) {
            $clientes[] = ClienteCorporativo::firstOrCreate(
                ['nit' => $data['nit']],
                $data
            );
        }
        $this->command->info('✅ ' . count($clientes) . ' clientes corporativos');

        // ─── DEUDORES ───
        $this->command->info('');
        $this->command->info('══════════════════════════════════════');
        $this->command->info('👤 Creando Deudores...');
        $this->command->info('══════════════════════════════════════');

        $deudoresData = [
            ['CC', '1019283746', 'Juan Carlos Martínez López', 'jc.martinez@gmail.com', '3101234567', 'Cra 45 #67-89 Apto 301, Bogotá', 'Bogotá', true, 'Vehículo Mazda 3 modelo 2019. Apartamento en Suba.'],
            ['CC', '52839471', 'María Fernanda Rodríguez Castro', 'mfrodriguez@hotmail.com', '3209876543', 'Cll 100 #15-20, Bogotá', 'Bogotá', false, null],
            ['CC', '80123456', 'Pedro Antonio Gómez Vargas', 'pedro.gomez@outlook.com', '3156789012', 'Av 68 #34-12, Bogotá', 'Bogotá', true, 'Casa en Fontibón. 2 vehículos registrados.'],
            ['NIT', '900456789-1', 'Inversiones del Norte S.A.S.', 'contacto@inversionesnorte.co', '6012345678', 'Cll 72 #10-25 Of 501, Bogotá', 'Bogotá', true, 'Equipos industriales y cartera por cobrar.'],
            ['CC', '39876543', 'Ana Lucía Pedraza Moreno', null, '3187654321', 'Cra 7 #45-67, Tunja', 'Tunja', false, null],
            ['CC', '1032987654', 'Diego Alejandro Vargas Suárez', 'dvargas@yahoo.com', '3001122334', 'Cll 13 #4-50, Bogotá', 'Bogotá', true, 'Local comercial en Chapinero.'],
            ['CE', 'E523789', 'Roberto Carlos Ferreira Dos Santos', 'rcferreira@gmail.com', '3224455667', 'Cra 15 #88-12, Bogotá', 'Bogotá', false, null],
            ['CC', '52741896', 'Claudia Patricia Herrera López', 'claudia.h@gmail.com', '3178899001', 'Cll 53 #28-15, Bogotá', 'Bogotá', true, 'Apartamento en Cedritos.'],
            ['CC', '79654321', 'Óscar Mauricio Pineda Torres', null, '3112233445', 'Av Suba #115-30, Bogotá', 'Bogotá', false, null],
            ['NIT', '800987654-3', 'Distribuidora La Estrella Ltda.', 'admin@laestrella.co', '6017654321', 'Zona Industrial Puente Aranda, Bogotá', 'Bogotá', true, 'Bodega propia. Maquinaria industrial.'],
            ['CC', '1098765432', 'Valentina Sánchez Rojas', 'valesanchez@outlook.com', '3205566778', 'Cll 170 #9-40, Bogotá', 'Bogotá', false, null],
            ['CC', '80567890', 'Hernán Darío Castillo Mejía', 'hcastillo@gmail.com', '3149988776', 'Cra 30 #52-18, Bogotá', 'Bogotá', true, 'Terreno en Mosquera. Vehículo Toyota.'],
            ['CC', '39123987', 'Liliana Andrea Morales Ríos', null, '3196677554', 'Cll 80 #70-30, Bogotá', 'Bogotá', false, null],
            ['CC', '1023456789', 'Santiago Felipe Ortiz Duarte', 'sortiz@gmail.com', '3167788990', 'Cra 68D #25-80, Bogotá', 'Bogotá', true, 'Consultorio odontológico propio.'],
            ['CC', '52369147', 'Gloria Esperanza Muñoz Prieto', 'gloriamunoz@hotmail.com', '3138899112', 'Diagonal 50 Sur #28-10, Bogotá', 'Bogotá', false, null],
            ['CC', '79852369', 'Carlos Eduardo Ramírez Pardo', null, '3202233445', 'Cll 127 #20-55, Bogotá', 'Bogotá', true, 'Parqueadero comercial en Usaquén.'],
            ['NIT', '901234567-8', 'Tech Solutions Colombia S.A.S.', 'legal@techsolutions.co', '6019876543', 'Parque 93, Bogotá', 'Bogotá', true, 'Equipos informáticos y propiedad intelectual.'],
            ['CC', '1045678901', 'Camila Andrea Torres Vega', 'camila.torres@gmail.com', '3174455667', 'Av El Dorado #68C-61, Bogotá', 'Bogotá', false, null],
            ['CC', '80741852', 'Fabio Andrés López Niño', null, '3119988776', 'Cll 63 #15-42, Bogotá', 'Bogotá', true, 'Moto BMW R1200. Apartaestudio.'],
            ['CC', '39654123', 'Martha Cecilia Duarte Rojas', 'mduarte@yahoo.com', '3186655443', 'Cra 50 #134-20, Bogotá', 'Bogotá', false, null],
            ['CC', '1087654321', 'Nicolás Esteban Parra Mora', 'neparra@outlook.com', '3153344556', 'Cll 22 #5-80, Bogotá', 'Bogotá', true, 'Finca en La Mesa, Cundinamarca.'],
            ['CC', '52963852', 'Diana Marcela Cruz Acosta', null, '3127766998', 'Tv 42 #18-25, Bogotá', 'Bogotá', false, null],
            ['CC', '79321654', 'Jorge Enrique Beltrán Soto', 'jbeltran@gmail.com', '3198877665', 'Cra 11 #90-20, Bogotá', 'Bogotá', true, 'Local en C.C. Andino. Acciones en bolsa.'],
            ['CC', '1056789123', 'Paola Fernanda Gil Mendoza', 'pfgil@hotmail.com', '3164433221', 'Av Boyacá #70-15, Bogotá', 'Bogotá', false, null],
            ['CC', '80159357', 'Ricardo Andrés Salazar Peña', null, '3141122334', 'Cll 147 #17-60, Bogotá', 'Bogotá', true, 'Bodega en Tocancipá. Camioneta Hilux 2021.'],
        ];

        $deudores = [];
        foreach ($deudoresData as $d) {
            $deudores[] = Deudor::firstOrCreate(
                ['numero_documento' => $d[1]],
                [
                    'tipo_documento' => $d[0],
                    'numero_documento' => $d[1],
                    'nombre_completo' => $d[2],
                    'email' => $d[3],
                    'telefono' => $d[4],
                    'direccion_notificacion' => $d[5],
                    'ciudad' => $d[6],
                    'tiene_bienes' => $d[7],
                    'notas_bienes' => $d[8],
                ]
            );
        }
        $this->command->info('✅ ' . count($deudores) . ' deudores creados');

        // ─── PROCESOS ───
        $this->command->info('');
        $this->command->info('══════════════════════════════════════');
        $this->command->info('⚖️ Creando Procesos Jurídicos...');
        $this->command->info('══════════════════════════════════════');

        $estados = ['recepcion', 'analisis', 'redaccion', 'radicado', 'seguimiento', 'sentencia', 'liquidacion', 'terminado'];
        $etapas = ['calificacion', 'mandamiento', 'notificacion', 'medidas_cautelares', 'sentencia', 'liquidacion', null];
        $juzgados = [
            'Juzgado 001 Civil Municipal de Bogotá',
            'Juzgado 003 Civil Municipal de Bogotá',
            'Juzgado 007 Civil Municipal de Bogotá',
            'Juzgado 012 Civil Municipal de Bogotá',
            'Juzgado 015 Civil Municipal de Bogotá',
            'Juzgado 021 Civil del Circuito de Bogotá',
            'Juzgado 005 Civil del Circuito de Bogotá',
            'Juzgado 002 Civil Municipal de Tunja',
        ];

        $procesosConfig = [
            // [cliente_idx, deudor_idx, estado, cuantia, dias_atras, etapa, juzgado_idx, obligacion]
            [0, 0, 'seguimiento', 15800000, 45, 'mandamiento', 0, 'COL-2025-4521'],
            [0, 1, 'radicado', 8500000, 30, 'calificacion', 1, 'COL-2025-4522'],
            [0, 2, 'redaccion', 32000000, 12, null, null, 'COL-2025-4523'],
            [0, 3, 'seguimiento', 125000000, 60, 'medidas_cautelares', 2, 'COL-2025-4478'],
            [0, 4, 'analisis', 4200000, 5, null, null, 'COL-2025-4590'],
            [1, 5, 'seguimiento', 22000000, 55, 'notificacion', 3, 'CSB-2025-1234'],
            [1, 6, 'radicado', 6800000, 25, 'calificacion', 4, 'CSB-2025-1235'],
            [1, 7, 'sentencia', 18500000, 90, 'sentencia', 5, 'CSB-2025-1180'],
            [1, 8, 'recepcion', 9700000, 2, null, null, 'CSB-2025-1290'],
            [1, 9, 'liquidacion', 45000000, 120, 'liquidacion', 0, 'CSB-2025-1102'],
            [2, 10, 'seguimiento', 11200000, 40, 'mandamiento', 1, 'BDB-2025-7801'],
            [2, 11, 'redaccion', 28000000, 15, null, null, 'BDB-2025-7802'],
            [2, 12, 'radicado', 5400000, 22, 'calificacion', 3, 'BDB-2025-7803'],
            [2, 13, 'seguimiento', 67000000, 75, 'medidas_cautelares', 6, 'BDB-2025-7750'],
            [2, 14, 'terminado', 3800000, 150, null, 4, 'BDB-2025-7680'],
            [2, 15, 'analisis', 19500000, 4, null, null, 'BDB-2025-7850'],
            [3, 16, 'seguimiento', 85000000, 50, 'notificacion', 5, 'MGL-2025-0301'],
            [3, 17, 'radicado', 7200000, 20, 'calificacion', 7, 'MGL-2025-0302'],
            [3, 18, 'redaccion', 14600000, 10, null, null, 'MGL-2025-0303'],
            [3, 19, 'recepcion', 6100000, 1, null, null, 'MGL-2025-0310'],
            [0, 20, 'seguimiento', 42000000, 65, 'mandamiento', 2, 'COL-2025-4450'],
            [0, 21, 'radicado', 9300000, 18, 'calificacion', 0, 'COL-2025-4591'],
            [1, 22, 'redaccion', 16800000, 14, null, null, 'CSB-2025-1280'],
            [2, 23, 'seguimiento', 38500000, 58, 'notificacion', 6, 'BDB-2025-7790'],
            [3, 24, 'analisis', 21000000, 6, null, null, 'MGL-2025-0305'],
            // 5 procesos extra variados
            [0, 5, 'seguimiento', 52000000, 80, 'medidas_cautelares', 1, 'COL-2025-4410'],
            [1, 11, 'terminado', 7500000, 140, null, 3, 'CSB-2025-1050'],
            [2, 0, 'radicado', 19800000, 28, 'calificacion', 5, 'BDB-2025-7810'],
            [0, 15, 'recepcion', 8900000, 3, null, null, 'COL-2025-4595'],
            [3, 7, 'redaccion', 31000000, 11, null, null, 'MGL-2025-0308'],
        ];

        $procesos = [];
        $consecutivo = 1;

        foreach ($procesosConfig as $idx => $cfg) {
            [$cIdx, $dIdx, $estado, $cuantia, $diasAtras, $etapa, $jIdx, $obligacion] = $cfg;

            $fechaIngreso = Carbon::now()->subDays($diasAtras);
            $tipoCuantia = $cuantia < 5000000 ? 'minima' : ($cuantia < 50000000 ? 'menor' : 'mayor');

            $procesoData = [
                'cliente_corporativo_id' => $clientes[$cIdx]->id,
                'deudor_id' => $deudores[$dIdx]->id,
                'numero_obligacion' => $obligacion,
                'cuantia_total' => $cuantia,
                'estado' => $estado,
                'fecha_ingreso' => $fechaIngreso->toDateString(),
                'observaciones' => $this->generarObservacion($estado),
            ];

            // Campos opcionales según estado
            if ($etapa) {
                $procesoData['etapa_procesal'] = $etapa;
            }
            if ($jIdx !== null) {
                $procesoData['juzgado'] = $juzgados[$jIdx];
                $procesoData['radicado_juzgado'] = $this->generarRadicadoJuzgado();
            }
            if (in_array($estado, ['radicado', 'seguimiento', 'sentencia', 'liquidacion', 'terminado'])) {
                $procesoData['fecha_radicacion'] = $fechaIngreso->copy()->addDays(rand(5, 15))->toDateString();
            }
            if (in_array($estado, ['seguimiento', 'sentencia', 'liquidacion'])) {
                $procesoData['fecha_vencimiento_terminos'] = Carbon::now()->addDays(rand(-5, 20))->toDateString();
            }

            // Campos FO-SG-025
            $procesoData['tiene_deceval'] = (bool) rand(0, 1);
            $procesoData['pagare_virtual'] = (bool) rand(0, 1);
            $procesoData['con_escritura'] = $cuantia > 30000000 ? true : (bool) rand(0, 1);

            $proceso = Proceso::create($procesoData);
            $procesos[] = $proceso;

            // Si el radicado interno no se generó automáticamente, asignarlo
            if (empty($proceso->radicado_interno)) {
                $proceso->radicado_interno = 'YBER-' . date('Y') . '-' . str_pad($consecutivo, 4, '0', STR_PAD_LEFT);
                $proceso->save();
            }
            $consecutivo++;
        }

        $this->command->info('✅ ' . count($procesos) . ' procesos creados');

        // Resumen por estado
        $resumen = collect($procesos)->groupBy('estado')->map->count();
        $this->command->table(
            ['Estado', 'Cantidad'],
            $resumen->map(fn($count, $estado) => [$estado, $count])->values()->toArray()
        );

        // ─── ASIGNACIONES ───
        $this->command->info('');
        $this->command->info('══════════════════════════════════════');
        $this->command->info('📋 Creando Asignaciones...');
        $this->command->info('══════════════════════════════════════');

        $asignacionesCount = 0;
        foreach ($procesos as $proceso) {
            // Asignar sustanciador
            if (!in_array($proceso->estado, ['recepcion'])) {
                Asignacion::firstOrCreate([
                    'proceso_id' => $proceso->id,
                    'user_id' => $sustanciador->id,
                    'rol_asignado' => 'sustanciador',
                    'activo' => !in_array($proceso->estado, ['terminado']),
                ], [
                    'fecha_inicio' => $proceso->fecha_ingreso->copy()->addDays(1),
                    'fecha_fin' => $proceso->estado === 'terminado' ? $proceso->fecha_ingreso->copy()->addDays(100) : null,
                ]);
                $asignacionesCount++;
            }

            // Asignar dependiente para procesos radicados+
            if (in_array($proceso->estado, ['radicado', 'seguimiento', 'sentencia', 'liquidacion'])) {
                Asignacion::firstOrCreate([
                    'proceso_id' => $proceso->id,
                    'user_id' => $dependiente->id,
                    'rol_asignado' => 'dependiente',
                    'activo' => true,
                ], [
                    'fecha_inicio' => $proceso->fecha_radicacion ?? $proceso->fecha_ingreso->copy()->addDays(10),
                ]);
                $asignacionesCount++;
            }
        }
        $this->command->info("✅ {$asignacionesCount} asignaciones creadas");

        // ─── ACTUACIONES (BITÁCORA) ───
        $this->command->info('');
        $this->command->info('══════════════════════════════════════');
        $this->command->info('📝 Creando Bitácora de Actuaciones...');
        $this->command->info('══════════════════════════════════════');

        $actuacionesCount = 0;
        $tiposActuacion = [
            'recepcion' => [
                ['email_recibido', 'Caso recibido del cliente', 'Se reciben documentos vía email para análisis y gestión.'],
            ],
            'analisis' => [
                ['email_recibido', 'Caso recibido del cliente', 'Se reciben documentos vía email para análisis y gestión.'],
                ['cambio_estado', 'Caso en análisis', 'Se procede a revisar documentación y viabilidad del proceso.'],
            ],
            'redaccion' => [
                ['email_recibido', 'Caso recibido del cliente', 'Documentos completos, caso viable para demanda.'],
                ['cambio_estado', 'Caso asignado a sustanciador', 'Documentación completa. Se asigna para redacción de demanda.'],
                ['oficio', 'FO-SG-025 diligenciado', 'Orden de gestión firmada por asistente, sustanciador y gerente.'],
            ],
            'radicado' => [
                ['email_recibido', 'Caso recibido del cliente', 'Documentos completos y verificados.'],
                ['cambio_estado', 'Demanda redactada', 'Demanda ejecutiva generada y revisada por gerencia.'],
                ['oficio', 'Demanda radicada en juzgado', 'Se radica demanda ejecutiva. Acta de reparto adjunta.'],
            ],
            'seguimiento' => [
                ['email_recibido', 'Caso recibido del cliente', 'Proceso iniciado.'],
                ['cambio_estado', 'Demanda radicada', 'Radicación exitosa en juzgado.'],
                ['auto', 'Auto admisorio de demanda', 'El juzgado admite la demanda y ordena librar mandamiento de pago.'],
                ['auto', 'Mandamiento de pago librado', 'Se libra mandamiento de pago a favor del demandante.'],
            ],
            'sentencia' => [
                ['email_recibido', 'Caso recibido', 'Proceso completo desde ingesta.'],
                ['auto', 'Sentencia favorable', 'El juzgado dicta sentencia a favor. Se ordena continuar ejecución.'],
            ],
            'liquidacion' => [
                ['email_recibido', 'Caso recibido', 'Proceso en etapa de liquidación.'],
                ['auto', 'Liquidación del crédito aprobada', 'Liquidación de costas y crédito aprobada por el juzgado.'],
            ],
            'terminado' => [
                ['email_recibido', 'Caso recibido', 'Proceso terminado.'],
                ['cambio_estado', 'Proceso terminado', 'Se archiva expediente. Recuperación exitosa.'],
            ],
        ];

        foreach ($procesos as $proceso) {
            $actuaciones = $tiposActuacion[$proceso->estado] ?? [['email_recibido', 'Caso registrado', 'Sin detalles adicionales.']];
            $fechaBase = $proceso->fecha_ingreso;

            foreach ($actuaciones as $i => $act) {
                Actuacion::create([
                    'proceso_id' => $proceso->id,
                    'user_id' => $i === 0 ? $asistente->id : ($i <= 2 ? $sustanciador->id : $dependiente->id),
                    'tipo' => $act[0],
                    'titulo' => $act[1],
                    'descripcion' => $act[2],
                    'fecha_actuacion' => $fechaBase->copy()->addDays($i * rand(2, 7))->toDateString(),
                    'es_automatica' => $act[0] === 'cambio_estado',
                ]);
                $actuacionesCount++;
            }
        }
        $this->command->info("✅ {$actuacionesCount} actuaciones en bitácora");

        // ─── ÓRDENES DE GESTIÓN (FO-SG-025) ───
        $this->command->info('');
        $this->command->info('══════════════════════════════════════');
        $this->command->info('📄 Creando Órdenes de Gestión FO-SG-025...');
        $this->command->info('══════════════════════════════════════');

        $ordenesCount = 0;
        if (Schema::hasTable('ordenes_gestion')) {
            $modelClass = '\\App\\Models\\OrdenGestion';
            if (class_exists($modelClass)) {
                foreach ($procesos as $proceso) {
                    if (in_array($proceso->estado, ['recepcion', 'analisis'])) continue;

                    $firmadoAsistente = $proceso->fecha_ingreso->copy()->addDays(2);
                    $firmadoSust = $proceso->fecha_ingreso->copy()->addDays(3);
                    $firmadoGerente = in_array($proceso->estado, ['redaccion']) && rand(0, 1)
                        ? null
                        : $proceso->fecha_ingreso->copy()->addDays(4);

                    $modelClass::firstOrCreate(
                        ['proceso_id' => $proceso->id],
                        [
                            'instrucciones_especiales' => 'Proceder con demanda ejecutiva según documentación aportada por el cliente.',
                            'observaciones' => $proceso->con_escritura ? 'Proceso con título ejecutivo (escritura pública).' : 'Pagaré como título ejecutivo.',
                            'tiene_deceval' => $proceso->tiene_deceval ?? false,
                            'pagare_virtual' => $proceso->pagare_virtual ?? false,
                            'con_escritura' => $proceso->con_escritura ?? false,
                            'firmado_asistente_id' => $asistente->id,
                            'firmado_asistente_at' => $firmadoAsistente,
                            'firmado_sustanciador_id' => $sustanciador->id,
                            'firmado_sustanciador_at' => $firmadoSust,
                            'firmado_gerente_id' => $firmadoGerente ? $gerente->id : null,
                            'firmado_gerente_at' => $firmadoGerente,
                        ]
                    );
                    $ordenesCount++;
                }
            }
        }
        $this->command->info("✅ {$ordenesCount} órdenes FO-SG-025 creadas");

        // ─── SEGUIMIENTOS JUDICIALES ───
        $this->command->info('');
        $this->command->info('══════════════════════════════════════');
        $this->command->info('📋 Creando Seguimientos Judiciales...');
        $this->command->info('══════════════════════════════════════');

        $segCount = 0;
        if (Schema::hasTable('seguimientos_judiciales')) {
            $modelClass = '\\App\\Models\\SeguimientoJudicial';
            if (class_exists($modelClass)) {
                foreach ($procesos as $proceso) {
                    if (!in_array($proceso->estado, ['seguimiento', 'sentencia', 'liquidacion'])) continue;

                    $tipos = ['auto_admisorio', 'mandamiento_pago', 'auto', 'providencia'];
                    $descripciones = [
                        'Se admite demanda y se ordena librar mandamiento de pago.',
                        'Se libra mandamiento de pago por la suma demandada.',
                        'Auto de trámite. Se ordena notificación al demandado.',
                        'Providencia que ordena continuar con la ejecución.',
                    ];

                    $numSeg = rand(1, 3);
                    for ($s = 0; $s < $numSeg; $s++) {
                        $modelClass::create([
                            'proceso_id' => $proceso->id,
                            'user_id' => $dependiente->id,
                            'tipo_novedad' => $tipos[$s % count($tipos)],
                            'fecha_auto' => $proceso->fecha_radicacion
                                ? Carbon::parse($proceso->fecha_radicacion)->addDays(($s + 1) * rand(5, 15))
                                : Carbon::now()->subDays(rand(5, 30)),
                            'descripcion' => $descripciones[$s % count($descripciones)],
                            'requiere_accion' => $s === 0 && rand(0, 1),
                            'accion_requerida' => $s === 0 ? 'Verificar y radicar oficios correspondientes' : null,
                        ]);
                        $segCount++;
                    }
                }
            }
        }
        $this->command->info("✅ {$segCount} seguimientos judiciales");

        // ─── OFICIOS MEDIDAS CAUTELARES ───
        $this->command->info('');
        $this->command->info('══════════════════════════════════════');
        $this->command->info('🔒 Creando Oficios de Medidas...');
        $this->command->info('══════════════════════════════════════');

        $medCount = 0;
        if (Schema::hasTable('oficios_medidas')) {
            $modelClass = '\\App\\Models\\OficioMedida';
            if (class_exists($modelClass)) {
                foreach ($procesos as $proceso) {
                    if ($proceso->etapa_procesal !== 'medidas_cautelares') continue;

                    $oficios = [
                        ['ORI', 'Oficina de Registro de Instrumentos Públicos', 'Embargo de inmuebles'],
                        ['Banco', 'Banco de la República / Cifin', 'Embargo de cuentas bancarias'],
                        ['Empleador', null, 'Embargo de salario (1/5 parte)'],
                        ['Tránsito', 'Secretaría de Tránsito de Bogotá', 'Embargo de vehículos'],
                    ];

                    $estadosMedida = ['pendiente', 'enviado', 'radicado', 'respondido'];

                    foreach ($oficios as $oi => $oficio) {
                        $estadoOficio = $estadosMedida[min($oi, count($estadosMedida) - 1)];
                        $modelClass::create([
                            'proceso_id' => $proceso->id,
                            'tipo_oficio' => $oficio[0],
                            'destinatario' => $oficio[1] ?? 'Por determinar',
                            'descripcion' => $oficio[2],
                            'estado' => $estadoOficio,
                            'fecha_envio' => $estadoOficio !== 'pendiente' ? Carbon::now()->subDays(rand(5, 20)) : null,
                            'fecha_radicacion' => in_array($estadoOficio, ['radicado', 'respondido']) ? Carbon::now()->subDays(rand(1, 10)) : null,
                            'monto_embargado' => $estadoOficio === 'respondido' ? rand(1, 20) * 500000 : null,
                        ]);
                        $medCount++;
                    }
                }
            }
        }
        $this->command->info("✅ {$medCount} oficios de medidas cautelares");

        // ─── ALERTAS ───
        $this->command->info('');
        $this->command->info('══════════════════════════════════════');
        $this->command->info('🔔 Generando Alertas...');
        $this->command->info('══════════════════════════════════════');

        $alertasCount = 0;
        foreach ($procesos as $proceso) {
            if ($proceso->estado === 'terminado') continue;

            $sla = $clientes[0]->sla_dias_radicacion ?? 5;
            $dias = Carbon::parse($proceso->fecha_ingreso)->diffInDays(now());

            if ($dias > $sla && !in_array($proceso->estado, ['radicado', 'seguimiento', 'sentencia', 'liquidacion'])) {
                Alerta::create([
                    'proceso_id' => $proceso->id,
                    'user_id' => $sustanciador->id,
                    'tipo' => 'vencimiento_sla',
                    'prioridad' => $dias > ($sla + 3) ? 'critica' : 'alta',
                    'titulo' => "SLA excedido: {$proceso->radicado_interno} ({$dias} días)",
                    'mensaje' => "El proceso lleva {$dias} días sin radicar (SLA: {$sla} días).",
                    'fecha_disparo' => now()->toDateString(),
                ]);
                $alertasCount++;
            }
        }

        // Alertas de revisión L/J
        $procesosEnSeg = collect($procesos)->where('estado', 'seguimiento');
        foreach ($procesosEnSeg->take(5) as $proceso) {
            Alerta::create([
                'proceso_id' => $proceso->id,
                'user_id' => $dependiente->id,
                'tipo' => 'revision_auto',
                'prioridad' => 'media',
                'titulo' => "📋 Revisar autos: {$proceso->radicado_interno}",
                'mensaje' => "Revisión programada de autos. Juzgado: {$proceso->juzgado}.",
                'fecha_disparo' => now()->toDateString(),
            ]);
            $alertasCount++;
        }

        $this->command->info("✅ {$alertasCount} alertas generadas");

        // ─── RESUMEN FINAL ───
        $this->command->info('');
        $this->command->info('════════════════════════════════════════════════════════');
        $this->command->info('🎉 DEMO COMPLETO — Resumen de Datos');
        $this->command->info('════════════════════════════════════════════════════════');

        $this->command->table(
            ['Entidad', 'Cantidad'],
            [
                ['Usuarios', User::count()],
                ['Clientes Corporativos', ClienteCorporativo::count()],
                ['Deudores', Deudor::count()],
                ['Procesos', Proceso::count()],
                ['Asignaciones', Asignacion::count()],
                ['Actuaciones (Bitácora)', Actuacion::count()],
                ['Órdenes FO-SG-025', $ordenesCount],
                ['Seguimientos Judiciales', $segCount],
                ['Oficios Medidas', $medCount],
                ['Alertas', Alerta::count()],
            ]
        );

        $this->command->info('');
        $this->command->info('🔑 CREDENCIALES DE ACCESO:');
        $this->command->table(
            ['Rol', 'Email', 'Contraseña'],
            [
                ['Admin', 'admin@yber.com', 'YberAdmin2025*'],
                ['Gerente', 'yolima@yber.com', 'Yber2025*'],
                ['Sustanciador', 'carolina@yber.com', 'Yber2025*'],
                ['Dependiente', 'andres@yber.com', 'Yber2025*'],
                ['Asistente', 'laura@yber.com', 'Yber2025*'],
                ['Negociador', 'felipe@yber.com', 'Yber2025*'],
            ]
        );
        $this->command->info('');
    }

    private function generarObservacion(string $estado): string
    {
        return match ($estado) {
            'recepcion' => 'Caso recibido. Pendiente revisión documental.',
            'analisis' => 'Documentación en revisión. Verificando viabilidad jurídica.',
            'redaccion' => 'En proceso de redacción de demanda ejecutiva.',
            'radicado' => 'Demanda radicada en juzgado. Esperando reparto.',
            'seguimiento' => 'Proceso en trámite judicial. Seguimiento activo.',
            'sentencia' => 'Sentencia emitida. Pendiente liquidación.',
            'liquidacion' => 'En etapa de liquidación de crédito y costas.',
            'terminado' => 'Proceso terminado y archivado.',
            default => 'Sin observaciones.',
        };
    }

    private function generarRadicadoJuzgado(): string
    {
        $ciudad = '11001';
        $despacho = str_pad(rand(1, 99), 2, '0', STR_PAD_LEFT);
        $tipo = '40';
        $year = date('Y');
        $consec = str_pad(rand(1, 99999), 5, '0', STR_PAD_LEFT);
        $parte = '00';
        return "{$ciudad}{$despacho}{$tipo}{$year}{$consec}{$parte}";
    }
}
