// apiService.ts
// Este archivo contendrá funciones para realizar llamadas a la API que pueden ser reutilizadas.

import axios from "axios";
import { CupsOption, Localidad, TarifaElectricaOption, TarifaGasOption, TarifaOption, VentanaOption } from "../Contratos/Interfaces/Interfaces";
import { getCached, setCached, clearCached } from '../../../services/simpleCache';
/**
 * Busca ventanas de precios para contratos eléctricos o de gas.
 * @param params Objeto con los parámetros necesarios para la consulta.
 * @param tipo 'luz' o 'gas'
 * @returns Una promesa que resuelve con un array de VentanaOption.
 */
export const buscarVentanasPrecios = async (
    params: {
        gama: string;
        tipo_contrato: string;
        tipo_tarifas: 'luz' | 'gas';
        tarifa_luz?: string;
        tarifa_gas?: string;
        servicio: string;
    }
): Promise<VentanaOption[]> => {
    try {
        const body: any = {
            gama: params.gama,
            tipo_contrato: params.tipo_contrato,
            tipo_tarifas: params.tipo_tarifas,
            servicio: params.servicio,
            tipo_contrato_luz: params.tipo_tarifas === 'luz' ? "1" : undefined,
            tipo_contrato_gas: params.tipo_tarifas === 'gas' ? "1" : undefined,
        };
        if (params.tipo_tarifas === 'luz') {
            body.tarifa_luz = params.tarifa_luz;
        } else {
            body.tarifa_gas = params.tarifa_gas;
        }
        const response = await axios.post(route('tarifas.integracion'), body);
        return response.data.data;
    } catch (error) {
        console.error("Error al buscar ventanas de precios:", error);
        throw error;
    }
};

/**
 * Busca las tarifas eléctricas desde la API.
 * @returns Una promesa que resuelve con un array de TarifaOption.
 */
export const buscarTarifasElectricas = async (): Promise<TarifaElectricaOption[]> => {
    try {
        const cacheKey = 'tarifas-electrica';
        const cached = getCached<TarifaElectricaOption[]>(cacheKey, 60 * 60); // 1 hour
        if (cached) return cached;

        const response = await axios.get(route('tarifa.electrica.buscar'));
        const data = response.data.data || response.data;
        try { setCached(cacheKey, data); } catch {}
        return data;
    } catch (error) {
        console.error("Error al buscar tarifas eléctricas:", error);
        throw error; // Relanza el error para que el componente que llama lo maneje
    }
};

/**
 * Busca las tarifas eléctricas desde la API.
 * @returns Una promesa que resuelve con un array de TarifaOption.
 */
export const buscarTarifasGas = async (): Promise<TarifaGasOption[]> => {
    try {
        const cacheKey = 'tarifas-gas';
        const cached = getCached<TarifaGasOption[]>(cacheKey, 60 * 60); // 1 hour
        if (cached) return cached;

        const response = await axios.get(route('tarifa.gas.buscar'));
        const data = response.data.data || response.data;
        try { setCached(cacheKey, data); } catch {}
        return data;
    } catch (error) {
        console.error("Error al buscar tarifas eléctricas:", error);
        throw error; // Relanza el error para que el componente que llama lo maneje
    }
};

/**
 * Forzar refresco de tarifas eléctricas en cliente (invalida cache)
 */
export const refreshTarifasElectricas = async (): Promise<void> => {
    try {
        const cacheKey = 'tarifas-electrica';
        try {
            await axios.post(route('tarifa.electrica.refresh'));
        } catch (e) {
            // endpoint optional; ignore if not available
        }
        try { clearCached(cacheKey); } catch (e) { /* ignore */ }
    } catch (error) {
        console.error('Error al refrescar tarifas eléctricas:', error);
    }
};

/**
 * Forzar refresco de tarifas de gas en cliente (invalida cache)
 */
export const refreshTarifasGas = async (): Promise<void> => {
    try {
        const cacheKey = 'tarifas-gas';
        try {
            await axios.post(route('tarifa.gas.refresh'));
        } catch (e) {
            // endpoint optional; ignore if not available
        }
        try { clearCached(cacheKey); } catch (e) { /* ignore */ }
    } catch (error) {
        console.error('Error al refrescar tarifas de gas:', error);
    }
};

/**
 * Busca los CUPS contratados desde la API.
 * @param query La cadena de búsqueda para el CUPS.
 * @param clienteId El ID del cliente asociado.
 * @returns Una promesa que resuelve con un array de CupsOption.
 */
export const buscarCupsContratados = async (tipoCups: number): Promise<CupsOption[]> => {
    try {
        const response = await axios.get(route('cups.contratados'), { params: { tipo: tipoCups } });
        return response.data.data;
    } catch (error) {
        console.error("Error al buscar CUPS contratados:", error);
        throw error;
    }
};

/**
 * Busca localidades por una consulta.
 * @param query La cadena de búsqueda para la localidad.
 * @returns Una promesa que resuelve con un array de localidades.
 */
export const buscarLocalidades = async (query: string): Promise<Localidad[]> => {
    try {
         const response = await axios.get(route('localidades.buscar'), { params: { q: query } });
         return response.data.data;
     } catch (error) {
         console.error("Error al buscar localidades:", error);
         throw error;
     }
};
