export interface ConsumoLuzRow {
    id: number;
    CUPS: string;
    FLectAntM1: string;
    FLectM1: string;
    Tarifa?: string;
    CActP1M1?: string | number;
    CActP2M1?: string | number;
    CActP3M1?: string | number;
    CActP4M1?: string | number;
    CActP5M1?: string | number;
    CActP6M1?: string | number;
    CPotP1M1?: string | number;
    CPotP2M1?: string | number;
    CPotP3M1?: string | number;
    [key: string]: unknown;
}

export interface ConsumoGasRow {
    id: number;
    CUPS: string;
    Fec_Ini_Consumo: string;
    Fec_Fin_consumo: string;
    Cod_Peaje?: string;
    Consumo_kWh_P1?: string | number;
    Consumo_kWh_P2?: string | number;
    Caudal_Medio_kWhd?: string | number;
    Caudal_Max_Dia_kWhd?: string | number;
    Porcentaje_Consumo_Nocturno?: string | number;
    [key: string]: unknown;
}

export interface LecturasLuz {
    cups?: string;
    tipo?: string;
    tipo_solicitado?: string;
    LastTotalYearkWh?: number;
    LastTotalYearkWh_p1?: number;
    LastTotalYearkWh_p2?: number;
    LastTotalYearkWh_p3?: number;
    LastTotalYearkWh_p4?: number;
    LastTotalYearkWh_p5?: number;
    LastTotalYearkWh_p6?: number;
}

export interface LecturasGas {
    cups?: string;
    tipo?: string;
    tipo_solicitado?: string;
    kWhAnual?: number;
    kWhAnual_p1?: number;
    kWhAnual_p2?: number;
    Caudal_Max_Diario_Wh?: number;
    Caudal_Max_Horario_Wh?: number;
}

export interface SipsLuzResponse {
    tipoCups: 1;
    selectFinal: ConsumoLuzRow[];
    lecturas: LecturasLuz;
    provider?: string;
    suministros?: Record<string, unknown>[];
    sin_datos?: boolean;
    cups?: string;
    distributor_table?: string | null;
}

export interface SipsGasResponse {
    tipoCups: 2;
    selectFinal: ConsumoGasRow[];
    lecturas: LecturasGas;
    provider?: string;
    suministros?: Record<string, unknown>[];
    sin_datos?: boolean;
    cups?: string;
    distributor_table?: string | null;
}

export type SipsResponse = SipsLuzResponse | SipsGasResponse;

export interface ComercializadoraSips {
    CodCom: number;
    RazSocCom: string;
    NomComCom?: string;
    NumCifCom?: string;
    SerGas?: number | boolean;
    SerEle?: number | boolean;
    Servicio_Integracion?: string | null;
    servicio_integracion?: string | null;
    sips_provider?: SipsProviderConfig | null;
}

export interface SipsTipoServicioOption {
    value: string;
    label: string;
}

export interface SipsProviderConfig {
    codCom: number;
    key: 'audax' | 'adx' | string;
    label: string;
    servicioIntegracion?: string;
    tipo_servicio_options: SipsTipoServicioOption[];
    api_tipo_map?: Record<string, string>;
}

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

export function isElectricityTipo(tipo: string): boolean {
    return tipo === 'luz' || tipo === 'Electricity';
}

export function isGasTipo(tipo: string): boolean {
    return tipo === 'gas' || tipo === 'Gas';
}

export function isLuzResponse(data: SipsResponse): data is SipsLuzResponse {
    return data.tipoCups === 1;
}

export function isGasResponse(data: SipsResponse): data is SipsGasResponse {
    return data.tipoCups === 2;
}

export function toNumber(value: string | number | null | undefined): number {
    const n = parseFloat(String(value ?? 0));
    return Number.isFinite(n) ? n : 0;
}

export function formatSipsNumber(value: string | number | null | undefined, decimals = 2): string {
    return new Intl.NumberFormat('es-ES', {
        minimumFractionDigits: 0,
        maximumFractionDigits: decimals,
    }).format(toNumber(value));
}

export function consumoTotalLuz(row: ConsumoLuzRow): number {
    return [1, 2, 3, 4, 5, 6].reduce((sum, i) => sum + toNumber(row[`CActP${i}M1`]), 0);
}

export function consumoTotalGas(row: ConsumoGasRow): number {
    return toNumber(row.Consumo_kWh_P1) + toNumber(row.Consumo_kWh_P2);
}
