import { useState, useEffect, useMemo } from 'react';
import { useForm } from '@inertiajs/react';
import axios from 'axios';
import {
    FormDataGas,
    CupsOption,
    Localidad,
    TarifaGasOption,
    Cliente
} from '../../Interfaces/Interfaces';
import { initialFormDataGas } from '../../Interfaces/constants';
import { useValidateCupsBeforeSave } from '../../hooks/useValidateCupsBeforeSave';
import {
    aplicarValidacionInline,
    programarEnfoqueCampoFormulario,
    construirErroresCamposObligatorios,
    IDS_DOM_CAMPOS_GAS,
} from '../../utils/validacionFormulario';

const CAMPOS_OBLIGATORIOS_GAS = [
    'cupsGas',
    'direccionGas',
    'localidadGas',
    'provinciaGas',
    'tarifaGas',
    'consumoGas',
    'caudal_diario',
    'comercializadora',
    'producto',
    'tipoprecio',
    'fechaInicio',
    'fechaFin',
] as const;

const ETIQUETAS_CAMPOS_GAS: Record<string, string> = {
    cupsGas: 'CUPS Gas',
    direccionGas: 'Dirección Gas',
    localidadGas: 'Localidad',
    provinciaGas: 'Provincia',
    tarifaGas: 'Tarifa Gas',
    consumoGas: 'Consumo (kWh)',
    caudal_diario: 'Caudal Diario',
    comercializadora: 'Comercializadora',
    producto: 'Producto',
    tipoprecio: 'Tipo de Precio',
    fechaInicio: 'Fecha de Inicio',
    fechaFin: 'Fecha de Fin',
};

interface UseCupsGasProps {
    comercializadoras: any[];
    productos: any[];
    anexos: any[];
    cupsData: CupsOption[];
    clienteId?: number | null;
    datos: FormDataGas;
    onChange: (formData: FormDataGas) => void;
    tarifaOptions: TarifaGasOption[];
}

export const useCupsGas = ({
    comercializadoras,
    productos,
    anexos,
    cupsData,
    clienteId,
    datos,
    onChange,
    tarifaOptions
}: UseCupsGasProps) => {
    const { data: formDataGas, setData: setFormDataGas } = useForm<FormDataGas>(initialFormDataGas);

    const [localidadesOptions, setLocalidadesOptions] = useState<Localidad[]>([]);
    const [cupsOptions, setCupsOptions] = useState<CupsOption[]>([]);
    const [productosFiltrados, setProductosFiltrados] = useState<any[]>([]);
    const [anexosFiltrados, setAnexosFiltrados] = useState<any[]>([]);
    const [formErrors, setFormErrors] = useState<{ [key: string]: string }>({});
    const [showErrors, setShowErrors] = useState(false);
    const [showModalPrecios, setShowModalPrecios] = useState(false);

    const currentServicioIntegracion = useMemo(() => {
        const selectedCom = comercializadoras.find((com: any) =>
            com.CodCom == parseInt(formDataGas.comercializadora)
        );
        return selectedCom ? selectedCom.Servicio_Integracion : null;
    }, [formDataGas.comercializadora, comercializadoras]);

    // Initialize data
    useEffect(() => {
        setFormDataGas({
            ...datos,
            cupsGasId: datos.cupsGasId || '',
            cupsGas: datos.cupsGas || '',
            codigoCups: datos.codigoCups || '',
            direccionGas: datos.direccionGas || '',
            escaleraGas: datos.escaleraGas || '',
            localidadGas: datos.localidadGas || '',
            provinciaGas: datos.provinciaGas || '',
            tarifaGas: datos.tarifaGas || '',
            nombreTarifa: datos.nombreTarifa || '',
            corpoGo: datos.corpoGo || '',
            Id_Tarifa_Automatica: datos.Id_Tarifa_Automatica || '',
            consumoGas: datos.consumoGas || '',
            caudal_diario: datos.caudal_diario || '',
            comercializadora: datos.comercializadora || '',
            comercializadoraNombre: datos.comercializadoraNombre || '',
            CodigoServicio: datos.CodigoServicio || '',
            producto: datos.producto || '',
            productoNombre: datos.productoNombre || '',
            anexo: datos.anexo || '',
            anexoNombre: datos.anexoNombre || '',
            tipoprecio: datos.tipoprecio || '',
            comentarioGas: datos.comentarioGas || '',
            fechaInicio: datos.fechaInicio || '',
            fechaFin: datos.fechaFin || '',
            EscPunSum: datos.EscPunSum || '',
            PlaPunSum: datos.PlaPunSum || '',
            PuePunSum: datos.PuePunSum || '',
            codigo_postal: datos.codigo_postal || '',
            GDO: datos.GDO || false,
            permanencia: datos.permanencia || false,
            cambioTitular: datos.cambioTitular || false,
            cambioPotencia: datos.cambioPotencia || false
        });
    }, []);

    // Filter productos by comercializadora
    useEffect(() => {
        if (formDataGas.comercializadora) {
            setProductosFiltrados(
                productos.filter((producto: any) => producto.CodCom == formDataGas.comercializadora)
            );
        } else {
            setProductosFiltrados([]);
            const shouldUpdateFormData =
                formDataGas.producto !== '' ||
                formDataGas.productoNombre !== '' ||
                formDataGas.CodigoServicio !== '' ||
                formDataGas.anexo !== '' ||
                formDataGas.anexoNombre !== '';

            if (shouldUpdateFormData) {
                setFormDataGas(prev => ({
                    ...prev,
                    producto: '',
                    productoNombre: '',
                    CodigoServicio: '',
                    anexo: '',
                    anexoNombre: ''
                }));
            }
        }
    }, [formDataGas.comercializadora, productos]);

    // Filter anexos by producto
    useEffect(() => {
        if (formDataGas.producto) {
            setAnexosFiltrados(
                anexos.filter((anexo: any) => anexo.CodPro == formDataGas.producto)
            );
        } else {
            setAnexosFiltrados([]);
            const shouldUpdateAnexo = formDataGas.anexo !== '' || formDataGas.anexoNombre !== '';
            if (shouldUpdateAnexo) {
                setFormDataGas(prev => ({
                    ...prev,
                    anexo: '',
                    anexoNombre: ''
                }));
            }
        }
    }, [formDataGas.producto, anexos]);

    // Filter CUPS by clienteId
    useEffect(() => {
        if (clienteId && cupsData) {
            const filteredCups = cupsData.filter(cup => cup.CodCli === clienteId);
            setCupsOptions(filteredCups);
        } else {
            setCupsOptions(cupsData || []);
        }
    }, [clienteId, cupsData]);



    const handleBuscarSipsCups = () => {
        const payload: { cups: string; tipo: string; cod_com?: number } = {
            cups: formDataGas.cupsGas,
            tipo: 'gas',
        };
        if (formDataGas.comercializadora) {
            payload.cod_com = parseInt(String(formDataGas.comercializadora), 10);
        }
        axios.post(route('sips.consumo'), payload)
            .then(res => {
                const data = res.data.selectFinal[0];
                if (data) {
                    if (tarifaOptions.length > 0) {
                        const tarifaSeleccionada = tarifaOptions.find(tarifa => tarifa.NomTarGas === data.Tarifa);
                        if (tarifaSeleccionada) {
                            setFormDataGas(prev => ({
                                ...prev,
                                tarifa: tarifaSeleccionada.CodTarGas,
                                nombreTarifa: tarifaSeleccionada.NomTarGas,
                            }));
                        }
                    }
                    setFormDataGas(prev => ({
                        ...prev,
                        tarifaGas: data.CodTarGas,
                        nombreTarifa: data.NomTarGas,
                        consumoGas: data.Consumo_kWh_P1,
                        caudal_diario: data.Caudal_Max_Dia_kWhd
                    }));
                }
            })
            .catch((error) => {
                console.error(error);
            });
    };

       const handleCupsDataChange = (cups: CupsOption | null) => {
        if (cups) {
            if (import.meta.env.DEV) console.log('[useCupsGas] cups seleccionado', cups);
            setFormDataGas(prev => ({
                ...prev,
                cupsGasId: cups.cupsGasId || '',
                cupsGas: cups.codigoCups.substring(0, 20) || '',
                codigoCups: cups.codigoCups.substring(0, 20) || '',
                direccionGas: cups.direccion || '',
                nombreTarifa: cups.nombreTarifa || '',
                tarifaGas: cups.tarifa || '',
                consumoGas: cups.ConAnuCup || '',
                caudal_diario: cups.DerAccKW || '',
                EscPunSum: cups.EscPunSum || '',
                PlaPunSum: cups.PlaPunSum || '',
                PuePunSum: cups.PuePunSum || '',
                // Use locality if found, otherwise fallback
                codigo_postal: cups.codigo_postal || '',
                DesLoc: cups.DesLoc || '',
                DesPro: cups.DesPro || '',
                localidadGas: cups.DesLoc || '',
                provinciaGas: cups.DesPro || '',
            }));
        } else {
            setFormDataGas(prev => ({
                ...prev,
                cupsGasId: '',
                cupsGas: '',
                codigoCups: '',
                direccionGas: '',
                tarifaGas: '',
                nombreTarifa: '',
                consumoGas: '',
                caudal_diario: '',
                codigo_postal: '',
                localidadGas: '',
                provinciaGas: ''
            }));
        }
    };


    const { validateAllCups, showValidationErrorDialog } = useValidateCupsBeforeSave({
        gasRequired: [...CAMPOS_OBLIGATORIOS_GAS],
        fieldLabels: ETIQUETAS_CAMPOS_GAS,
    });

    const saveGasForm = () => {
        const dataToValidate = {
            electrico: [],
            gas: [formDataGas],
        };

        const validationResult = validateAllCups(dataToValidate);

        if (!validationResult.isValid) {
            const errores = construirErroresCamposObligatorios(
                formDataGas as Record<string, unknown>,
                [...CAMPOS_OBLIGATORIOS_GAS],
                ETIQUETAS_CAMPOS_GAS,
            );

            setFormErrors(errores);
            setShowErrors(true);

            const idDomEnfoque = aplicarValidacionInline(
                errores,
                [...CAMPOS_OBLIGATORIOS_GAS],
                IDS_DOM_CAMPOS_GAS,
                { seccionSuministro: 'gas' },
            );

            void showValidationErrorDialog(validationResult).then(() => {
                if (idDomEnfoque) {
                    programarEnfoqueCampoFormulario(idDomEnfoque, 'gas');
                }
            });

            return false;
        }

        setShowErrors(false);
        setFormErrors({});
        onChange(formDataGas);

        return true;
    };

    return {
        formDataGas,
        setFormDataGas,
        localidadesOptions,
        cupsOptions,
        productosFiltrados,
        anexosFiltrados,
        tarifaOptions,
        formErrors,
        showErrors,
        showModalPrecios,
        setShowModalPrecios,
        currentServicioIntegracion,
        handleBuscarSipsCups,
        handleCupsDataChange,
        saveGasForm,
    };
};

