import { useState, useEffect } from 'react';
import { CupsOption, FormDataElectrico, FormDataGas, Cliente } from '../../Interfaces/Interfaces';
import {
    calcularCupsElectricosDisponiblesPorFila,
    calcularCupsGasDisponiblesPorFila,
    filtrarCupsElectricosPorCliente,
    filtrarCupsGasPorCliente,
} from '../../Shared/cupsDisponiblesPorFila';
import { obtenerClaveFilaElectrico, obtenerClaveFilaGas } from '../../Shared/cupsRowKeys';

interface UseCupsAntiDuplicadosProps {
    dataElectrico: FormDataElectrico[];
    dataGas: FormDataGas[];
    selectedCliente: Cliente[];
    cupsElectricos: any[];
    cupsGas: any[];
}

export const useCupsAntiDuplicados = ({
    dataElectrico,
    dataGas,
    selectedCliente,
    cupsElectricos,
    cupsGas
}: UseCupsAntiDuplicadosProps) => {
    const [cupsOptionsPorFila, setCupsOptionsPorFila] = useState<{ [key: string]: CupsOption[] }>({});
    const [cupsGasOptionsPorFila, setCupsGasOptionsPorFila] = useState<{ [key: string]: any[] }>({});
    const [filteredCupsElectricos, setFilteredCupsElectricos] = useState<CupsOption[]>([]);
    const [filteredCupsGas, setFilteredCupsGas] = useState<any[]>([]);

    const codCli = selectedCliente.length > 0 ? selectedCliente[0].CodCli : undefined;

    // Filtrar CUPS por cliente seleccionado
    useEffect(() => {
        setFilteredCupsElectricos(filtrarCupsElectricosPorCliente(cupsElectricos, codCli));
        setFilteredCupsGas(filtrarCupsGasPorCliente(cupsGas, codCli));
    }, [selectedCliente, cupsElectricos, cupsGas, codCli]);

    // Actualizar opciones de CUPS por fila (anti-duplicados)
    const actualizarOpcionesCupsPorFila = () => {
        const cupsBaseElectrico = filtrarCupsElectricosPorCliente(cupsElectricos, codCli);
        const cupsBaseGas = filtrarCupsGasPorCliente(cupsGas, codCli);

        const nuevasOpcionesElectricas: { [key: string]: CupsOption[] } = {};
        dataElectrico.forEach((row, rowIndex) => {
            const rowId = obtenerClaveFilaElectrico(row, rowIndex);
            nuevasOpcionesElectricas[rowId] = calcularCupsElectricosDisponiblesPorFila(
                dataElectrico,
                dataGas,
                rowIndex,
                cupsBaseElectrico,
            );
        });
        setCupsOptionsPorFila(nuevasOpcionesElectricas);

        const nuevasOpcionesGas: { [key: string]: any[] } = {};
        dataGas.forEach((row, rowIndex) => {
            const rowId = obtenerClaveFilaGas(row, rowIndex);
            nuevasOpcionesGas[rowId] = calcularCupsGasDisponiblesPorFila(
                dataElectrico,
                dataGas,
                rowIndex,
                cupsBaseGas,
            );
        });
        setCupsGasOptionsPorFila(nuevasOpcionesGas);
    };

    useEffect(() => {
        actualizarOpcionesCupsPorFila();
    }, [dataElectrico, dataGas, selectedCliente, cupsElectricos, cupsGas]);

    return {
        cupsOptionsPorFila,
        cupsGasOptionsPorFila,
        filteredCupsElectricos,
        filteredCupsGas,
        actualizarOpcionesCupsPorFila
    };
};
