import type { ComercializadoraSips } from '../Sips/types';

export const TIPO_ELECTRICO = 1;
export const TIPO_GAS = 2;

export const PERIODOS = [1, 2, 3, 4, 5, 6] as const;

export type ClavePotencia = `PotEleConP${(typeof PERIODOS)[number]}`;

export type Potencias = Partial<Record<ClavePotencia, string | number | null>>;

export interface ComercializadoraActivacion extends ComercializadoraSips {
    fechas_provider: string | null;
}

export interface TarifaElectricaOption {
    CodTarEle: number;
    NomTarEle: string;
    CanPerTar: number | null;
}

export interface TarifaGasOption {
    CodTarGas: number;
    NomTarGas: string;
}

export interface ProductoOption {
    CodPro: number | string;
    CodCom: number | string;
    DesPro: string;
}

export interface AnexoOption {
    CodAnePro: number;
    CodPro: number | string;
    DesAnePro: string;
    TipPre?: number | string | null;
}

export interface TipoPrecioOption {
    id: number;
    descripcion: string;
}

export interface CupsActivacion {
    CodCup: number;
    TipCups: number;
    CUPs: string;
    CodPunSum: number | null;
    direccion: string | null;
    CodCli: number | null;
    RazSocCli: string | null;
    NumCifCli: string | null;
    CodTar: number | null;
    ConCup: string | number | null;
    potencias: Potencias;
}

export interface ContratoActivacion extends Potencias {
    CodProComCup: number;
    CodProCom: number;
    CodConCom: number | null;
    RefCon: string | null;
    CodCli: number | null;
    RazSocCli: string | null;
    NumCifCli: string | null;
    TipCups: number;
    CodTar: number | null;
    NomTar: string | null;
    CanPerTar: number;
    CodCom: number | null;
    NomCom: string | null;
    CodPro: number | string | null;
    DesPro: string | null;
    CodAnePro: number | null;
    DesAne: string | null;
    TipPre: number | string | null;
    CorpoGo: string | number | null;
    FecActCUPs: string | null;
    FecVenCUPs: string | null;
    ConCup: string | number | null;
    EstConCups: number;
    UPDATED_BOT: boolean;
    DATE_BOT_UPDATE: string | null;
}

export interface BusquedaActivacion {
    cups: CupsActivacion;
    contratos: ContratoActivacion[];
}

export interface FechasServicio {
    FechaUltimaRenovacion: string | null;
    FechaActivacion: string | null;
    FechaFinContrato: string | null;
    FechaRenovacion: string | null;
}

export interface ActivacionesPageProps {
    comercializadoras: ComercializadoraActivacion[];
    productos: ProductoOption[];
    anexos: AnexoOption[];
    tiposPrecio: TipoPrecioOption[];
    tarifasElectricas: TarifaElectricaOption[];
    tarifasGas: TarifaGasOption[];
    [key: string]: unknown;
}

export interface FormularioActivacion extends Potencias {
    CodTar: string;
    CodPro: string;
    CodAnePro: string;
    TipPre: string;
    CorpoGo: string;
    FecActCUPs: string;
    FecVenCUPs: string;
    ConCup: string;
    EstConCups: string;
}

export interface FormularioContratoRapido extends FormularioActivacion {
    CodCom: string;
    comentarios: string;
}

/** Periodos de potencia que admite la tarifa eléctrica (por defecto 6). */
export function periodosTarifa(tarifas: TarifaElectricaOption[], codTar: string | number | null): number {
    const tarifa = tarifas.find((t) => String(t.CodTarEle) === String(codTar ?? ''));
    const periodos = Number(tarifa?.CanPerTar ?? 6);
    return periodos >= 1 && periodos <= 6 ? periodos : 6;
}

export function textoValor(value: string | number | null | undefined): string {
    return value === null || value === undefined ? '' : String(value);
}

export function potenciasDesde(origen: Potencias): Potencias {
    return PERIODOS.reduce<Potencias>((acc, p) => {
        acc[`PotEleConP${p}`] = textoValor(origen[`PotEleConP${p}`]);
        return acc;
    }, {});
}

export function comercializadoraNombre(com: ComercializadoraActivacion): string {
    return com.RazSocCom || com.NomComCom || `Comercializadora #${com.CodCom}`;
}

export function mensajeError(error: unknown, fallback: string): string {
    const data = (error as { response?: { data?: { message?: string; errors?: Record<string, string[]> } } })
        ?.response?.data;
    const primerError = data?.errors ? Object.values(data.errors)[0]?.[0] : undefined;
    return primerError || data?.message || fallback;
}
