import apiClient from '../apiClient';
import type { StockBobinaDto } from '../../models/dtos/Impresion/StockBobinaDto';
import type { CreateStockBobinaDto } from '../../models/dtos/Impresion/CreateStockBobinaDto';
import type { UpdateStockBobinaDto } from '../../models/dtos/Impresion/UpdateStockBobinaDto';
import type { CambiarEstadoBobinaDto } from '../../models/dtos/Impresion/CambiarEstadoBobinaDto';
import type { CreateStockBobinaLoteDto } from '../../models/dtos/Impresion/CreateStockBobinaLoteDto';
import type { UpdateFechaRemitoLoteDto } from '../../models/dtos/Impresion/UpdateFechaRemitoLoteDto';

interface GetAllStockBobinasParams {
    idTipoBobina?: number | null;
    nroBobinaFilter?: string | null;
    idPlanta?: number | null;
    idEstadoBobina?: number | null;
    remitoFilter?: string | null;
    fechaDesde?: string | null; // "yyyy-MM-dd"
    fechaHasta?: string | null; // "yyyy-MM-dd"
    fechaEstadoDesde?: string | null; // "yyyy-MM-dd"
    fechaEstadoHasta?: string | null; // "yyyy-MM-dd"
}

const getAllStockBobinas = async (filters: GetAllStockBobinasParams): Promise<StockBobinaDto[]> => {
    const params: Record<string, string | number | boolean> = {};
    if (filters.idTipoBobina) params.idTipoBobina = filters.idTipoBobina;
    if (filters.nroBobinaFilter) params.nroBobina = filters.nroBobinaFilter; // El backend espera nroBobina
    if (filters.idPlanta) params.idPlanta = filters.idPlanta;
    if (filters.idEstadoBobina) params.idEstadoBobina = filters.idEstadoBobina;
    if (filters.remitoFilter) params.remito = filters.remitoFilter; // El backend espera remito
    if (filters.fechaDesde) params.fechaDesde = filters.fechaDesde;
    if (filters.fechaHasta) params.fechaHasta = filters.fechaHasta;
    if (filters.fechaEstadoDesde) params.fechaEstadoDesde = filters.fechaEstadoDesde;
    if (filters.fechaEstadoHasta) params.fechaEstadoHasta = filters.fechaEstadoHasta;

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

const getStockBobinaById = async (idBobina: number): Promise<StockBobinaDto> => {
    const response = await apiClient.get<StockBobinaDto>(`/stockbobinas/${idBobina}`);
    return response.data;
};

const ingresarBobina = async (data: CreateStockBobinaDto): Promise<StockBobinaDto> => {
    const response = await apiClient.post<StockBobinaDto>('/stockbobinas', data);
    return response.data;
};

const updateDatosBobinaDisponible = async (idBobina: number, data: UpdateStockBobinaDto): Promise<void> => {
    await apiClient.put(`/stockbobinas/${idBobina}/datos`, data);
};

const cambiarEstadoBobina = async (idBobina: number, data: CambiarEstadoBobinaDto): Promise<void> => {
    await apiClient.put(`/stockbobinas/${idBobina}/cambiar-estado`, data);
};

const deleteIngresoBobina = async (idBobina: number): Promise<void> => {
    await apiClient.delete(`/stockbobinas/${idBobina}`);
};

const verificarRemitoExistente = async (idPlanta: number, remito: string, fechaRemito?: string | null): Promise<StockBobinaDto[]> => {
    const params: { idPlanta: number; remito: string; fechaRemito?: string } = { idPlanta, remito };
    if (fechaRemito) {
        params.fechaRemito = fechaRemito;
    }
    const response = await apiClient.get<StockBobinaDto[]>('/stockbobinas/verificar-remito', { params });
    return response.data;
};

const ingresarLoteBobinas = async (data: CreateStockBobinaLoteDto): Promise<void> => {
    await apiClient.post('/stockbobinas/lote', data);
};

const actualizarFechaRemitoLote = async (data: UpdateFechaRemitoLoteDto): Promise<void> => {
    await apiClient.put('/stockbobinas/actualizar-fecha-remito', data);
};

const stockBobinaService = {
    getAllStockBobinas,
    getStockBobinaById,
    ingresarBobina,
    updateDatosBobinaDisponible,
    cambiarEstadoBobina,
    deleteIngresoBobina,
    verificarRemitoExistente,
    ingresarLoteBobinas,
    actualizarFechaRemitoLote,
};

export default stockBobinaService;