/**
 * api.js — API client module
 * All fetch calls in one place with centralized error handling
 */

const API = {
    _controller: null,

    /**
     * Base fetch wrapper
     */
    async _fetch(url, options = {}) {
        try {
            const res = await fetch(url, options);
            const data = await res.json();
            if (!data.success) {
                throw new Error(data.message || 'Error desconocido');
            }
            return data;
        } catch (err) {
            if (err.name === 'AbortError') return null;
            throw err;
        }
    },

    /**
     * POST JSON helper
     */
    async _post(url, body) {
        return this._fetch(url, {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify(body),
        });
    },

    // === Products ===

    async searchProducts(query = '', page = 1, limit = 10, lugarId = null, status = 'all') {
        // Cancel previous search
        if (this._controller) this._controller.abort();
        this._controller = new AbortController();

        let url = `api/inventario/productos/buscar.php?query=${encodeURIComponent(query)}&page=${page}&limit=${limit}&status=${status}`;
        if (lugarId) url += `&lugar_id=${lugarId}`;

        return this._fetch(url, { signal: this._controller.signal });
    },

    async getProduct(id, lugarId = null) {
        let url = `api/inventario/productos/buscar.php?id=${id}`;
        if (lugarId) url += `&lugar_id=${lugarId}`;
        return this._fetch(url);
    },

    async createProduct(data) {
        return this._post('api/inventario/productos/crear.php', data);
    },

    async updateProduct(id, field, value) {
        return this._post('api/inventario/productos/actualizar.php', { id, field, value });
    },

    async deleteProduct(id) {
        return this._post('api/inventario/productos/eliminar.php', { id });
    },

    // === Locations ===

    async getLocations() {
        return this._fetch('api/inventario/lugares/listar.php');
    },

    async createLocation(nombre) {
        return this._post('api/inventario/lugares/crear.php', { nombre });
    },

    // === Product-Locations ===

    async upsertProductLocation(data) {
        return this._post('api/inventario/producto-lugares/upsert.php', data);
    },

    async deleteProductLocation(productoId, lugarId) {
        return this._post('api/inventario/producto-lugares/eliminar.php', {
            producto_id: productoId,
            lugar_compra_id: lugarId,
        });
    },

    async getProductLocation(productoId, lugarId) {
        return this._fetch(`api/inventario/producto-lugares/obtener.php?producto_id=${productoId}&lugar_id=${lugarId}`);
    },

    // === Presentations ===

    async updatePresentation(productoId, presentacion, activo, factor = null) {
        const body = { producto_id: productoId, presentacion, activo };
        if (factor !== null) body.factor = factor;
        return this._post('api/inventario/presentaciones/actualizar.php', body);
    },

    async updatePresentationFacturabilidad(productoId, presentacion, esFacturable) {
        const body = { producto_id: productoId, presentacion, es_facturable: esFacturable ? 1 : 0 };
        return this._post('api/inventario/presentaciones/actualizar.php', body);
    },

    // === IVA ===

    async updateIva(id, exentoIva) {
        return this._post('api/inventario/iva/actualizar.php', { id, exento_iva: exentoIva });
    },
};
