import { useState, useEffect } from 'react';
import {
    getCupsElectricos,
    getCupsGas,
    getLocalidades,
    getClientes,
    getContactos
} from '../../../../services/dataService';
import Swal from 'sweetalert2';
import { Contacto } from '../Interfaces/Interfaces';

interface UseLoadCupsAndLocalidadesReturn {
    cupsElectricos: any[];
    cupsGas: any[];
    localidades: any[];
    clientes: any[];
    contactos: any[];
    isLoading: boolean;
    error: Error | null;
    reload: () => Promise<void>;
}

interface UseLoadCupsAndLocalidadesOptions {
    showErrorAlert?: boolean;
    autoLoad?: boolean;
    loadCupsElectricos?: boolean;
    loadCupsGas?: boolean;
    loadLocalidades?: boolean;
    loadClientes?: boolean;
    loadContactos?: boolean;
    onSuccess?: (data: {
        cupsElectricos: any[],
        cupsGas: any[],
        localidades: any[],
        clientes: any[],
        contactos: any[]
    }) => void;
    onError?: (error: Error) => void;
}

/**
 * Hook reutilizable para cargar CUPS, Localidades, Clientes y Contactos desde la API
 *
 * @param options - Opciones de configuración
 * @returns Datos, estado de carga, error y función de recarga
 *
 * @example
 * ```typescript
 * const { cupsElectricos, cupsGas, localidades, clientes, contactos, isLoading } = useLoadCupsAndLocalidades({
 *     showErrorAlert: true,
 *     autoLoad: true
 * });
 * ```
 */
export const useLoadCupsAndLocalidades = (
    options: UseLoadCupsAndLocalidadesOptions = {}
): UseLoadCupsAndLocalidadesReturn => {
    const {
        showErrorAlert = true,
        autoLoad = true,
        loadCupsElectricos = true,
        loadCupsGas = true,
        loadLocalidades = true,
        loadClientes = true,
        loadContactos = true,
        onSuccess,
        onError
    } = options;

    const [cupsElectricos, setCupsElectricos] = useState<any[]>([]);
    const [cupsGas, setCupsGas] = useState<any[]>([]);
    const [localidades, setLocalidades] = useState<any[]>([]);
    const [clientes, setClientes] = useState<any[]>([]);
    const [contactos, setContactos] = useState<Contacto[]>([]);
    const [isLoading, setIsLoading] = useState(false);
    const [error, setError] = useState<Error | null>(null);

    const loadData = async () => {
        try {
            setIsLoading(true);
            setError(null);

            console.log('🔄 useLoadCupsAndLocalidades: Cargando datos desde API...');

            const emptyResponse = { success: true, data: [], count: 0 };

            // Cargar datos en paralelo para mejor rendimiento (5 requests simultáneos)
            const [responseCupsElec, responseCupsGas, responseLocalidades, responseClientes, responseContactos] = await Promise.all([
                loadCupsElectricos ? getCupsElectricos() : Promise.resolve(emptyResponse),
                loadCupsGas ? getCupsGas() : Promise.resolve(emptyResponse),
                loadLocalidades ? getLocalidades() : Promise.resolve(emptyResponse),
                loadClientes ? getClientes() : Promise.resolve(emptyResponse),
                loadContactos ? getContactos() : Promise.resolve(emptyResponse),
            ]);

            // Validar y asignar CUPS Eléctricos
            if (responseCupsElec.success && Array.isArray(responseCupsElec.data)) {
                setCupsElectricos(responseCupsElec.data);
                console.log(`✅ ${responseCupsElec.count || responseCupsElec.data.length} CUPS eléctricos cargados`);
            } else {
                console.warn('⚠️ Respuesta de CUPS eléctricos no válida');
                setCupsElectricos([]);
            }

            // Validar y asignar CUPS Gas
            if (responseCupsGas.success && Array.isArray(responseCupsGas.data)) {
                setCupsGas(responseCupsGas.data);
                console.log(`✅ ${responseCupsGas.count || responseCupsGas.data.length} CUPS gas cargados`);
            } else {
                console.warn('⚠️ Respuesta de CUPS gas no válida');
                setCupsGas([]);
            }

            // Validar y asignar Localidades
            if (responseLocalidades.success && Array.isArray(responseLocalidades.data)) {
                setLocalidades(responseLocalidades.data);
                console.log(`✅ ${responseLocalidades.count || responseLocalidades.data.length} localidades cargadas`);
            } else {
                console.warn('⚠️ Respuesta de localidades no válida');
                setLocalidades([]);
            }

            // Validar y asignar Clientes
            if (responseClientes.success && Array.isArray(responseClientes.data)) {
                setClientes(responseClientes.data);
                console.log(`✅ ${responseClientes.count || responseClientes.data.length} clientes cargados`);
            } else {
                console.warn('⚠️ Respuesta de clientes no válida');
                setClientes([]);
            }

            // Validar y asignar Contactos
            if (responseContactos.success && Array.isArray(responseContactos.data)) {
                setContactos(responseContactos.data);
                console.log(`✅ ${responseContactos.count || responseContactos.data.length} contactos cargados`);
            } else {
                console.warn('⚠️ Respuesta de contactos no válida');
                setContactos([]);
            }

            // Callback de éxito
            if (onSuccess) {
                onSuccess({
                    cupsElectricos: responseCupsElec.success ? responseCupsElec.data : [],
                    cupsGas: responseCupsGas.success ? responseCupsGas.data : [],
                    localidades: responseLocalidades.success ? responseLocalidades.data : [],
                    clientes: responseClientes.success ? responseClientes.data : [],
                    contactos: responseContactos.success ? responseContactos.data : []
                });
            }

            console.log('✅ useLoadCupsAndLocalidades: Todos los datos cargados exitosamente');

        } catch (err) {
            const error = err instanceof Error ? err : new Error('Error desconocido al cargar datos');
            console.error('❌ useLoadCupsAndLocalidades: Error cargando datos:', error);

            setError(error);
            setCupsElectricos([]);
            setCupsGas([]);
            setLocalidades([]);
            setClientes([]);
            setContactos([]);

            // Callback de error
            if (onError) {
                onError(error);
            }

            // Mostrar alerta si está configurado
            if (showErrorAlert) {
                Swal.fire({
                    title: 'Error al cargar datos',
                    text: 'No se pudieron cargar los datos necesarios. Por favor, recarga la página.',
                    icon: 'error',
                    confirmButtonText: 'Entendido',
                    confirmButtonColor: '#d33'
                });
            }
        } finally {
            setIsLoading(false);
        }
    };

    // Auto-cargar datos al montar el componente si autoLoad es true
    useEffect(() => {
        if (autoLoad) {
            loadData();
        }
    }, [autoLoad]);

    return {
        cupsElectricos,
        cupsGas,
        localidades,
        clientes,
        contactos,
        isLoading,
        error,
        reload: loadData
    };
};

export default useLoadCupsAndLocalidades;

