<?php

namespace Database\Seeders;

use App\Models\Client;
use App\Models\Company;
use App\Models\User;
use Illuminate\Database\Seeder;

class ClientSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        // 1. Obtener los IDs de las compañías y de los usuarios Collectors
        $companies = Company::all();

        // Asumiendo que el usuario 'collector' es quien crea al cliente
        $collector = User::role('collector')->first();

        if ($companies->isEmpty() || ! $collector) {
            // Advertencia corregida en el Canvas
            $this->command->warn('Advertencia: No se encontraron compañías o usuarios con rol "collector". Asegúrate de que InitialSetupSeeder se haya ejecutado primero.');

            return;
        }

        // 2. Nueva lista de clientes solicitada
        $clientNames = [
            'Elianis Camargo', 'Daniel Beltran', 'Graciela Bolivar', 'Edgar Visbal',
            'Keilyn Sarmiento', 'Kelly Carbo', 'Juan Natera', 'Glen Villanueva',
            'Cristian Palma', 'Catalina Merino', 'Maria Sierra', 'Maria Escobar',
            'Jhair Villa', 'Betsy Blanco', 'Elsa Galindo', 'Ibeth Monterroza',
            'Cirene Hernandez', 'Alex Barraza', 'Alex Santiago', 'Federico Buelvas',
            'Pedro Villanueva', 'Eduardo Gutierrez', 'Ameth Silvera', 'Vianis Perez',
            'Karen Cantillo',
        ];

        // Mapeamos los nombres a una estructura que incluya una dirección base (asumo Barranquilla por defecto)
        $clientsData = [];
        $baseIdentification = 1000000000; // Cédula base de 10 dígitos
        $basePhone = 3000000000;

        foreach ($clientNames as $index => $name) {
            // Generar identificación única y progresiva
            $identification = (string) ($baseIdentification + $index);

            // Generar teléfono único y progresivo
            $phone = (string) ($basePhone + $index);

            $clientsData[] = [
                'name' => $name,
                'identification' => $identification,
                'email' => strtolower(str_replace(' ', '.', $name)).'@credify.co',
                'phone' => $phone,
                'addresses' => [
                    [
                        'address_line_1' => "Dirección de Prueba #{$index}",
                        'city' => 'Barranquilla',
                        'state' => 'Atlántico',
                        // Lat/Lng de Barranquilla (Plaza de la Paz)
                        'latitude' => 10.9922000 + ($index * 0.001),
                        'longitude' => -74.8093000 + ($index * 0.001),
                        'is_primary' => true,
                        'notes' => 'Datos de cliente de seeder.',
                    ],
                ],
            ];
        }

        // 3. Crear clientes para cada compañía
        foreach ($companies as $company) {
            foreach ($clientsData as $clientData) {

                // **CLAVE**: Aseguramos que la identificación sea única GLOBALMENTE si la DB no está limpia,
                // y única por compañía (por el índice compuesto), añadiendo el ID de la compañía al DNI base.
                $newIdentification = $clientData['identification'].$company->id;

                // Crear el cliente
                $client = Client::firstOrCreate(
                    [
                        'identification' => $newIdentification, // <-- ID único por compañía
                        'company_id' => $company->id,
                    ],
                    [
                        'name' => $clientData['name'],
                        // El email será único para el cliente, usando el ID de la compañía
                        'email' => str_replace('@', $company->id.'@', $clientData['email']),
                        'phone' => $clientData['phone'],
                        'created_by_user_id' => $collector->id, // Asigna al collector de prueba
                        'is_active' => true,
                    ]
                );

                // Crear las direcciones asociadas
                foreach ($clientData['addresses'] as $addressData) {
                    $client->addresses()->firstOrCreate(
                        ['address_line_1' => $addressData['address_line_1']],
                        $addressData
                    );
                }
            }
        }

        $this->command->info('Clientes y direcciones de prueba creados exitosamente para todas las compañías.');
    }
}
