import { useState } from 'react';
import axios from 'axios';
import { SipsResponse } from '../types';
import { mostrarErroresValidacionSips, validarConsultaSips } from '../validacionSips';

interface ConsultaParams {
    codCom: number;
    cups: string;
    tipo: string;
}

export function useSipsConsulta() {
    const [isSubmitting, setIsSubmitting] = useState(false);
    const [errorMessage, setErrorMessage] = useState<string | null>(null);
    const [warningMessage, setWarningMessage] = useState<string | null>(null);
    const [result, setResult] = useState<SipsResponse | null>(null);

    const consultar = async ({ codCom, cups, tipo }: ConsultaParams): Promise<SipsResponse | null> => {
        const errores = validarConsultaSips({ cups, tipoServicio: tipo });
        if (Object.keys(errores).length > 0) {
            await mostrarErroresValidacionSips(errores);
            setErrorMessage(errores.cups ?? errores.tipoServicio ?? 'Revise los campos del formulario.');
            return null;
        }

        setIsSubmitting(true);
        setErrorMessage(null);
        setWarningMessage(null);

        try {
            // @ts-ignore
            const response = await axios.post(route('sips.consumo'), {
                cod_com: codCom,
                cups: cups.trim(),
                tipo,
            });

            const data = response.data as SipsResponse;

            if (data?.tipoCups !== undefined && Array.isArray(data.selectFinal)) {
                setResult(data);

                if (data.sin_datos) {
                    setWarningMessage('No se encontraron datos SIPS para este CUPS.');
                } else {
                    const tipoEfectivo = data.lecturas?.tipo;
                    if (data.lecturas?.tipo_solicitado && tipoEfectivo && data.lecturas.tipo_solicitado !== tipoEfectivo) {
                        setWarningMessage(
                            `El servicio devolvió datos de ${tipoEfectivo === 'gas' ? 'Gas' : 'Luz'} aunque se solicitó ${data.lecturas.tipo_solicitado === 'gas' ? 'Gas' : 'Luz'}.`
                        );
                    }
                }

                return data;
            }

            setResult(null);
            setErrorMessage('La respuesta del servicio no tiene el formato esperado.');
            return null;
        } catch (error: any) {
            const details = error?.response?.data?.details;
            const msg =
                error?.response?.data?.error
                || (typeof details === 'object' && details?.description)
                || error?.response?.data?.message
                || 'Error al consultar el servicio SIPS.';
            setErrorMessage(msg);
            setResult(null);
            return null;
        } finally {
            setIsSubmitting(false);
        }
    };

    const reset = () => {
        setResult(null);
        setErrorMessage(null);
        setWarningMessage(null);
    };

    return {
        consultar,
        reset,
        isSubmitting,
        errorMessage,
        warningMessage,
        result,
        setErrorMessage,
        setWarningMessage,
    };
}
