import { useState, useEffect, useMemo } from 'react';
import { useForm } from '@inertiajs/react';
import axios from 'axios';
import {
    FormDataElectrico,
    CupsOption,
    Localidad,
    TarifaElectricaOption,
    Cliente
} from '../../Interfaces/Interfaces';
import { initialFormDataElectrico } from '../../Interfaces/constants';
import { useValidateCupsBeforeSave } from '../../hooks/useValidateCupsBeforeSave';
import {
    aplicarValidacionInline,
    programarEnfoqueCampoFormulario,
    construirErroresCamposObligatorios,
    IDS_DOM_CAMPOS_ELECTRICO,
} from '../../utils/validacionFormulario';

const CAMPOS_OBLIGATORIOS_ELECTRICO = [
    'cups_electrico',
    'direccion',
    'localidad',
    'provincia',
    'codigo_postal',
    'tarifa',
    'consumo_kw',
    'comercializadora',
    'producto',
    'tipoprecio',
    'fechaInicio',
    'fechaFin',
] as const;

const ETIQUETAS_CAMPOS_ELECTRICO: Record<string, string> = {
    cups_electrico: 'CUPS Eléctrico',
    direccion: 'Dirección',
    localidad: 'Localidad',
    provincia: 'Provincia',
    codigo_postal: 'Código Postal',
    tarifa: 'Tarifa',
    consumo_kw: 'Consumo (kWh)',
    comercializadora: 'Comercializadora',
    producto: 'Producto',
    tipoprecio: 'Tipo de Precio',
    fechaInicio: 'Fecha de Inicio',
    fechaFin: 'Fecha de Fin',
};

interface UseCupsElectricoProps {
    comercializadoras: any[];
    productos: any[];
    anexos: any[];
    cupsData: CupsOption[];
    localidades: Localidad[];
    clientes: Cliente[];
    clienteId?: number | null;
    datos: FormDataElectrico;
    onChange: (formData: FormDataElectrico) => void;
    tarifaOptions: TarifaElectricaOption[];
}

export const useCupsElectrico = ({
    comercializadoras,
    productos,
    anexos,
    cupsData,
    localidades,
    clientes,
    clienteId,
    datos,
    onChange,
    tarifaOptions
}: UseCupsElectricoProps) => {
    const { data: formDataElectrico, setData: setFormDataElectrico } = useForm<FormDataElectrico>(initialFormDataElectrico);

    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(formDataElectrico.comercializadora)
        );
        return selectedCom ? selectedCom.Servicio_Integracion : null;
    }, [formDataElectrico.comercializadora, comercializadoras]);

    // Initialize data
    useEffect(() => {
        setFormDataElectrico({
            ...datos,
            comercializadora: datos.comercializadora || '',
            comercializadoraNombre: datos.comercializadoraNombre || '',
            producto: datos.producto || '',
            productoNombre: datos.productoNombre || '',
            CodigoServicio: datos.CodigoServicio || '',
            anexo: datos.anexo || '',
            anexoNombre: datos.anexoNombre || '',
            tipoprecio: datos.tipoprecio || '',
            cupsId: datos.cupsId || '',
            cups_electrico: datos.cups_electrico || '',
            codigoCups: datos.codigoCups || '',
            direccion: datos.direccion || '',
            EscPunSum: datos.EscPunSum || '',
            PlaPunSum: datos.PlaPunSum || '',
            PuePunSum: datos.PuePunSum || '',
            localidad: datos.localidad || null,
            provincia: datos.provincia || null,
            codigo_postal: datos.codigo_postal || '',
            tarifa: datos.tarifa || '',
            nombreTarifa: datos.nombreTarifa || '',
            corpoGo: datos.corpoGo || '',
            Id_Tarifa_Automatica: datos.Id_Tarifa_Automatica || '',
            consumo_kw: datos.consumo_kw || '',
            potencia1: datos.potencia1 || '',
            potencia2: datos.potencia2 || '',
            potencia3: datos.potencia3 || '',
            potencia4: datos.potencia4 || '',
            potencia5: datos.potencia5 || '',
            potencia6: datos.potencia6 || '',
            comentarios: datos.comentarios || '',
            fechaInicio: datos.fechaInicio || '',
            fechaFin: datos.fechaFin || '',
            GDO: datos.GDO || false,
            permanencia: datos.permanencia || false,
            cambioTitular: datos.cambioTitular || false,
            cambioPotencia: datos.cambioPotencia || false
        });
    }, []);

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

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

    // Filter anexos by producto
    useEffect(() => {
        if (formDataElectrico.producto) {
            setAnexosFiltrados(
                anexos.filter((anexo: any) => anexo.CodPro == formDataElectrico.producto)
            );
        } else {
            setAnexosFiltrados([]);
            const shouldUpdateAnexo = formDataElectrico.anexo !== '' || formDataElectrico.anexoNombre !== '';
            if (shouldUpdateAnexo) {
                setFormDataElectrico(prev => ({
                    ...prev,
                    anexo: '',
                    anexoNombre: ''
                }));
            }
        }
    }, [formDataElectrico.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]);

    useEffect(() => {
         setLocalidadesOptions(localidades || []);
    }, [localidades]);



    const handleBuscarSipsCups = () => {
        const payload: { cups: string; tipo: string; cod_com?: number } = {
            cups: formDataElectrico.cups_electrico,
            tipo: 'luz',
        };
        if (formDataElectrico.comercializadora) {
            payload.cod_com = parseInt(String(formDataElectrico.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.NomTarEle === data.Tarifa);
                        if (tarifaSeleccionada) {
                            setFormDataElectrico(prev => ({
                                ...prev,
                                tarifa: tarifaSeleccionada.CodTarEle,
                                nombreTarifa: tarifaSeleccionada.NomTarEle,
                            }));
                        }
                    }
                    setFormDataElectrico(prev => ({
                        ...prev,
                        potencia1: data.CPotP1M1,
                        potencia2: data.CPotP2M1,
                        potencia3: data.CPotP3M1,
                        potencia4: data.CPotP4M1,
                        potencia5: data.CPotP5M1,
                        potencia6: data.CPotP6M1,
                    }));
                }
            })
            .catch((error) => {
                console.error(error);
            });
    };

    const handleCupsDataChange = (cups: CupsOption | null) => {
        if (cups) {
            if (import.meta.env.DEV) console.log('[useCupsElectrico] cups seleccionado', cups);
            setFormDataElectrico(prev => ({
                ...prev,
                cupsId: cups.cupsId,
                cups_electrico: cups.codigoCups.substring(0, 20),
                codigoCups: cups.codigoCups.substring(0, 20),
                direccion: cups.direccion,
                tarifa: cups.tarifa,
                nombreTarifa: cups.nombreTarifa,
                consumo_kw: cups.ConAnuCup || '0',
                potencia1: cups.PotConP1 || '0',
                potencia2: cups.PotConP2 || '0',
                potencia3: cups.PotConP3 || '0',
                potencia4: cups.PotConP4 || '0',
                potencia5: cups.PotConP5 || '0',
                potencia6: cups.PotConP6 || '0',
                EscPunSum: cups.EscPunSum || '',
                PlaPunSum: cups.PlaPunSum || '',
                PuePunSum: cups.PuePunSum || '',
                // Use locality if found, otherwise fallback to cp
                codigo_postal: cups.codigo_postal || '',
                DesLoc: cups.DesLoc || '',
                DesPro: cups.DesPro || '',
                localidad: cups.localidad || null,
                provincia: cups.provincia || null,

            }));
        } else {
            setFormDataElectrico((prev: any) => ({
                ...prev,
                cupsId: '',
                cups_electrico: '',
                codigoCups: '',
                direccion: '',
                tarifa: '',
                consumo_kw: '',
                potencia1: '',
                potencia2: '',
                potencia3: '',
                potencia4: '',
                potencia5: '',
                potencia6: '',
                EscPunSum: '',
                PlaPunSum: '',
                PuePunSum: '',
                codigo_postal: '',
                localidad: '',
                provincia: '',
                DesLoc: '',
                DesPro: '',
            }));
        }
    };

    const { validateAllCups, showValidationErrorDialog } = useValidateCupsBeforeSave({
        electricoRequired: [...CAMPOS_OBLIGATORIOS_ELECTRICO],
        fieldLabels: ETIQUETAS_CAMPOS_ELECTRICO,
    });

    const saveElectricoForm = () => {
        const dataToValidate = {
            electrico: [formDataElectrico],
            gas: [],
        };

        const validationResult = validateAllCups(dataToValidate);

        if (!validationResult.isValid) {
            const errores = construirErroresCamposObligatorios(
                formDataElectrico as Record<string, unknown>,
                [...CAMPOS_OBLIGATORIOS_ELECTRICO],
                ETIQUETAS_CAMPOS_ELECTRICO,
            );

            setFormErrors(errores);
            setShowErrors(true);

            const idDomEnfoque = aplicarValidacionInline(
                errores,
                [...CAMPOS_OBLIGATORIOS_ELECTRICO],
                IDS_DOM_CAMPOS_ELECTRICO,
                { seccionSuministro: 'electrico' },
            );

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

            return false;
        }

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

        return true;
    };

    return {
        formDataElectrico,
        setFormDataElectrico,
        localidadesOptions,
        cupsOptions,
        productosFiltrados,
        anexosFiltrados,
        tarifaOptions,
        formErrors,
        showErrors,
        showModalPrecios,
        setShowModalPrecios,
        currentServicioIntegracion,
        handleBuscarSipsCups,
        handleCupsDataChange,
        saveElectricoForm,
    };
};

