import React from 'react';
import { Alert, Button, Spinner } from 'react-bootstrap';
import Swal from 'sweetalert2';
import { Can } from '../../../../Components/Auth/Can';
import { useSipsConsulta } from '../../Sips/hooks/useSipsConsulta';
import { SipsResumenLecturas, SipsTablaConsumo } from '../../Sips/components/shared/SipsConsumoResults';
import { isElectricityTipo, isGasTipo, isLuzResponse, SipsResponse, toNumber } from '../../Sips/types';
import { ComercializadoraActivacion, comercializadoraNombre, Potencias, TIPO_ELECTRICO } from '../types';

export interface DatosSipsAplicables {
    consumo: number | null;
    potencias: Potencias;
}

interface Props {
    cups: string;
    tipCups: number;
    comercializadora: ComercializadoraActivacion | null;
    onAplicar?: (datos: DatosSipsAplicables) => void;
}

function datosAplicables(result: SipsResponse): DatosSipsAplicables {
    const consumo = isLuzResponse(result) ? result.lecturas.LastTotalYearkWh : result.lecturas.kWhAnual;
    const suministro = result.suministros?.[0];
    const potencias: Potencias = {};

    if (suministro && isLuzResponse(result)) {
        for (let p = 1; p <= 6; p++) {
            const valor = suministro[`Pot_Cont_P${p}`];
            if (valor !== undefined && valor !== null && String(valor) !== '') {
                potencias[`PotEleConP${p}` as keyof Potencias] = String(valor);
            }
        }
    }

    return { consumo: consumo === undefined ? null : toNumber(consumo), potencias };
}

const SipsActivacionPanel: React.FC<Props> = ({ cups, tipCups, comercializadora, onAplicar }) => {
    const { consultar, isSubmitting, errorMessage, warningMessage, result } = useSipsConsulta();
    const provider = comercializadora?.sips_provider ?? null;
    const tipo = provider?.tipo_servicio_options.find((opcion) => (
        tipCups === TIPO_ELECTRICO ? isElectricityTipo(opcion.value) : isGasTipo(opcion.value)
    ))?.value;

    const lanzarConsulta = async () => {
        if (!comercializadora) {
            await Swal.fire({ icon: 'warning', title: 'SIPS', text: 'No hay comercializadora para consultar SIPS.' });
            return;
        }

        if (!provider || !tipo) {
            await Swal.fire({
                icon: 'warning',
                title: 'SIPS',
                text: `${comercializadoraNombre(comercializadora)} no tiene API SIPS para este tipo de suministro.`,
            });
            return;
        }

        await consultar({ codCom: comercializadora.CodCom, cups, tipo });
    };

    return (
        <div className="border rounded p-3 bg-light-subtle">
            <div className="d-flex flex-wrap align-items-center gap-2 mb-2">
                <h3 className="h6 mb-0 me-auto">
                    Consulta SIPS
                    {provider && <span className="text-muted fw-normal ms-2">({provider.label})</span>}
                </h3>
                {result && onAplicar && !result.sin_datos && (
                    <Button size="sm" variant="outline-primary" onClick={() => onAplicar(datosAplicables(result))}>
                        <i className="ri-download-2-line me-1" aria-hidden />
                        Usar datos SIPS
                    </Button>
                )}
                <Can permission="sips.query">
                    <Button size="sm" variant="dark" disabled={isSubmitting} onClick={lanzarConsulta}>
                        {isSubmitting ? <Spinner size="sm" animation="border" className="me-1" /> : <i className="ri-search-line me-1" aria-hidden />}
                        Consultar SIPS
                    </Button>
                </Can>
            </div>

            {errorMessage && <Alert variant="danger" className="py-2 mb-2">{errorMessage}</Alert>}
            {warningMessage && <Alert variant="warning" className="py-2 mb-2">{warningMessage}</Alert>}

            {result && !result.sin_datos && (
                <div className="d-grid gap-3">
                    <SipsResumenLecturas result={result} />
                    <SipsTablaConsumo result={result} tipoServicio={tipo ?? ''} />
                </div>
            )}
        </div>
    );
};

export default SipsActivacionPanel;
