import apiClient from '../apiClient';
import type { PagoDto } from '../../models/dtos/Suscripciones/PagoDto';
import type { CreatePagoDto } from '../../models/dtos/Suscripciones/CreatePagoDto';
import type { ProcesamientoLoteResponseDto } from '../../models/dtos/Suscripciones/ProcesamientoLoteResponseDto';
import type { ResumenCuentaSuscriptorDto } from '../../models/dtos/Suscripciones/ResumenCuentaSuscriptorDto';
import type { LoteDeEnvioHistorialDto, LoteDeEnvioResumenDto } from '../../models/dtos/Comunicaciones/LoteDeEnvioDto';
import type { EmailLogDto } from '../../models/dtos/Comunicaciones/EmailLogDto';

const API_URL = '/facturacion';
const DEBITOS_URL = '/debitos';
const PAGOS_URL = '/pagos';

const procesarArchivoRespuesta = async (archivo: File): Promise<ProcesamientoLoteResponseDto> => {
    const formData = new FormData();
    formData.append('archivo', archivo);
    const response = await apiClient.post<ProcesamientoLoteResponseDto>(`${DEBITOS_URL}/procesar-respuesta`, formData, {
        headers: { 'Content-Type': 'multipart/form-data' },
    });
    return response.data;
};

const getResumenesDeCuentaPorPeriodo = async (
    anio: number, mes: number,
    nombreSuscriptor?: string, estadoPago?: string, estadoFacturacion?: string,
    tipoFactura?: string
): Promise<ResumenCuentaSuscriptorDto[]> => {
    const params = new URLSearchParams();
    if (nombreSuscriptor) params.append('nombreSuscriptor', nombreSuscriptor);
    if (estadoPago) params.append('estadoPago', estadoPago);
    if (estadoFacturacion) params.append('estadoFacturacion', estadoFacturacion);
    if (tipoFactura) params.append('tipoFactura', tipoFactura);

    const queryString = params.toString();
    const url = `${API_URL}/${anio}/${mes}${queryString ? `?${queryString}` : ''}`;

    const response = await apiClient.get<ResumenCuentaSuscriptorDto[]>(url);
    return response.data;
};

const generarFacturacionMensual = async (anio: number, mes: number): Promise<{ message: string, resultadoEnvio: LoteDeEnvioResumenDto }> => {
    const response = await apiClient.post<{ message: string, resultadoEnvio: LoteDeEnvioResumenDto }>(`${API_URL}/${anio}/${mes}`);
    return response.data;
};

const generarArchivoDebito = async (anio: number, mes: number): Promise<{ fileContent: Blob, fileName: string }> => {
    const response = await apiClient.post(`${DEBITOS_URL}/${anio}/${mes}/generar-archivo`, {}, {
        responseType: 'blob',
    });
    const contentDisposition = response.headers['content-disposition'];
    let fileName = `debito_${anio}_${mes}.txt`;
    if (contentDisposition) {
        const fileNameMatch = contentDisposition.match(/filename="(.+)"/);
        if (fileNameMatch && fileNameMatch.length > 1) {
            fileName = fileNameMatch[1];
        }
    }
    return { fileContent: response.data, fileName: fileName };
};

const registrarPagoManual = async (data: CreatePagoDto): Promise<PagoDto> => {
    const response = await apiClient.post<PagoDto>(PAGOS_URL, data);
    return response.data;
};

const actualizarNumeroFactura = async (idFactura: number, numeroFactura: string): Promise<void> => {
    await apiClient.put(`${API_URL}/${idFactura}/numero-factura`, `"${numeroFactura}"`, {
        headers: { 'Content-Type': 'application/json' }
    });
};

const enviarAvisoCuentaPorEmail = async (anio: number, mes: number, idSuscriptor: number): Promise<void> => {
    await apiClient.post(`${API_URL}/${anio}/${mes}/suscriptor/${idSuscriptor}/enviar-aviso`);
};

const enviarFacturaPdfPorEmail = async (idFactura: number): Promise<{ message: string }> => {
    const response = await apiClient.post<{ message: string }>(`${API_URL}/${idFactura}/enviar-factura-pdf`);
    return response.data;
};

const getHistorialEnvios = async (idFactura: number): Promise<EmailLogDto[]> => {
    const response = await apiClient.get<EmailLogDto[]>(`${API_URL}/${idFactura}/historial-envios`);
    return response.data;
};

const getHistorialLotesEnvio = async (anio?: number, mes?: number): Promise<LoteDeEnvioHistorialDto[]> => {
    const params = new URLSearchParams();
    if (anio) params.append('anio', String(anio));
    if (mes) params.append('mes', String(mes));

    const queryString = params.toString();
    const url = `${API_URL}/historial-lotes-envio${queryString ? `?${queryString}` : ''}`;

    const response = await apiClient.get<LoteDeEnvioHistorialDto[]>(url);
    return response.data;
};

const getDetallesLoteEnvio = async (idLote: number): Promise<EmailLogDto[]> => {
    const response = await apiClient.get<EmailLogDto[]>(`/lotes-envio/${idLote}/detalles`);
    return response.data;
};

export default {
    procesarArchivoRespuesta,
    getResumenesDeCuentaPorPeriodo,
    generarFacturacionMensual,
    generarArchivoDebito,
    registrarPagoManual,
    actualizarNumeroFactura,
    enviarAvisoCuentaPorEmail,
    enviarFacturaPdfPorEmail,
    getHistorialEnvios,
    getHistorialLotesEnvio,
    getDetallesLoteEnvio,
};