import apiClient from '../apiClient';
import type { CierreCuentaCorrienteDto } from '../../models/dtos/Contables/CierreCuentaCorrienteDto';
import type { CrearCierreDto } from '../../models/dtos/Contables/CrearCierreDto';
import type { ReabrirCierreDto } from '../../models/dtos/Contables/ReabrirCierreDto';
import type { UltimoCierreDto } from '../../models/dtos/Contables/UltimoCierreDto';
import type { CierreCuentaCorrienteHistorialDto } from '../../models/dtos/Auditoria/CierreCuentaCorrienteHistorialDto';

const getAllCierres = async (
    idDistribuidor: number,
    idEmpresa: number,
): Promise<CierreCuentaCorrienteDto[]> => {
    const response = await apiClient.get<CierreCuentaCorrienteDto[]>('/cierres-cc', {
        params: { idDistribuidor, idEmpresa },
    });
    return response.data;
};

// Devuelve null si no hay cierre vigente (backend responde 404 — lo capturamos acá
// para que las páginas no tengan que manejar el error).
const getUltimoCierre = async (
    idDistribuidor: number,
    idEmpresa: number,
): Promise<UltimoCierreDto | null> => {
    try {
        const response = await apiClient.get<UltimoCierreDto>('/cierres-cc/ultimo', {
            params: { idDistribuidor, idEmpresa },
        });
        return response.data;
    } catch (error: unknown) {
        if (
            typeof error === 'object' &&
            error !== null &&
            'response' in error &&
            (error as { response?: { status?: number } }).response?.status === 404
        ) {
            return null;
        }
        throw error;
    }
};

const crearCierre = async (data: CrearCierreDto): Promise<CierreCuentaCorrienteDto> => {
    const response = await apiClient.post<CierreCuentaCorrienteDto>('/cierres-cc', data);
    return response.data;
};

const reabrirCierre = async (
    idCierre: number,
    data: ReabrirCierreDto,
): Promise<CierreCuentaCorrienteDto> => {
    const response = await apiClient.post<CierreCuentaCorrienteDto>(
        `/cierres-cc/${idCierre}/reabrir`,
        data,
    );
    return response.data;
};

const getHistorialCierre = async (
    idCierre: number,
): Promise<CierreCuentaCorrienteHistorialDto[]> => {
    const response = await apiClient.get<CierreCuentaCorrienteHistorialDto[]>(
        `/cierres-cc/${idCierre}/historial`
    );
    return response.data;
};

const cierresCcService = {
    getAllCierres,
    getUltimoCierre,
    crearCierre,
    reabrirCierre,
    getHistorialCierre,
};

export default cierresCcService;
