import { useState } from 'react';
import { FormDataElectrico, CupsOption, Localidad } from '../../Interfaces/Interfaces';
import { initialFormDataElectrico } from '../../Interfaces/constants';
import { calcularFechaFinContratoDesdeInicio } from '../../utils/fechaContratoUtils';

interface UseCupsElectricosManagementProps {
    dataElectrico: FormDataElectrico[];
    setData: (key: string, value: any) => void;
    localidades: Localidad[];
    productos: any[];
    actualizarOpcionesCupsPorFila: () => void;
    isDatosComunes?: boolean;
}

export const useCupsElectricosManagement = ({
    dataElectrico,
    setData,
    localidades,
    productos,
    actualizarOpcionesCupsPorFila,
    isDatosComunes = false
}: UseCupsElectricosManagementProps) => {
    const [formDataElectrico, setFormDataElectrico] = useState<FormDataElectrico>({} as FormDataElectrico);
    const [isModalOpenElectrico, setIsModalOpenElectrico] = useState(false);
    const [index, setIndex] = useState(-1);

    const handleShowCupsElectricosModal = () => {
        let newElectricoRow = {
            ...initialFormDataElectrico,
            cupsId: `temp_electrico_${Date.now()}`,
            tempId: `row_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`
        };

        // Si hay datos comunes activos y existe al menos un CUPS eléctrico, heredar datos del último
        if (isDatosComunes && dataElectrico.length > 0) {
            const lastRow = dataElectrico[0]; // El último insertado está en la posición 0
            newElectricoRow = {
                ...newElectricoRow,
                comercializadora: lastRow.comercializadora || '',
                comercializadoraNombre: lastRow.comercializadoraNombre || '',
                codigoServicioProducto: lastRow.codigoServicioProducto || '',
                producto: lastRow.producto || '',
                productoNombre: lastRow.productoNombre || '',
                anexo: lastRow.anexo || '',
                anexoNombre: lastRow.anexoNombre || '',
                fechaInicio: lastRow.fechaInicio || '',
                fechaFin: lastRow.fechaFin || '',
                tipoprecio: lastRow.tipoprecio || '',
                corpoGo: lastRow.corpoGo || '',
                GDO: lastRow.GDO || '',
                Id_Tarifa_Automatica: lastRow.Id_Tarifa_Automatica || '',
            };
        }

        setData("electrico", [newElectricoRow, ...dataElectrico]);
    };

    const handleCloseElectricCupsModal = () => {
        setIsModalOpenElectrico(false);
        setFormDataElectrico({} as FormDataElectrico);
        setIndex(-1);
    };

    const handleEditElectrico = (editIndex: number) => {
        handleOpenEditElectricCupsModal(editIndex);
    };

    const handleOpenEditElectricCupsModal = (editIndex: number) => {
        setIndex(editIndex);
        const registro = dataElectrico[editIndex];

        const formDataCompleto = {
            ...initialFormDataElectrico,
            ...registro,
            cupsId: registro.cupsId || '',
            cups_electrico: registro.cups_electrico || '',
            direccion: registro.direccion || '',
            EscPunSum: registro.EscPunSum || '0',
            PlaPunSum: registro.PlaPunSum || '0',
            PuePunSum: registro.PuePunSum || '0',
            localidad: registro.localidad || '',
            provincia: registro.provincia || '',
            codigo_postal: registro.codigo_postal || '',
            tarifa: registro.tarifa || '',
            nombreTarifa: registro.nombreTarifa || '',
            corpoGo: registro.corpoGo || '',
            Id_Tarifa_Automatica: registro.Id_Tarifa_Automatica || '',
            consumo_kw: registro.consumo_kw || '0',
            potencia1: registro.potencia1 || '0',
            potencia2: registro.potencia2 || '0',
            potencia3: registro.potencia3 || '0',
            potencia4: registro.potencia4 || '0',
            potencia5: registro.potencia5 || '0',
            potencia6: registro.potencia6 || '0',
            comercializadora: registro.comercializadora || '',
            comercializadoraNombre: registro.comercializadoraNombre || '',
            codigoServicioProducto: registro.codigoServicioProducto || '',
            producto: registro.producto || '',
            productoNombre: registro.productoNombre || '',
            anexo: registro.anexo || '',
            anexoNombre: registro.anexoNombre || '',
            fechaInicio: registro.fechaInicio || '',
            fechaFin: registro.fechaFin || '',
            tipoprecio: registro.tipoprecio || '',
            comentarios: registro.comentarios || '',
        };

        setFormDataElectrico(formDataCompleto);
        setIsModalOpenElectrico(true);
    };

    const handleChangeElectrico = (formData: FormDataElectrico, editIndex?: number) => {
        const targetIndex = editIndex !== undefined ? editIndex : index;

        if (targetIndex >= 0 && targetIndex < dataElectrico.length) {
            const updatedElectrico = [...dataElectrico];
            // Preserve tempId if it exists
            const tempId = (updatedElectrico[targetIndex] as any).tempId;
            updatedElectrico[targetIndex] = { ...formData, ...(tempId ? { tempId } : {}) };
            setData("electrico", updatedElectrico);
        } else {
            const existingIndex = dataElectrico.findIndex(item => item.cupsId === formData.cupsId);
            if (existingIndex >= 0) {
                const updatedElectrico = [...dataElectrico];
                const tempId = (updatedElectrico[existingIndex] as any).tempId;
                updatedElectrico[existingIndex] = { ...formData, ...(tempId ? { tempId } : {}) };
                setData("electrico", updatedElectrico);
            } else {
                setData("electrico", [...dataElectrico, { ...formData }]);
            }
        }

        setIsModalOpenElectrico(false);
        setIndex(-1);
    };

    const handleCupsTableChange = (cups: CupsOption | null, rowIndex: number) => {
        if (cups) {
            const updatedElectrico = [...dataElectrico];
            const currentRow = updatedElectrico[rowIndex] as any;
            const datosComerciales = {
                comercializadora: updatedElectrico[rowIndex].comercializadora || '',
                comercializadoraNombre: updatedElectrico[rowIndex].comercializadoraNombre || '',
                codigoServicioProducto: updatedElectrico[rowIndex].codigoServicioProducto || '',
                producto: updatedElectrico[rowIndex].producto || '',
                productoNombre: updatedElectrico[rowIndex].productoNombre || '',
                anexo: updatedElectrico[rowIndex].anexo || '',
                anexoNombre: updatedElectrico[rowIndex].anexoNombre || '',
                fechaInicio: updatedElectrico[rowIndex].fechaInicio || '',
                fechaFin: updatedElectrico[rowIndex].fechaFin || '',
                tipoprecio: updatedElectrico[rowIndex].tipoprecio || '',
                comentarios: updatedElectrico[rowIndex].comentarios || '',
            };

            updatedElectrico[rowIndex] = {
                ...updatedElectrico[rowIndex],
                ...datosComerciales,
                cupsId: cups.cupsId,
                cups_electrico: cups.codigoCups,
                codigoCups: cups.codigoCups,
                direccion: cups.direccion,
                tarifa: cups.tarifa,
                nombreTarifa: cups.nombreTarifa,
                consumo_kw: cups.ConAnuCup,
                potencia1: cups.PotConP1 || '',
                potencia2: cups.PotConP2 || '',
                potencia3: cups.PotConP3 || '',
                potencia4: cups.PotConP4 || '',
                potencia5: cups.PotConP5 || '',
                potencia6: cups.PotConP6 || '',
                EscPunSum: cups.EscPunSum || '',
                PlaPunSum: cups.PlaPunSum || '',
                PuePunSum: cups.PuePunSum || '',
                codigo_postal: cups.CPLocSoc || '',
                corpoGo: cups.corpoGo || '',
                // Preserve tempId
                ...(currentRow.tempId ? { tempId: currentRow.tempId } : {})
            };

            if (cups.CPLocSoc) {
                const localidad = localidades.find(loc => loc.CPLoc === cups.CPLocSoc);
                if (localidad) {
                    updatedElectrico[rowIndex] = {
                        ...updatedElectrico[rowIndex],
                        localidad: localidad.DesLoc,
                        provincia: localidad.provincia?.DesPro || ''
                    };
                }
            }
            setData("electrico", updatedElectrico);

            if (rowIndex >= 0) {
                setFormDataElectrico(prev => ({
                    ...prev,
                    cupsId: cups.cupsId,
                    cups_electrico: cups.codigoCups,
                    codigoCups: cups.codigoCups,
                    direccion: cups.direccion,
                    tarifa: cups.tarifa,
                    nombreTarifa: cups.nombreTarifa,
                    consumo_kw: cups.ConAnuCup,
                }));
            }

            setTimeout(() => actualizarOpcionesCupsPorFila(), 100);
        }
    };

    const handleProductoTableChange = (event: React.ChangeEvent<HTMLSelectElement>, rowIndex: number, isDatosComunes: boolean) => {
        const nuevoProducto = event.target.value;
        const seleccionado = productos.find((registro: any) => registro.CodPro == nuevoProducto);
        let updatedElectrico = [...dataElectrico];
        console.log("producto", seleccionado);

        if (isDatosComunes) {
            updatedElectrico = updatedElectrico.map(row => ({
                ...row,
                producto: nuevoProducto,
                codigoServicioProducto: seleccionado ? seleccionado.CodigoServicio : '',
                productoNombre: seleccionado ? seleccionado.DesPro : '',
                anexo: '',
                anexoNombre: '',
                corpoGo: ''
            }));
            setFormDataElectrico(prev => ({
                ...prev,
                producto: nuevoProducto,
                codigoServicioProducto: seleccionado ? seleccionado.CodigoServicio : '',
                productoNombre: seleccionado ? seleccionado.DesPro : '',
                anexo: '',
                anexoNombre: '',
                corpoGo: ''
            }));
        } else {
            if (seleccionado) {
                updatedElectrico[rowIndex] = {
                    ...updatedElectrico[rowIndex],
                    producto: nuevoProducto,
                    codigoServicioProducto: seleccionado.CodigoServicio,
                    productoNombre: seleccionado.DesPro,
                    anexo: '',
                    anexoNombre: '',
                    corpoGo: ''
                };
                setFormDataElectrico(prev => ({
                    ...prev,
                    producto: nuevoProducto,
                    codigoServicioProducto: seleccionado.CodigoServicio,
                    productoNombre: seleccionado.DesPro,
                    anexo: '',
                    anexoNombre: '',
                    corpoGo: ''
                }));
            } else {
                updatedElectrico[rowIndex] = {
                    ...updatedElectrico[rowIndex],
                    producto: '',
                    codigoServicioProducto: '',
                    productoNombre: '',
                    anexo: '',
                    anexoNombre: ''
                };
                setFormDataElectrico(prev => ({
                    ...prev,
                    producto: '',
                    codigoServicioProducto: '',
                    productoNombre: '',
                    anexo: '',
                    anexoNombre: '',
                    corpoGo: ''
                }));
            }
        }
        setData("electrico", updatedElectrico);
    };

    const handleAnexoTableChange = (event: React.ChangeEvent<HTMLSelectElement>, rowIndex: number, isDatosComunes: boolean) => {
        const selectedValue = event.target.value;
        const selectedIndex = event.target.selectedIndex;
        const selectedText = selectedIndex !== -1 ? event.target.options[selectedIndex].text : '';
        let updatedElectrico = [...dataElectrico];

        if (isDatosComunes) {
            updatedElectrico = updatedElectrico.map(row => ({
                ...row,
                anexo: selectedValue,
                anexoNombre: selectedText
            }));
            setFormDataElectrico(prev => ({
                ...prev,
                anexo: selectedValue,
                anexoNombre: selectedText
            }));
        } else {
            updatedElectrico[rowIndex] = {
                ...updatedElectrico[rowIndex],
                anexo: selectedValue,
                anexoNombre: selectedText,
            };
            setFormDataElectrico(prev => ({
                ...prev,
                anexo: selectedValue,
                anexoNombre: selectedText,
            }));
        }
        setData("electrico", updatedElectrico);
    };

    const handleElectricoFieldChange = (rowIndex: number, field: string, value: string, isDatosComunes: boolean) => {
        let updatedElectrico = [...dataElectrico];

        if (field === 'fechaInicio') {
            const fechaFin = calcularFechaFinContratoDesdeInicio(value);
            if (isDatosComunes) {
                updatedElectrico = updatedElectrico.map((row) => ({
                    ...row,
                    fechaInicio: value,
                    fechaFin,
                }));
                setFormDataElectrico((prev) => ({ ...prev, fechaInicio: value, fechaFin }));
            } else {
                updatedElectrico[rowIndex] = {
                    ...updatedElectrico[rowIndex],
                    fechaInicio: value,
                    fechaFin,
                };
                setFormDataElectrico((prev) => ({ ...prev, fechaInicio: value, fechaFin }));
            }
            setData('electrico', updatedElectrico);
            return;
        }

        if (isDatosComunes && ['comercializadora', 'producto', 'anexo', 'fechaInicio', 'fechaFin', 'corpoGo', 'GDO', 'tipoprecio'].includes(field)) {
            updatedElectrico = updatedElectrico.map(row => ({
                ...row,
                [field]: value,
                ...(field === 'comercializadora' ? { producto: '', productoNombre: '', codigoServicioProducto: '', anexo: '', anexoNombre: '', corpoGo: '' } : {}),
                ...(field === 'producto' ? { anexo: '', anexoNombre: '', corpoGo: '' } : {}),
            }));
            setFormDataElectrico(prev => ({ ...prev, [field]: value }));
        } else {
            if (field === 'comercializadora') {
                updatedElectrico[rowIndex] = {
                    ...updatedElectrico[rowIndex],
                    [field]: value,
                    producto: '',
                    productoNombre: '',
                    codigoServicioProducto: '',
                    anexo: '',
                    anexoNombre: '',
                    corpoGo: ''
                };
                setFormDataElectrico(prev => ({
                    ...prev,
                    comercializadora: value,
                    producto: '',
                    productoNombre: '',
                    codigoServicioProducto: '',
                    anexo: '',
                    anexoNombre: '',
                    corpoGo: ''
                }));
            } else {
                updatedElectrico[rowIndex] = {
                    ...updatedElectrico[rowIndex],
                    [field]: value
                };
                setFormDataElectrico(prev => ({
                    ...prev,
                    [field]: value
                }));
            }
        }
        setData("electrico", updatedElectrico);
    };

    const handleDeleteElectricoRow = (rowIndex: number) => {
        const updatedElectrico = dataElectrico.filter((_, i) => i !== rowIndex);
        setData("electrico", updatedElectrico);

        setFormDataElectrico(prev => ({
            ...prev,
            cupsId: '',
            cups_electrico: '',
            direccion: '',
            tarifa: '',
            nombreTarifa: '',
            consumo_kw: '',
        }));

        setTimeout(() => actualizarOpcionesCupsPorFila(), 100);
    };

    const handleClearCupsElectrico = (rowIndex: number) => {
        const updatedElectrico = [...dataElectrico];
        updatedElectrico[rowIndex] = {
            ...updatedElectrico[rowIndex],
            cupsId: '',
            cups_electrico: '',
            codigoCups: '',
            direccion: '',
            tarifa: '',
            nombreTarifa: '',
            consumo_kw: '',
            potencia1: '',
            potencia2: '',
            potencia3: '',
            potencia4: '',
            potencia5: '',
            potencia6: '',
            localidad: '',
            provincia: '',
            codigo_postal: '',
            EscPunSum: '0',
            PlaPunSum: '0',
            PuePunSum: '0',
            corpoGo: '',
            Id_Tarifa_Automatica: ''
        };
        setData("electrico", updatedElectrico);
        setTimeout(() => actualizarOpcionesCupsPorFila(), 100);
    };

    return {
        formDataElectrico,
        setFormDataElectrico,
        isModalOpenElectrico,
        setIsModalOpenElectrico,
        index,
        setIndex,
        handleShowCupsElectricosModal,
        handleCloseElectricCupsModal,
        handleEditElectrico,
        handleOpenEditElectricCupsModal,
        handleChangeElectrico,
        handleCupsTableChange,
        handleProductoTableChange,
        handleAnexoTableChange,
        handleElectricoFieldChange,
        handleDeleteElectricoRow,
        handleClearCupsElectrico
    };
};

