import React, { useEffect, useMemo, useState } from 'react';
import { Button, Col, Form, Modal, Row, Spinner } from 'react-bootstrap';
import Swal from 'sweetalert2';
import FormDateInputEs from '../../../../Components/Common/FormDateInputEs';
import { todayLocalYmd } from '../../../../utils/serverCalendarDate';
import { ESTADOS_CONTRATO } from '../../../../interfaces';
import {
    AnexoOption,
    ComercializadoraActivacion,
    CupsActivacion,
    FormularioActivacion,
    FormularioContratoRapido,
    ProductoOption,
    TarifaElectricaOption,
    TarifaGasOption,
    TipoPrecioOption,
    TIPO_ELECTRICO,
    comercializadoraNombre,
    periodosTarifa,
    potenciasDesde,
    textoValor,
} from '../types';
import TarifaPotenciasConsumo from './TarifaPotenciasConsumo';
import SipsActivacionPanel, { DatosSipsAplicables } from './SipsActivacionPanel';

interface Props {
    show: boolean;
    cups: CupsActivacion;
    comercializadoraBusqueda: ComercializadoraActivacion | null;
    comercializadoras: ComercializadoraActivacion[];
    productos: ProductoOption[];
    anexos: AnexoOption[];
    tiposPrecio: TipoPrecioOption[];
    tarifasElectricas: TarifaElectricaOption[];
    tarifasGas: TarifaGasOption[];
    guardando: boolean;
    onHide: () => void;
    onGenerar: (form: FormularioContratoRapido, periodos: number) => Promise<boolean>;
}

function dentroDeUnAnio(ymd: string): string {
    const [y, m, d] = ymd.split('-').map(Number);
    const fecha = new Date(y + 1, m - 1, d, 12);
    fecha.setDate(fecha.getDate() - 1);
    return `${fecha.getFullYear()}-${String(fecha.getMonth() + 1).padStart(2, '0')}-${String(fecha.getDate()).padStart(2, '0')}`;
}

function formularioInicial(cups: CupsActivacion, codCom: number | null): FormularioContratoRapido {
    const hoy = todayLocalYmd();
    return {
        CodTar: textoValor(cups.CodTar),
        CodPro: '',
        FecActCUPs: hoy,
        FecVenCUPs: dentroDeUnAnio(hoy),
        ConCup: textoValor(cups.ConCup),
        EstConCups: '1',
        ...potenciasDesde(cups.potencias),
        CodCom: textoValor(codCom),
        CodAnePro: '',
        TipPre: '',
        CorpoGo: '',
        comentarios: '',
    };
}

const CAMPOS_PASO_1: Array<[keyof FormularioContratoRapido, string]> = [
    ['CodTar', 'Tarifa'],
    ['CodCom', 'Comercializadora'],
    ['CodPro', 'Producto'],
    ['TipPre', 'Tipo de precio'],
];

const CAMPOS_PASO_2: Array<[keyof FormularioContratoRapido, string]> = [
    ['FecActCUPs', 'Fecha de activación'],
    ['FecVenCUPs', 'Fecha de vencimiento'],
    ['EstConCups', 'Estado'],
];

const ContratoRapidoModal: React.FC<Props> = ({
    show,
    cups,
    comercializadoraBusqueda,
    comercializadoras,
    productos,
    anexos,
    tiposPrecio,
    tarifasElectricas,
    tarifasGas,
    guardando,
    onHide,
    onGenerar,
}) => {
    const [paso, setPaso] = useState<1 | 2>(1);
    const [form, setForm] = useState<FormularioContratoRapido>(() => formularioInicial(cups, comercializadoraBusqueda?.CodCom ?? null));

    useEffect(() => {
        if (show) {
            setPaso(1);
            setForm(formularioInicial(cups, comercializadoraBusqueda?.CodCom ?? null));
        }
    }, [show, cups, comercializadoraBusqueda]);

    const electrico = cups.TipCups === TIPO_ELECTRICO;
    const productosFiltrados = useMemo(
        () => productos.filter((p) => String(p.CodCom) === form.CodCom),
        [productos, form.CodCom],
    );
    const anexosFiltrados = useMemo(
        () => anexos.filter((a) => String(a.CodPro) === form.CodPro),
        [anexos, form.CodPro],
    );
    const comercializadoraSips = comercializadoras.find((c) => String(c.CodCom) === form.CodCom) ?? comercializadoraBusqueda;

    const cambiar = (campo: keyof FormularioContratoRapido, valor: string) => {
        setForm((actual) => {
            const siguiente = { ...actual, [campo]: valor };
            if (campo === 'CodCom') {
                siguiente.CodPro = '';
                siguiente.CodAnePro = '';
            }
            if (campo === 'CodPro') {
                siguiente.CodAnePro = '';
            }
            return siguiente;
        });
    };

    const aplicarSips = ({ consumo, potencias }: DatosSipsAplicables) => {
        setForm((actual) => ({
            ...actual,
            ...potencias,
            ConCup: consumo === null ? actual.ConCup : String(consumo),
        }));
    };

    const faltantes = (campos: Array<[keyof FormularioContratoRapido, string]>) =>
        campos.filter(([campo]) => String(form[campo] ?? '').trim() === '').map(([, etiqueta]) => etiqueta);

    const validar = async (campos: Array<[keyof FormularioContratoRapido, string]>): Promise<boolean> => {
        const pendientes = faltantes(campos);
        if (pendientes.length === 0) {
            return true;
        }
        await Swal.fire({ icon: 'warning', title: 'Validación', text: `Complete: ${pendientes.join(', ')}.` });
        return false;
    };

    const siguiente = async () => {
        if (await validar(CAMPOS_PASO_1)) {
            setPaso(2);
        }
    };

    const generar = async () => {
        if (!(await validar(CAMPOS_PASO_2))) {
            return;
        }
        if (form.FecVenCUPs < form.FecActCUPs) {
            await Swal.fire({ icon: 'warning', title: 'Validación', text: 'La fecha de vencimiento no puede ser anterior a la de activación.' });
            return;
        }
        const periodos = electrico ? periodosTarifa(tarifasElectricas, form.CodTar) : 0;
        if (await onGenerar(form, periodos)) {
            onHide();
        }
    };

    return (
        <Modal show={show} onHide={onHide} size="xl" centered scrollable backdrop="static">
            <Modal.Header closeButton>
                <Modal.Title as="h2" className="h5">
                    Contrato rápido <span className="text-muted fw-normal ms-2">Paso {paso} de 2</span>
                </Modal.Title>
            </Modal.Header>
            <Modal.Body>
                {paso === 1 ? (
                    <div className="d-grid gap-3">
                        <Row className="g-3">
                            <Col md={5}>
                                <Form.Label className="fw-semibold">Razón social</Form.Label>
                                <Form.Control size="sm" readOnly value={cups.RazSocCli ?? ''} />
                            </Col>
                            <Col md={3}>
                                <Form.Label className="fw-semibold">NIF</Form.Label>
                                <Form.Control size="sm" readOnly value={cups.NumCifCli ?? ''} />
                            </Col>
                            <Col md={4}>
                                <Form.Label className="fw-semibold">CUPS</Form.Label>
                                <Form.Control size="sm" readOnly value={cups.CUPs} />
                            </Col>
                            <Col xs={12}>
                                <Form.Label className="fw-semibold">Dirección de suministro</Form.Label>
                                <Form.Control size="sm" readOnly value={cups.direccion ?? ''} />
                            </Col>
                        </Row>

                        <SipsActivacionPanel
                            cups={cups.CUPs}
                            tipCups={cups.TipCups}
                            comercializadora={comercializadoraSips}
                            onAplicar={aplicarSips}
                        />

                        <TarifaPotenciasConsumo
                            prefijoId="contrato-rapido"
                            tipCups={cups.TipCups}
                            form={form}
                            tarifasElectricas={tarifasElectricas}
                            tarifasGas={tarifasGas}
                            onChange={(campo: keyof FormularioActivacion, valor) => cambiar(campo, valor)}
                        />

                        <Row className="g-3">
                            <Col md={3}>
                                <Form.Label htmlFor="contrato-rapido-com" className="fw-semibold">Comercializadora</Form.Label>
                                <Form.Select id="contrato-rapido-com" size="sm" value={form.CodCom} onChange={(e) => cambiar('CodCom', e.target.value)}>
                                    <option value="">Seleccione una comercializadora</option>
                                    {comercializadoras.map((c) => (
                                        <option key={c.CodCom} value={c.CodCom}>{comercializadoraNombre(c)}</option>
                                    ))}
                                </Form.Select>
                            </Col>
                            <Col md={3}>
                                <Form.Label htmlFor="contrato-rapido-producto" className="fw-semibold">Producto</Form.Label>
                                <Form.Select id="contrato-rapido-producto" size="sm" value={form.CodPro} onChange={(e) => cambiar('CodPro', e.target.value)}>
                                    <option value="">Seleccione un producto</option>
                                    {productosFiltrados.map((p) => (
                                        <option key={p.CodPro} value={p.CodPro}>{p.DesPro}</option>
                                    ))}
                                </Form.Select>
                            </Col>
                            <Col md={2}>
                                <Form.Label htmlFor="contrato-rapido-anexo" className="fw-semibold">Anexo</Form.Label>
                                <Form.Select id="contrato-rapido-anexo" size="sm" value={form.CodAnePro} onChange={(e) => cambiar('CodAnePro', e.target.value)}>
                                    <option value="">Sin anexo</option>
                                    {anexosFiltrados.map((a) => (
                                        <option key={a.CodAnePro} value={a.CodAnePro}>{a.DesAnePro}</option>
                                    ))}
                                </Form.Select>
                            </Col>
                            <Col md={2}>
                                <Form.Label htmlFor="contrato-rapido-tipo-precio" className="fw-semibold">Tipo precio</Form.Label>
                                <Form.Select id="contrato-rapido-tipo-precio" size="sm" value={form.TipPre} onChange={(e) => cambiar('TipPre', e.target.value)}>
                                    <option value="">Seleccione</option>
                                    {tiposPrecio.map((t) => (
                                        <option key={t.id} value={t.id}>{t.descripcion}</option>
                                    ))}
                                </Form.Select>
                            </Col>
                            <Col md={2}>
                                <Form.Label htmlFor="contrato-rapido-corpogo" className="fw-semibold">Gasto operativo (c€/kWh)</Form.Label>
                                <Form.Control id="contrato-rapido-corpogo" size="sm" inputMode="decimal" value={form.CorpoGo} onChange={(e) => cambiar('CorpoGo', e.target.value)} />
                            </Col>
                            <Col xs={12}>
                                <Form.Label htmlFor="contrato-rapido-comentarios" className="fw-semibold">Comentarios</Form.Label>
                                <Form.Control
                                    id="contrato-rapido-comentarios"
                                    as="textarea"
                                    rows={2}
                                    maxLength={1000}
                                    value={form.comentarios}
                                    onChange={(e) => cambiar('comentarios', e.target.value)}
                                />
                            </Col>
                        </Row>
                    </div>
                ) : (
                    <Row className="g-3">
                        <Col md={4}>
                            <Form.Label htmlFor="contrato-rapido-activacion" className="fw-semibold">Fecha activación</Form.Label>
                            <FormDateInputEs id="contrato-rapido-activacion" bsSize="sm" value={form.FecActCUPs} onChange={(v) => cambiar('FecActCUPs', v)} />
                        </Col>
                        <Col md={4}>
                            <Form.Label htmlFor="contrato-rapido-vencimiento" className="fw-semibold">Fecha vencimiento</Form.Label>
                            <FormDateInputEs id="contrato-rapido-vencimiento" bsSize="sm" value={form.FecVenCUPs} onChange={(v) => cambiar('FecVenCUPs', v)} />
                        </Col>
                        <Col md={4}>
                            <Form.Label htmlFor="contrato-rapido-estado" className="fw-semibold">Estado</Form.Label>
                            <Form.Select id="contrato-rapido-estado" size="sm" value={form.EstConCups} onChange={(e) => cambiar('EstConCups', e.target.value)}>
                                {ESTADOS_CONTRATO.map((estado) => (
                                    <option key={estado.key} value={estado.key}>{estado.valor}</option>
                                ))}
                            </Form.Select>
                        </Col>
                    </Row>
                )}
            </Modal.Body>
            <Modal.Footer>
                {paso === 2 && (
                    <Button variant="light" onClick={() => setPaso(1)} disabled={guardando}>Atrás</Button>
                )}
                {paso === 1 ? (
                    <Button variant="dark" onClick={siguiente}>Siguiente</Button>
                ) : (
                    <Button variant="dark" onClick={generar} disabled={guardando}>
                        {guardando && <Spinner size="sm" animation="border" className="me-1" />}
                        Generar contrato
                    </Button>
                )}
            </Modal.Footer>
        </Modal>
    );
};

export default ContratoRapidoModal;
