// api_client.js
// Wrapper para chamadas HTTP usando Fetch API com tratamento de erros

const ApiClient = {
    async request(endpoint, method = 'GET', data = null) {
        try {
            const options = {
                method: method,
                headers: {
                    'Content-Type': 'application/json',
                    'Accept': 'application/json'
                }
            };

            if (data && (method === 'POST' || method === 'PUT')) {
                options.body = JSON.stringify(data);
            }

            const response = await fetch(endpoint, options);
            
            if (!response.ok) {
                throw new Error(`HTTP error! status: ${response.status}`);
            }
            
            const result = await response.json();
            
            if (result.status === 'error') {
                throw new Error(result.message || 'Erro desconhecido na API');
            }
            
            return result;
        } catch (error) {
            console.error('API Error:', error);
            // Integração com sistema de alertas global
            if (typeof Alertas !== 'undefined') {
                Alertas.erro(error.message);
            }
            throw error;
        }
    },

    async get(endpoint) {
        return this.request(endpoint, 'GET');
    },

    async post(endpoint, data) {
        return this.request(endpoint, 'POST', data);
    },

    async put(endpoint, data) {
        return this.request(endpoint, 'PUT', data);
    },

    async delete(endpoint) {
        return this.request(endpoint, 'DELETE');
    }
};

// Funções Utilitárias de Formatação
const Utils = {
    formatarMoeda(valor) {
        return new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(valor);
    },
    
    formatarData(dataString) {
        if (!dataString) return '-';
        const data = new Date(dataString);
        return new Intl.DateTimeFormat('pt-BR').format(data);
    },
    
    calcularPnl(precoMedio, precoAtual, quantidade) {
        const valorInvestido = precoMedio * quantidade;
        const valorAtualTotal = precoAtual * quantidade;
        const pnlAbsoluto = valorAtualTotal - valorInvestido;
        const pnlPercentual = valorInvestido > 0 ? (pnlAbsoluto / valorInvestido) * 100 : 0;
        
        return {
            absoluto: pnlAbsoluto,
            percentual: pnlPercentual
        };
    }
};

// Sistema de Alertas Visuais (Toast/Notificações)
const Alertas = {
    mostrar(mensagem, tipo = 'info') {
        // Criar container de alertas se não existir
        let container = document.getElementById('alert-container');
        if (!container) {
            container = document.createElement('div');
            container.id = 'alert-container';
            container.className = 'fixed top-5 right-5 z-50 flex flex-col gap-3';
            document.body.appendChild(container);
        }

        // Definir cores baseadas no tipo
        const cores = {
            sucesso: 'bg-green-100 border-green-500 text-green-800',
            erro: 'bg-red-100 border-red-500 text-red-800',
            aviso: 'bg-yellow-100 border-yellow-500 text-yellow-800',
            info: 'bg-blue-100 border-blue-500 text-blue-800'
        };

        const icone = {
            sucesso: '✓', erro: '✗', aviso: '!', info: 'i'
        };

        // Criar o elemento de alerta
        const alert = document.createElement('div');
        alert.className = `flex items-center gap-3 p-4 rounded-xl border-l-4 shadow-lg animate-slide-up ${cores[tipo]}`;
        alert.innerHTML = `
            <div class="font-bold text-lg">${icone[tipo]}</div>
            <div class="flex-1 font-medium">${mensagem}</div>
            <button class="text-gray-500 hover:text-gray-700 font-bold" onclick="this.parentElement.remove()">×</button>
        `;

        container.appendChild(alert);

        // Remover automaticamente após 5 segundos
        setTimeout(() => {
            if (alert.parentNode) {
                alert.style.animation = 'fadeOut 0.5s ease-out forwards';
                setTimeout(() => alert.remove(), 500);
            }
        }, 5000);
    },
    
    sucesso(msg) { this.mostrar(msg, 'sucesso'); },
    erro(msg) { this.mostrar(msg, 'erro'); },
    aviso(msg) { this.mostrar(msg, 'aviso'); },
    info(msg) { this.mostrar(msg, 'info'); }
};
