export interface SuministroElectricoAdx {
    CUPS?: string;
    Cod_Dist?: string;
    Distribuidora?: string;
    Tarifa?: string;
    Des_Tarifa?: string;
    Tension?: string;
    Direccion_Suministro?: string;
    Cod_Postal_Suministro?: string;
    CodigoPostal_Suministro?: string;
    Localidad_Suministro?: string;
    Provincia_Suministro?: string;
    Indicativo_ICP?: string;
    Propiedad_ICP?: string;
    telegestion?: string;
    Telegestionado_Activo?: string;
    Perfil_Consumo?: string;
    Tipo_PM?: string;
    Propiedad_Equipo_Medida?: string;
    last_comer_known?: string;
    Comercialitzadora?: string;
    NombreCompleto_Titular?: string;
    Nombre_Titular?: string;
    CIF_Titular?: string;
    Direccion_Titular?: string;
    Cod_Postal_Titular?: string;
    Municipio_Titular?: string;
    Provincia_Titular?: string;
    cnae_code?: string;
    cnae_desc?: string;
    Telefono_Titular?: string;
    Tipo_Titular?: string;
    Persona?: string;
    persona_contacto?: string;
    cargo_persona_contacto?: string;
    Primera_vivienda?: string;
    Cortes?: string | number;
    Impago?: string | number;
    importeDepositoGarantiaEuros?: string | number;
    Fianza?: string | number;
    Pot_Cont_P1?: string | number;
    Pot_Cont_P2?: string | number;
    Pot_Cont_P3?: string | number;
    Pot_Cont_P4?: string | number;
    Pot_Cont_P5?: string | number;
    Pot_Cont_P6?: string | number;
    Pot_Max_BIE?: string | number;
    Pot_Max_Puesta?: string | number;
    Der_Acceso_Llano?: string | number;
    Der_Extension?: string | number;
    Relacion_Transformacion?: string;
    Fec_Ult_Camb_Comer?: string;
    Fec_Alta_Suministro?: string;
    Fec_Ult_Lect?: string;
    lastlectura?: string;
    Fec_Lim_Exten?: string;
    fechaLimiteDerechosReconocidos?: string;
    Suministro_Contratable?: string;
    Estado_No_Contratable?: string;
    [key: string]: unknown;
}

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?: SuministroElectricoAdx[];
    sin_datos?: boolean;
    cups?: string;
    distributor_table?: string | null;
}

export interface SipsGasResponse {
    tipoCups: 2;
    selectFinal: ConsumoGasRow[];
    lecturas: LecturasGas;
    provider?: string;
    suministros?: SuministroElectricoAdx[];
    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);
}
