import apiClient from '../apiClient';
import type { NotaCreditoDebitoDto } from '../../models/dtos/Contables/NotaCreditoDebitoDto';
import type { CreateNotaDto } from '../../models/dtos/Contables/CreateNotaDto';
import type { UpdateNotaDto } from '../../models/dtos/Contables/UpdateNotaDto';

interface GetAllNotasParams {
    fechaDesde?: string | null; // yyyy-MM-dd
    fechaHasta?: string | null; // yyyy-MM-dd
    destino?: 'Distribuidores' | 'Canillas' | '' | null;
    idDestino?: number | null;
    idEmpresa?: number | null;
    tipoNota?: 'Debito' | 'Credito' | '' | null;
}

const getAllNotas = async (filters: GetAllNotasParams): Promise<NotaCreditoDebitoDto[]> => {
    const params: Record<string, string | number> = {};
    if (filters.fechaDesde) params.fechaDesde = filters.fechaDesde;
    if (filters.fechaHasta) params.fechaHasta = filters.fechaHasta;
    if (filters.destino) params.destino = filters.destino;
    if (filters.idDestino) params.idDestino = filters.idDestino;
    if (filters.idEmpresa) params.idEmpresa = filters.idEmpresa;
    if (filters.tipoNota) params.tipo = filters.tipoNota; // El backend espera 'tipo'

    const response = await apiClient.get<NotaCreditoDebitoDto[]>('/notascreditodebito', { params });
    return response.data;
};

const getNotaById = async (idNota: number): Promise<NotaCreditoDebitoDto> => {
    const response = await apiClient.get<NotaCreditoDebitoDto>(`/notascreditodebito/${idNota}`);
    return response.data;
};

const createNota = async (data: CreateNotaDto): Promise<NotaCreditoDebitoDto> => {
    const response = await apiClient.post<NotaCreditoDebitoDto>('/notascreditodebito', data);
    return response.data;
};

const updateNota = async (idNota: number, data: UpdateNotaDto): Promise<void> => {
    await apiClient.put(`/notascreditodebito/${idNota}`, data);
};

const deleteNota = async (idNota: number): Promise<void> => {
    await apiClient.delete(`/notascreditodebito/${idNota}`);
};

const notaCreditoDebitoService = {
    getAllNotas,
    getNotaById,
    createNota,
    updateNota,
    deleteNota,
};

export default notaCreditoDebitoService;