import React, { forwardRef, useImperativeHandle } from 'react';
import { MessageSquare, Settings2 } from 'lucide-react';
import { Col, Form, Row } from 'react-bootstrap';
import { CupsGasSectionProps } from '../Interfaces/Interfaces';
import { useCupsGas } from './hooks';
import {
    DatosComerciales,
    OpcionesAdicionalesToggles,
    SeccionDatosTecnicosGas,
    SeccionDireccion,
    SeccionFechasVentana,
    SubseccionFormulario,
    TarjetaSuministro,
} from './components';
import ModalPrecios from '../ModalPrecios';
import { calcularFechaFinContratoDesdeInicio } from '../utils/fechaContratoUtils';
import { buildVentanaRowPatch } from '../ComponentesComunes/ventanaPreciosUtils';
import { ServiciosContratoFormSection } from '../ComponentesComunes/ServiciosContratoFields';
import type { ServicioContratoKey } from '../ComponentesComunes/serviciosContratoConfig';

const CupsGasSectionUnipunto = forwardRef<any, CupsGasSectionProps>(
    ({ comercializadoras, productos, anexos, tipoprecio, datos, clienteId, cupsData, localidades, onChange, onEliminar, tarifasGas = [] }, ref) => {
        const {
            formDataGas,
            setFormDataGas,
            cupsOptions,
            productosFiltrados,
            anexosFiltrados,
            tarifaOptions,
            formErrors,
            showErrors,
            showModalPrecios,
            setShowModalPrecios,
            currentServicioIntegracion,
            handleBuscarSipsCups,
            handleCupsDataChange,
            saveGasForm,
        } = useCupsGas({
            comercializadoras,
            productos,
            anexos,
            cupsData,
            clienteId,
            datos,
            onChange,
            tarifaOptions: tarifasGas,
        });

        useImperativeHandle(ref, () => ({
            saveGasForm,
        }));

        const handleComercializadoraChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
            const nuevaComercializadora = event.target.value;
            const selectedText = event.target.options[event.target.selectedIndex].text;

            setFormDataGas((prev) => ({
                ...prev,
                comercializadora: nuevaComercializadora,
                comercializadoraNombre: selectedText,
                producto: '',
                productoNombre: '',
                CodigoServicio: '',
                anexo: '',
                anexoNombre: '',
            }));
        };

        const handleProductoChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
            const nuevoProducto = event.target.value;
            const seleccionado: any = productosFiltrados.find(
                (registro: any) => registro.CodPro == nuevoProducto,
            );

            if (seleccionado) {
                setFormDataGas((prev) => ({
                    ...prev,
                    producto: nuevoProducto,
                    productoNombre: seleccionado.DesPro,
                    CodigoServicio: seleccionado.CodigoServicio,
                    codigoServicioProducto: seleccionado.CodigoServicio,
                    anexo: '',
                    anexoNombre: '',
                }));
            }
        };

        const handleAnexoChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
            const nuevoAnexo = event.target.value;
            const seleccionado: any = anexosFiltrados.find(
                (registro: any) => registro.CodAnePro == nuevoAnexo,
            );

            if (seleccionado) {
                setFormDataGas((prev) => ({
                    ...prev,
                    anexo: nuevoAnexo,
                    anexoNombre: seleccionado.DesAnePro,
                }));
            }
        };

        const handleTarifaChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
            const nuevaTarifa = event.target.value;
            const seleccionada: any = tarifaOptions.find(
                (registro: any) => registro.CodTarGas == nuevaTarifa,
            );

            if (seleccionada) {
                setFormDataGas((prev) => ({
                    ...prev,
                    tarifaGas: nuevaTarifa,
                    nombreTarifa: seleccionada.NomTarGas,
                }));
            }
        };

        const opcionesAdicionales = [
            {
                id: 'GDO_gas',
                etiqueta: 'GDO (Garantía de Origen Verde)',
                checked: !!formDataGas.GDO,
                onChange: (checked: boolean) =>
                    setFormDataGas((prev) => ({ ...prev, GDO: checked })),
            },
            {
                id: 'permanencia_gas',
                etiqueta: 'Permanencia',
                checked: !!formDataGas.permanencia,
                onChange: (checked: boolean) =>
                    setFormDataGas((prev) => ({ ...prev, permanencia: checked })),
            },
            {
                id: 'cambioTitular_gas',
                etiqueta: 'Cambio Titular',
                checked: !!formDataGas.cambioTitular,
                onChange: (checked: boolean) =>
                    setFormDataGas((prev) => ({ ...prev, cambioTitular: checked })),
            },
            {
                id: 'cambioPotencia_gas',
                etiqueta: 'Cambio Potencia',
                checked: !!formDataGas.cambioPotencia,
                onChange: (checked: boolean) =>
                    setFormDataGas((prev) => ({ ...prev, cambioPotencia: checked })),
            },
        ];

        return (
            <TarjetaSuministro
                tipo="gas"
                titulo="Información del Contrato de Gas - Uni Cliente Uni Punto"
                onEliminar={onEliminar}
                etiquetaEliminar="De Click aquí para Borrar CUPS Gas"
            >
                <DatosComerciales
                    prefijoId="gas"
                    comercializadora={formDataGas.comercializadora}
                    producto={formDataGas.producto}
                    anexo={formDataGas.anexo}
                    tipoprecio={formDataGas.tipoprecio}
                    comercializadoras={comercializadoras}
                    productosFiltrados={productosFiltrados}
                    anexosFiltrados={anexosFiltrados}
                    tipoprecios={tipoprecio}
                    showErrors={showErrors}
                    formErrors={formErrors}
                    onComercializadoraChange={handleComercializadoraChange}
                    onProductoChange={handleProductoChange}
                    onAnexoChange={handleAnexoChange}
                    onTipoPrecioChange={(value) =>
                        setFormDataGas((prev) => ({ ...prev, tipoprecio: value }))
                    }
                />

                <SeccionDatosTecnicosGas
                    formData={formDataGas}
                    cupsOptions={cupsOptions}
                    tarifaOptions={tarifaOptions}
                    formErrors={formErrors}
                    showErrors={showErrors}
                    onCupsChange={handleCupsDataChange}
                    onTarifaChange={handleTarifaChange}
                    onCorpoGoChange={(valor) =>
                        setFormDataGas((prev) => ({ ...prev, corpoGo: valor }))
                    }
                    onBuscarSips={handleBuscarSipsCups}
                />

                <SubseccionFormulario titulo="Vigencia" icono={<Settings2 size={16} aria-hidden />}>
                    <SeccionFechasVentana
                        prefijoId="gas"
                        ventana={formDataGas.Id_Tarifa_Automatica || ''}
                        fechaInicio={formDataGas.fechaInicio || ''}
                        fechaFin={formDataGas.fechaFin || ''}
                        ventanaBloqueada={!!formDataGas.Id_Tarifa_Automatica}
                        onAbrirModalPrecios={() => setShowModalPrecios(true)}
                        onCambiarFechaInicio={(iso) =>
                            setFormDataGas((prev) => ({
                                ...prev,
                                fechaInicio: iso,
                                fechaFin: calcularFechaFinContratoDesdeInicio(iso),
                            }))
                        }
                        onCambiarFechaFin={(iso) =>
                            setFormDataGas((prev) => ({ ...prev, fechaFin: iso }))
                        }
                        errores={{
                            ventana: formErrors.Id_Tarifa_Automatica,
                            fechaInicio: formErrors.fechaInicio,
                            fechaFin: formErrors.fechaFin,
                        }}
                        mostrarErrores={showErrors}
                    />
                </SubseccionFormulario>

                <SubseccionFormulario
                    titulo="Opciones Adicionales"
                    icono={<Settings2 size={16} aria-hidden />}
                >
                    <OpcionesAdicionalesToggles opciones={opcionesAdicionales} />
                </SubseccionFormulario>

                <SeccionDireccion
                    prefijoId="gas"
                    datos={{
                        direccion: formDataGas.direccionGas || '',
                        escalera: formDataGas.EscPunSum,
                        planta: formDataGas.PlaPunSum,
                        puerta: formDataGas.PuePunSum,
                        codigoPostal: formDataGas.codigo_postal || '',
                        localidad: formDataGas.DesLoc || formDataGas.localidadGas || '',
                        provincia: formDataGas.DesPro || formDataGas.provinciaGas || '',
                    }}
                    mostrarErrores={showErrors}
                    errores={{
                        direccion: formErrors.direccionGas,
                        localidad: formErrors.localidadGas,
                        provincia: formErrors.provinciaGas,
                        codigoPostal: formErrors.codigo_postal,
                    }}
                />

                <ServiciosContratoFormSection
                    values={formDataGas}
                    idPrefix="gas"
                    onChange={(key: ServicioContratoKey, checked) =>
                        setFormDataGas((prev) => ({ ...prev, [key]: checked }))
                    }
                />

                <SubseccionFormulario
                    titulo="Comentarios"
                    icono={<MessageSquare size={16} aria-hidden />}
                >
                    <Row className="g-3">
                        <Col lg={12}>
                            <Form.Label htmlFor="comentarioGas" className="form-label fw-medium">
                                Comentarios
                            </Form.Label>
                            <Form.Control
                                as="textarea"
                                rows={3}
                                id="comentarioGas"
                                size="sm"
                                value={formDataGas.comentarioGas || ''}
                                onChange={(e) =>
                                    setFormDataGas((prev) => ({
                                        ...prev,
                                        comentarioGas: e.target.value,
                                    }))
                                }
                            />
                        </Col>
                    </Row>
                </SubseccionFormulario>

                {showModalPrecios && (
                    <ModalPrecios
                        show={showModalPrecios}
                        onClose={() => setShowModalPrecios(false)}
                        onSelect={(selection) => {
                            setFormDataGas((prev) => ({
                                ...prev,
                                ...buildVentanaRowPatch(selection),
                            }));
                            setTimeout(() => setShowModalPrecios(false), 50);
                        }}
                        rowData={{
                            comercializadora: formDataGas.comercializadora,
                            producto: formDataGas.producto,
                            anexo: formDataGas.anexo,
                            codigoServicioProducto: formDataGas.codigoServicioProducto,
                            tipoprecio: formDataGas.tipoprecio,
                            nombreTarifa: formDataGas.nombreTarifa,
                        }}
                        tipo="gas"
                        comercializadoraData={{
                            Servicio_Integracion: currentServicioIntegracion,
                        }}
                    />
                )}
            </TarjetaSuministro>
        );
    },
);

export default CupsGasSectionUnipunto;
