<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\Models\User;
use App\Models\Company;
use App\Models\Project;
use App\Models\Ticket;
use Illuminate\Support\Facades\Hash;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     */
    public function run(): void
    {
        // Crear empresas
        $empresaABC = Company::create([
            'name' => 'Empresa ABC S.A.',
            'contact_email' => 'contacto@empresaabc.com',
            'contact_phone' => '+502 2345-6789',
            'address' => 'Zona 10, Ciudad de Guatemala',
            'is_active' => true,
        ]);

        $empresaXYZ = Company::create([
            'name' => 'Comercial XYZ',
            'contact_email' => 'info@comercialxyz.com',
            'contact_phone' => '+502 3456-7890',
            'address' => 'Zona 9, Guatemala',
            'is_active' => true,
        ]);

        $empresaRU = Company::create([
            'name' => 'Restaurantes Unidos S.A.',
            'contact_email' => 'tech@restaurantes.com',
            'contact_phone' => '+502 4567-8901',
            'address' => 'Zona 4, Mixco',
            'is_active' => true,
        ]);

        // Crear usuarios internos (sin empresa)
        $admin = User::create([
            'name' => 'Administrador',
            'email' => 'admin@ticketera.com',
            'password' => Hash::make('password123'),
            'role' => 'administrador',
            'is_active' => true,
        ]);

        $supervisor = User::create([
            'name' => 'Supervisor Principal',
            'email' => 'supervisor@ticketera.com',
            'password' => Hash::make('password123'),
            'role' => 'supervisor',
            'is_active' => true,
        ]);

        $ingeniero1 = User::create([
            'name' => 'Carlos Ramírez',
            'email' => 'carlos@ticketera.com',
            'password' => Hash::make('password123'),
            'role' => 'ingeniero',
            'is_active' => true,
        ]);

        $ingeniero2 = User::create([
            'name' => 'Ana López',
            'email' => 'ana@ticketera.com',
            'password' => Hash::make('password123'),
            'role' => 'ingeniero',
            'is_active' => true,
        ]);

        $responsable1 = User::create([
            'name' => 'Juan Pérez',
            'email' => 'juan@ticketera.com',
            'password' => Hash::make('password123'),
            'role' => 'responsable',
            'is_active' => true,
        ]);

        $responsable2 = User::create([
            'name' => 'María García',
            'email' => 'maria@ticketera.com',
            'password' => Hash::make('password123'),
            'role' => 'responsable',
            'is_active' => true,
        ]);

        // Crear proyectos con asignación automática
        $proyecto1 = Project::create([
            'name' => 'Sitio Web Corporativo',
            'description' => 'Desarrollo y mantenimiento del sitio web principal',
            'company_id' => $empresaABC->id,
            'client_name' => 'Empresa ABC S.A.',
            'client_email' => 'contacto@empresaabc.com',
            'status' => 'activo',
            'start_date' => now()->subMonths(6),
            'default_technician_id' => $responsable1->id,
            'default_supervisor_id' => $ingeniero1->id,
            'auto_assign' => true, // Asignación automática activada
            'sla_baja' => 72,      // 3 días
            'sla_media' => 48,     // 2 días
            'sla_alta' => 24,      // 1 día
            'sla_critica' => 4,    // 4 horas
        ]);

        $proyecto2 = Project::create([
            'name' => 'Sistema de Inventario',
            'description' => 'Sistema de gestión de inventario y almacén',
            'company_id' => $empresaXYZ->id,
            'client_name' => 'Comercial XYZ',
            'client_email' => 'info@comercialxyz.com',
            'status' => 'activo',
            'start_date' => now()->subMonths(3),
            'default_technician_id' => $responsable2->id,
            'default_supervisor_id' => $ingeniero2->id,
            'auto_assign' => true,
            'sla_baja' => 96,      // 4 días
            'sla_media' => 48,     // 2 días
            'sla_alta' => 12,      // 12 horas
            'sla_critica' => 2,    // 2 horas
        ]);

        $proyecto3 = Project::create([
            'name' => 'App Móvil Delivery',
            'description' => 'Aplicación móvil para servicio de delivery',
            'company_id' => $empresaRU->id,
            'client_name' => 'Restaurantes Unidos',
            'client_email' => 'tech@restaurantes.com',
            'status' => 'activo',
            'start_date' => now()->subMonth(),
            'default_technician_id' => $responsable2->id,
            'default_supervisor_id' => $supervisor->id,
            'auto_assign' => true,
            'sla_baja' => 48,      // 2 días
            'sla_media' => 24,     // 1 día
            'sla_alta' => 8,       // 8 horas
            'sla_critica' => 1,    // 1 hora (crítico)
        ]);

        // Crear clientes asignados a empresas y proyectos
        $cliente1 = User::create([
            'name' => 'Carlos López',
            'email' => 'carlos@cliente.com',
            'password' => Hash::make('password123'),
            'role' => 'solicitante',
            'company_id' => $empresaABC->id,
            'project_id' => $proyecto1->id,
            'is_active' => true,
        ]);

        $cliente2 = User::create([
            'name' => 'Ana Martínez',
            'email' => 'ana@cliente.com',
            'password' => Hash::make('password123'),
            'role' => 'solicitante',
            'company_id' => $empresaXYZ->id,
            'project_id' => $proyecto2->id,
            'is_active' => true,
        ]);

        $cliente3 = User::create([
            'name' => 'Roberto Fernández',
            'email' => 'roberto@cliente.com',
            'password' => Hash::make('password123'),
            'role' => 'solicitante',
            'company_id' => $empresaRU->id,
            'project_id' => $proyecto3->id,
            'is_active' => true,
        ]);

        // Crear tickets de prueba
        $tickets = [
            [
                'title' => 'Error en el formulario de contacto',
                'description' => 'El formulario de contacto no está enviando los correos correctamente. Los usuarios reportan que no reciben confirmación.',
                'priority' => 'alta',
                'status' => 'abierto',
                'project_id' => $proyecto1->id,
                'requester_id' => $cliente1->id,
                'assigned_to' => $responsable1->id,
                'due_date' => now()->addDays(3),
            ],
            [
                'title' => 'Actualización de diseño en homepage',
                'description' => 'Se requiere actualizar el banner principal y modificar la sección de servicios según el nuevo branding.',
                'priority' => 'media',
                'status' => 'en_progreso',
                'project_id' => $proyecto1->id,
                'requester_id' => $cliente1->id,
                'assigned_to' => $responsable2->id,
                'due_date' => now()->addWeek(),
            ],
            [
                'title' => 'Problema con el cálculo de stock',
                'description' => 'El sistema está mostrando stock negativo en algunos productos. Revisar el módulo de entradas y salidas.',
                'priority' => 'critica',
                'status' => 'abierto',
                'project_id' => $proyecto2->id,
                'requester_id' => $cliente2->id,
                'assigned_to' => $responsable1->id,
                'due_date' => now()->addDay(),
            ],
            [
                'title' => 'Agregar reporte de ventas mensual',
                'description' => 'Crear un nuevo reporte que muestre las ventas agrupadas por mes con gráficos comparativos.',
                'priority' => 'baja',
                'status' => 'abierto',
                'project_id' => $proyecto2->id,
                'requester_id' => $cliente2->id,
                'assigned_to' => null,
                'due_date' => now()->addWeeks(2),
            ],
            [
                'title' => 'Integración con pasarela de pago',
                'description' => 'Implementar la integración con la pasarela de pago Stripe para procesar pagos en la app.',
                'priority' => 'alta',
                'status' => 'en_progreso',
                'project_id' => $proyecto3->id,
                'requester_id' => $cliente1->id,
                'assigned_to' => $responsable2->id,
                'due_date' => now()->addDays(5),
            ],
            [
                'title' => 'Bug en notificaciones push',
                'description' => 'Las notificaciones push no se están enviando correctamente a dispositivos iOS.',
                'priority' => 'alta',
                'status' => 'resuelto',
                'project_id' => $proyecto3->id,
                'requester_id' => $cliente2->id,
                'assigned_to' => $responsable1->id,
                'due_date' => now()->subDays(2),
                'resolved_at' => now()->subDay(),
            ],
            [
                'title' => 'Optimización de velocidad de carga',
                'description' => 'El sitio web tarda más de 5 segundos en cargar. Se requiere optimización de imágenes y código.',
                'priority' => 'media',
                'status' => 'cerrado',
                'project_id' => $proyecto1->id,
                'requester_id' => $cliente1->id,
                'assigned_to' => $responsable2->id,
                'due_date' => now()->subWeek(),
                'resolved_at' => now()->subDays(3),
                'closed_at' => now()->subDays(2),
            ],
        ];

        foreach ($tickets as $ticketData) {
            Ticket::create($ticketData);
        }

        // ===== ASIGNAR PROYECTOS A TÉCNICOS E INGENIEROS =====
        // Ingeniero 1 tiene acceso a Empresa ABC
        $ingeniero1->projects()->attach([$proyecto1->id]);
        
        // Ingeniero 2 tiene acceso a Empresa XYZ
        $ingeniero2->projects()->attach([$proyecto2->id]);
        
        // Técnico 1 tiene acceso a Empresa ABC y Restaurantes Unidos
        $responsable1->projects()->attach([$proyecto1->id, $proyecto3->id]);
        
        // Técnico 2 tiene acceso a todos los proyectos (técnico multiproyecto)
        $responsable2->projects()->attach([$proyecto1->id, $proyecto2->id, $proyecto3->id]);
        
        // Supervisor tiene acceso a todos los proyectos (supervisión general)
        $supervisor->projects()->attach([$proyecto1->id, $proyecto2->id, $proyecto3->id]);

        $this->command->info('✓ Base de datos poblada exitosamente');
        $this->command->info('');
        $this->command->info('=== EMPRESAS ===');
        $this->command->info('- Empresa ABC S.A. (con asignación automática)');
        $this->command->info('- Comercial XYZ (con asignación automática)');
        $this->command->info('- Restaurantes Unidos S.A. (con asignación automática)');
        $this->command->info('');
        $this->command->info('=== USUARIOS INTERNOS ===');
        $this->command->info('- Admin: admin@ticketera.com / password123');
        $this->command->info('- Supervisor: supervisor@ticketera.com / password123 (Acceso a TODOS)');
        $this->command->info('- Ingeniero Carlos: carlos@ticketera.com / password123 (Solo Empresa ABC)');
        $this->command->info('- Ingeniero Ana: ana@ticketera.com / password123 (Solo Comercial XYZ)');
        $this->command->info('- Técnico Juan: juan@ticketera.com / password123 (ABC + Restaurantes)');
        $this->command->info('- Técnico María: maria@ticketera.com / password123 (TODOS los proyectos)');
        $this->command->info('');
        $this->command->info('=== CLIENTES ===');
        $this->command->info('- Carlos López: carlos@cliente.com / password123 (Empresa ABC - Sitio Web)');
        $this->command->info('- Ana Martínez: ana@cliente.com / password123 (Comercial XYZ - Inventario)');
        $this->command->info('- Roberto Fernández: roberto@cliente.com / password123 (Restaurantes Unidos - App Móvil)');
        $this->command->info('');
        $this->command->info('=== CONTROL DE ACCESO ===');
        $this->command->info('✓ Cada técnico/ingeniero solo verá tickets de sus proyectos asignados');
        $this->command->info('✓ Use el botón "Asignar" en la lista de usuarios para modificar asignaciones');
    }
}
