// api.js - Módulo de Serviço de Dados (APrimorado pelo Cometê)
// Última Alteração: Corrigido o nome da função 'getAllVehicleInventories'.

// !!! ATENÇÃO !!! Verifique se esta é a URL da sua implantação do Apps Script
const API_URL = "https://vfsolucoes.com.br/api/index.php";

/**
 * Função utilitária para fazer chamadas à API do Google Apps Script.
 * @param {string} action - A ação a ser executada no Apps Script (e.g., 'USER_LOGIN', 'GET_INVENTORY').
 * @param {object} payload - Os dados a serem enviados com a requisição.
 * @param {string} [userRole] - O papel do usuário logado, para verificação de permissões no back-end.
 * @returns {Promise<object>} - Uma promessa que resolve com o resultado da API ou rejeita com um erro.
 */
export async function callApi(action, payload, userRole = null) {
    const formData = new FormData();
    formData.append('action', action);
    for (const key in payload) {
        if (Object.prototype.hasOwnProperty.call(payload, key)) {
            formData.append(key, payload[key]);
        }
    }
    // Adiciona o userRole ao payload se fornecido
    if (userRole) {
        formData.append('userRole', userRole);
    }

    try {
        const response = await fetch(API_URL, {
            method: 'POST',
            body: formData
        });

        if (!response.ok) {
            let errorMessage = `Erro na comunicação (${response.status} ${response.statusText}).`;
            try {
                const errorBody = await response.json();
                if (errorBody && errorBody.message) {
                    errorMessage = errorBody.message;
                }
            } catch (jsonError) {
                // Ignore JSON parse error, use default message
            }
            throw new Error(errorMessage);
        }
        
        const result = await response.json();

        if (result.status === 'error') {
            throw new Error(result.message || 'Ocorreu um erro desconhecido na API.');
        }
        return result;

    } catch (error) {
        console.error('Erro na chamada à API:', error);
        throw error;
    }
}

// Módulo de serviço de dados para o front-end
export const DataService = {
    loginUser: async (email, password) => callApi('USER_LOGIN', { email, password }),

    getProductsInfo: async (userRole) => callApi('GET_PRODUCTS_INFO', {}, userRole),
    addProductDefinition: async (product, userRole) => callApi('ADD_PRODUCT_DEFINITION', product, userRole),

    getProductsSummary: async (userRole) => callApi('GET_PRODUCTS_SUMMARY', {}, userRole),

    getInventory: async (userRole) => callApi('GET_INVENTORY', {}, userRole),
    addInventoryItem: async (item, userRole) => callApi('ADD_INVENTORY_ITEM', item, userRole),

    // Adicione esta linha dentro do objeto DataService
    getTowers: async (userRole) => callApi('GET_TOWERS', {}, userRole),

    getUsers: async (userRole) => callApi('GET_USERS', {}, userRole),
    addUser: async (user, userRole) => callApi('ADD_USER', user, userRole),

    getClients: async (userRole) => callApi('GET_CLIENTS', {}, userRole),
    addClient: async (client, userRole) => callApi('ADD_CLIENT', client, userRole),
    
    getClientActivities: async (userRole) => callApi('GET_CLIENT_ACTIVITIES', {}, userRole),
    addClientActivity: async (activity, userRole) => callApi('ADD_CLIENT_ACTIVITY', activity, userRole),

    getVehicleInventory: async (vehicleName, userRole) => callApi('GET_VEHICLE_INVENTORY', { vehicleName }, userRole),
    // **AQUI ESTÁ A FUNÇÃO CORRIGIDA**
    getAllVehicleInventories: async (userRole) => callApi('GET_ALL_VEHICLE_INVENTORIES', {}, userRole),
    addItemToVehicle: async (item, userRole) => callApi('ADD_ITEM_TO_VEHICLE', item, userRole),
    removeItemFromVehicle: async (item, userRole) => callApi('REMOVE_ITEM_FROM_VEHICLE', item, userRole),

    getTorresData: async (userRole) => callApi('GET_TORRES_DATA', {}, userRole),
    addTorre: async (payload, userRole) => callApi('ADD_TORRE', payload, userRole),
    alocarItemTorre: async (payload, userRole) => callApi('ALOCAR_ITEM_TORRE', payload, userRole),
    retirarItemTorre: async (payload, userRole) => callApi('RETIRAR_ITEM_TORRE', payload, userRole),

    getRedirectInventory: async (userRole) => callApi('GET_REDIRECT_INVENTORY', {}, userRole),
    redirectItem: async (item, userRole) => callApi('REDIRECT_ITEM', item, userRole),

    removeItemFromRectification: async (item, userRole) => callApi('REMOVE_ITEM_FROM_RECTIFICATION', item, userRole),
    
    getRectificationItems: async (userRole) => callApi('GET_RECTIFICATION_ITEMS', {}, userRole),
    addItemToRectification: async (item, userRole) => callApi('ADD_ITEM_TO_RECTIFICATION', item, userRole),
    removeItemFromRectification: async (item, userRole) => callApi('REMOVE_ITEM_FROM_RECTIFICATION', item, userRole),

    getTransactionLogs: async (userRole) => callApi('GET_TRANSACTION_LOGS', {}, userRole),
    logTransaction: async (log, userRole) => callApi('LOG_TRANSACTION', log, userRole),

    // Métodos para o Módulo de Consumo
    getItensConsumiveis: async (userRole) => callApi('GET_ITENS_CONSUMIVEIS', {}, userRole),
    addItemConsumivel: async (itemData, userRole) => callApi('ADD_ITEM_CONSUMIVEL', itemData, userRole),
    // Substitua a linha existente em api.js por esta
    getHistoricoConsumo: async (datePayload, userRole) => callApi('GET_HISTORICO_CONSUMO', datePayload, userRole),
    registrarConsumo: async (consumoData, userRole) => callApi('REGISTRAR_CONSUMO', consumoData, userRole),
    
    // Método para alteração de senha e username
    changeUserPassword: async (payload, userRole) => callApi('CHANGE_PASSWORD', payload, userRole),

    // Adicione estas duas linhas ao seu DataService
    addAbastecimento: async (payload, userRole) => callApi('ADD_ABASTECIMENTO', payload, userRole),
    getHistoricoCombustivel: async (userRole) => callApi('GET_HISTORICO_COMBUSTIVEL', {}, userRole),

    getTorresData: async (userRole) => callApi('GET_TORRES_DATA', {}, userRole),
    addTorre: async (payload, userRole) => callApi('ADD_TORRE', payload, userRole),
    alocarItemTorre: async (payload, userRole) => callApi('ALOCAR_ITEM_TORRE', payload, userRole),
    retirarItemTorre: async (payload, userRole) => callApi('RETIRAR_ITEM_TORRE', payload, userRole),

    // Adicione esta linha dentro do objeto DataService em api.js
    getConsumptionLogCount: async (userRole) => callApi('GET_CONSUMPTION_LOG_COUNT', {}, userRole),
    // Adicione esta linha dentro do objeto DataService em api.js
    getClientActivityDetails: async (userRole) => callApi('GET_CLIENT_ACTIVITY_DETAILS', {}, userRole),
    // Adicione esta nova linha dentro do objeto DataService:
    getMonthlyFuelReport: async (datePayload, userRole) => callApi('GET_MONTHLY_FUEL_REPORT', datePayload, userRole),
    // Em api.js, dentro do objeto DataService

    updateSafetyStock: async (payload, userRole) => callApi('UPDATE_SAFETY_STOCK', payload, userRole),
    // Em api.js, dentro do objeto DataService

    getClientActivitySummary: async (payload, userRole) => callApi('GET_CLIENT_ACTIVITY_SUMMARY', payload, userRole),

    // Adicione esta linha dentro do objeto DataService em api.js
    getPendingFinancial: async () => callApi('GET_PENDING_FINANCIAL', {}),
    // Adicione esta linha dentro do objeto DataService em api.js
    finalizeBilling: async (payload) => callApi('FINALIZE_BILLING', payload),
    // Adicione esta linha dentro do objeto DataService em api.js
    getBilledActivities: async () => callApi('GET_BILLED_ACTIVITIES', {}),
};