import apiClient from '../apiClient';
import type { EntradaSalidaCanillaDto } from '../../models/dtos/Distribucion/EntradaSalidaCanillaDto';
import type { CreateEntradaSalidaCanillaDto } from '../../models/dtos/Distribucion/CreateEntradaSalidaCanillaDto'; // Para creación individual si se mantiene
import type { UpdateEntradaSalidaCanillaDto } from '../../models/dtos/Distribucion/UpdateEntradaSalidaCanillaDto';
import type { LiquidarMovimientosCanillaRequestDto } from '../../models/dtos/Distribucion/LiquidarMovimientosCanillaDto';
import type { CreateBulkEntradaSalidaCanillaDto } from '../../models/dtos/Distribucion/CreateBulkEntradaSalidaCanillaDto';

interface GetAllESCanillaParams {
    fechaDesde?: string | null; // yyyy-MM-dd
    fechaHasta?: string | null; // yyyy-MM-dd
    idPublicacion?: number | null;
    idCanilla?: number | null;
    liquidados?: boolean | null; // true para solo liquidados, false para solo no liquidados
    incluirNoLiquidados?: boolean | null; // Si liquidados es null, este determina si se muestran no liquidados
}

const getAllEntradasSalidasCanilla = async (filters: GetAllESCanillaParams): Promise<EntradaSalidaCanillaDto[]> => {
    const params: Record<string, string | number | boolean> = {};
    if (filters.fechaDesde) params.fechaDesde = filters.fechaDesde;
    if (filters.fechaHasta) params.fechaHasta = filters.fechaHasta;
    if (filters.idPublicacion) params.idPublicacion = filters.idPublicacion;
    if (filters.idCanilla) params.idCanilla = filters.idCanilla;
    if (filters.liquidados !== undefined && filters.liquidados !== null) params.liquidados = filters.liquidados;
    if (filters.incluirNoLiquidados !== undefined && filters.incluirNoLiquidados !== null) params.incluirNoLiquidados = filters.incluirNoLiquidados;


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

const getEntradaSalidaCanillaById = async (idParte: number): Promise<EntradaSalidaCanillaDto> => {
    const response = await apiClient.get<EntradaSalidaCanillaDto>(`/entradassalidascanilla/${idParte}`);
    return response.data;
};

// Método para creación individual (si decides mantenerlo y diferenciar en el backend o aquí)
const createEntradaSalidaCanilla = async (data: CreateEntradaSalidaCanillaDto): Promise<EntradaSalidaCanillaDto> => {
    console.warn("Llamando a createEntradaSalidaCanilla (single), considera usar createBulk si es para el modal de múltiples items.")
    const response = await apiClient.post<EntradaSalidaCanillaDto>('/entradassalidascanilla', data); // Asume que el endpoint /entradassalidascanilla acepta el DTO individual
    return response.data;
};

// Nuevo método para creación en lote
const createBulkEntradasSalidasCanilla = async (data: CreateBulkEntradaSalidaCanillaDto): Promise<EntradaSalidaCanillaDto[]> => {
    const response = await apiClient.post<EntradaSalidaCanillaDto[]>('/entradassalidascanilla/bulk', data); // Endpoint para el lote
    return response.data;
};


const updateEntradaSalidaCanilla = async (idParte: number, data: UpdateEntradaSalidaCanillaDto): Promise<void> => {
    await apiClient.put(`/entradassalidascanilla/${idParte}`, data);
};

const deleteEntradaSalidaCanilla = async (idParte: number): Promise<void> => {
    await apiClient.delete(`/entradassalidascanilla/${idParte}`);
};

const liquidarMovimientos = async (data: LiquidarMovimientosCanillaRequestDto): Promise<void> => {
    await apiClient.post('/entradassalidascanilla/liquidar', data);
};

const entradaSalidaCanillaService = {
    getAllEntradasSalidasCanilla,
    getEntradaSalidaCanillaById,
    createEntradaSalidaCanilla, // Mantener si se usa
    createBulkEntradasSalidasCanilla, // Nuevo
    updateEntradaSalidaCanilla,
    deleteEntradaSalidaCanilla,
    liquidarMovimientos,
};

export default entradaSalidaCanillaService;