import { api, apiURL } from '@Services/Api';

/**
 * Servicio para gestionar números de serie de inventario
 */
const serialService = {
    /**
     * Obtener lista de seriales de un producto
     * @param {Number} inventoryId - ID del inventario
     * @param {Object} filters - Filtros opcionales (status, q, page)
     * @returns {Promise}
     */
    async getSerials(inventoryId, filters = {}) {
        return new Promise((resolve, reject) => {
            api.get(apiURL(`inventario/${inventoryId}/serials`), {
                params: filters,
                onSuccess: (response) => {
                    resolve(response);
                },
                onError: (error) => {
                    reject(error);
                }
            });
        });
    },

    /**
     * Obtener solo seriales disponibles de un producto
     * @param {Number} inventoryId - ID del inventario
     * @param {Number|null} warehouseId - ID del almacén específico (gestión de inventario)
     * @param {Object} options - Opciones adicionales
     * @param {Boolean} options.mainWarehouse - Si true, filtra por almacén principal (?main_warehouse=1)
     * @returns {Promise}
     */
    async getAvailableSerials(inventoryId, warehouseId = null, options = {}) {
        const filters = { status: 'disponible' };
        if (options.mainWarehouse) {
            filters.main_warehouse = 1;
        } else if (warehouseId) {
            filters.warehouse_id = warehouseId;
        }
        return this.getSerials(inventoryId, filters);
    },

    /**
     * Obtener un serial específico
     * @param {Number} inventoryId - ID del inventario
     * @param {Number} serialId - ID del serial
     * @returns {Promise}
     */
    async getSerial(inventoryId, serialId) {
        return new Promise((resolve, reject) => {
            api.get(apiURL(`inventario/${inventoryId}/serials/${serialId}`), {
                onSuccess: (response) => {
                    resolve(response.serial || response);
                },
                onError: (error) => {
                    reject(error);
                }
            });
        });
    },

    /**
     * Obtener componentes de un bundle con info de track_serials
     * @param {Number} bundleId - ID del bundle
     * @returns {Promise}
     */
    async getBundleComponents(bundleId) {
        return new Promise((resolve, reject) => {
            api.get(apiURL(`bundles/${bundleId}`), {
                onSuccess: (response) => {
                    const bundle = response.model || response;
                    resolve(bundle.items || []);
                },
                onError: (error) => {
                    reject(error);
                }
            });
        });
    },

    /**
     * Eliminar un serial
     * @param {Number} inventoryId - ID del inventario
     * @param {Number} serialId - ID del serial
     * @returns {Promise}
     */
    async deleteSerial(inventoryId, serialId) {
        return new Promise((resolve, reject) => {
            api.delete(apiURL(`inventario/${inventoryId}/serials/${serialId}`), {
                onSuccess: (response) => {
                    resolve(response);
                },
                onError: (error) => {
                    reject(error);
                }
            });
        });
    }
};

export default serialService;
