// api/whatsapp_server.js - Servidor WhatsApp com Node.js
const express = require('express');
const { Client, LocalAuth, MessageMedia } = require('whatsapp-web.js');
const qrcode = require('qrcode-terminal');
const fs = require('fs');
const path = require('path');

const app = express();
app.use(express.json({ limit: '50mb' }));
app.use(express.urlencoded({ extended: true, limit: '50mb' }));

// Configuração do cliente WhatsApp
const client = new Client({
    authStrategy: new LocalAuth({
        dataPath: path.join(__dirname, 'session')
    }),
    puppeteer: {
        headless: true,
        args: [
            '--no-sandbox',
            '--disable-setuid-sandbox',
            '--disable-dev-shm-usage',
            '--disable-accelerated-2d-canvas',
            '--no-first-run',
            '--no-zygote',
            '--single-process',
            '--disable-gpu'
        ]
    }
});

let isReady = false;
let qrCode = null;

// Eventos do WhatsApp
client.on('qr', (qr) => {
    qrCode = qr;
    qrcode.generate(qr, { small: true });
    console.log('📱 Escaneie o QR Code acima para conectar');
});

client.on('ready', () => {
    isReady = true;
    qrCode = null;
    console.log('✅ WhatsApp conectado com sucesso!');
});

client.on('authenticated', () => {
    console.log('🔐 Autenticado com sucesso');
});

client.on('auth_failure', (msg) => {
    console.error('❌ Falha na autenticação:', msg);
    isReady = false;
});

client.on('disconnected', (reason) => {
    console.log('⚠️ Desconectado:', reason);
    isReady = false;
    qrCode = null;
});

// Inicializar cliente
client.initialize();

// Função para enviar mensagem com timeout
function sendMessageWithTimeout(chatId, message, timeout = 30000) {
    return Promise.race([
        client.sendMessage(chatId, message),
        new Promise((_, reject) => 
            setTimeout(() => reject(new Error('Timeout ao enviar mensagem')), timeout)
        )
    ]);
}

// Função para enviar mídia com timeout
function sendMediaWithTimeout(chatId, media, caption, timeout = 60000) {
    return Promise.race([
        client.sendMessage(chatId, media, { caption: caption }),
        new Promise((_, reject) => 
            setTimeout(() => reject(new Error('Timeout ao enviar mídia')), timeout)
        )
    ]);
}

// ============================================
//  API ENDPOINTS
// ============================================

// Status da conexão
app.get('/api/status', (req, res) => {
    res.json({
        connected: isReady,
        qr: qrCode,
        timestamp: new Date().toISOString()
    });
});

// Enviar relatório completo
app.post('/api/send-report', async (req, res) => {
    const { telefone, os, materiais, fotos, fachada, mensagem } = req.body;
    
    if (!isReady) {
        return res.json({
            success: false,
            error: 'WhatsApp não conectado',
            qr: qrCode
        });
    }
    
    if (!telefone) {
        return res.json({ success: false, error: 'Telefone não informado' });
    }
    
    try {
        const chatId = `${telefone}@c.us`;
        
        // 1. Enviar mensagem de cabeçalho
        const headerMsg = `📋 *RELATÓRIO DE ATENDIMENTO - OS ${os.numero}*\n\n` +
                         `👤 *Cliente:* ${os.cliente}\n` +
                         `📞 *Telefone:* ${os.telefone_cliente || 'Não informado'}\n` +
                         `📍 *Cidade:* ${os.cidade}\n` +
                         `📡 *Plano:* ${os.plano}\n` +
                         `🔧 *Tipo:* ${os.tipo}\n` +
                         `👷 *Técnico:* ${os.tecnico || 'Não designado'}\n` +
                         `📅 *Abertura:* ${new Date(os.data_abertura).toLocaleString('pt-BR')}\n` +
                         (os.data_fechamento ? `✅ *Conclusão:* ${new Date(os.data_fechamento).toLocaleString('pt-BR')}\n` : '') +
                         `\n📦 *Materiais utilizados:*\n`;
        
        let materiaisMsg = '';
        if (materiais.length === 0) {
            materiaisMsg = '  Nenhum material registrado\n';
        } else {
            materiais.forEach(m => {
                materiaisMsg += `  • ${m.nome}: ${m.quantidade_usada} ${m.unidade}\n`;
            });
        }
        
        await sendMessageWithTimeout(chatId, headerMsg + materiaisMsg);
        
        // 2. Enviar relato do cliente
        if (os.relato && os.relato.trim()) {
            await sendMessageWithTimeout(chatId, `📣 *Relato do cliente:*\n${os.relato}`);
        }
        
        // 3. Enviar descrição do serviço
        if (os.descricao && os.descricao.trim()) {
            await sendMessageWithTimeout(chatId, `🔧 *Serviço executado:*\n${os.descricao}`);
        }
        
        // 4. Enviar solução
        if (os.solucao && os.solucao.trim()) {
            await sendMessageWithTimeout(chatId, `✔ *Solução aplicada:*\n${os.solucao}`);
        }
        
        // 5. Enviar foto da fachada
        if (fachada) {
            const media = new MessageMedia('image/jpeg', fachada.split(',')[1]);
            await sendMediaWithTimeout(chatId, media, '🏠 *Fachada do cliente*');
        }
        
        // 6. Enviar fotos do serviço
        const fotosServico = fotos.filter(f => f.tipo === 'SERVICO' || !f.tipo);
        for (let i = 0; i < fotosServico.length; i++) {
            const foto = fotosServico[i];
            if (foto.base64) {
                const media = new MessageMedia('image/jpeg', foto.base64.split(',')[1]);
                const caption = `📸 *Foto do serviço ${i+1}/${fotosServico.length}*\n${foto.descricao || ''}`;
                await sendMediaWithTimeout(chatId, media, caption);
                await new Promise(resolve => setTimeout(resolve, 500));
            }
        }
        
        // 7. Enviar fotos da OLT
        const fotosOLT = fotos.filter(f => f.tipo === 'OLT');
        for (let i = 0; i < fotosOLT.length; i++) {
            const foto = fotosOLT[i];
            if (foto.base64) {
                const media = new MessageMedia('image/jpeg', foto.base64.split(',')[1]);
                const caption = `📡 *Foto da OLT/CTO ${i+1}/${fotosOLT.length}*\n${foto.descricao || ''}`;
                await sendMediaWithTimeout(chatId, media, caption);
                await new Promise(resolve => setTimeout(resolve, 500));
            }
        }
        
        // 8. Enviar mensagem de finalização
        const footerMsg = `━━━━━━━━━━━━━━━━━━━━━━━━━━\n✅ *Relatório enviado com sucesso*\n📅 ${new Date().toLocaleString('pt-BR')}\n_Enviado pelo sistema MKT Telecom_`;
        await sendMessageWithTimeout(chatId, footerMsg);
        
        // Registrar no log
        await logEnvio(telefone, os.numero, 'success');
        
        res.json({
            success: true,
            message: 'Relatório enviado com sucesso!',
            timestamp: new Date().toISOString()
        });
        
    } catch (error) {
        console.error('Erro ao enviar:', error);
        
        await logEnvio(telefone, os.numero, 'error', error.message);
        
        res.json({
            success: false,
            error: error.message,
            fallback: true,
            url: `https://wa.me/${telefone}?text=${encodeURIComponent(mensagem || 'Relatório disponível no sistema')}`
        });
    }
});

// Enviar mensagem simples
app.post('/api/send-message', async (req, res) => {
    const { telefone, mensagem } = req.body;
    
    if (!isReady) {
        return res.json({ success: false, error: 'WhatsApp não conectado', qr: qrCode });
    }
    
    if (!telefone || !mensagem) {
        return res.json({ success: false, error: 'Telefone e mensagem são obrigatórios' });
    }
    
    try {
        const chatId = `${telefone}@c.us`;
        await sendMessageWithTimeout(chatId, mensagem);
        
        res.json({
            success: true,
            message: 'Mensagem enviada com sucesso!'
        });
    } catch (error) {
        res.json({ success: false, error: error.message });
    }
});

// Função para registrar envio no banco
async function logEnvio(telefone, osNumero, status, erro = null) {
    const mysql = require('mysql2/promise');
    try {
        const connection = await mysql.createConnection({
            host: 'localhost',
            user: 'root',
            password: '',
            database: 'mkt_2026'
        });
        
        await connection.execute(
            `INSERT INTO logs_whatsapp (telefone, os_numero, status, erro, created_at) 
             VALUES (?, ?, ?, ?, NOW())`,
            [telefone, osNumero, status, erro]
        );
        
        await connection.end();
    } catch (err) {
        console.error('Erro ao registrar log:', err);
    }
}

// Criar tabela de logs se não existir
async function createLogTable() {
    const mysql = require('mysql2/promise');
    try {
        const connection = await mysql.createConnection({
            host: 'localhost',
            user: 'root',
            password: '',
            database: 'mkt_2026'
        });
        
        await connection.execute(`
            CREATE TABLE IF NOT EXISTS logs_whatsapp (
                id INT AUTO_INCREMENT PRIMARY KEY,
                telefone VARCHAR(20),
                os_numero VARCHAR(30),
                status VARCHAR(20),
                erro TEXT,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
        `);
        
        await connection.end();
        console.log('✅ Tabela logs_whatsapp verificada/criada');
    } catch (err) {
        console.error('Erro ao criar tabela:', err);
    }
}

// Iniciar servidor
const PORT = 3000;
app.listen(PORT, () => {
    console.log(`🚀 Servidor WhatsApp rodando na porta ${PORT}`);
    createLogTable();
});

// Processamento de sinais
process.on('SIGINT', async () => {
    console.log('⚠️ Desligando servidor...');
    await client.destroy();
    process.exit(0);
});