const WebSocket = require('ws');
const http = require('http');

const PROXY_PORT = 8080;

console.log('🚀 Proxy WebSocket - VERSÃO BRASIL');
console.log(`📡 Porta: ${PROXY_PORT}`);

const server = http.createServer((req, res) => {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('Proxy Brasil funcionando!\n');
});

const wss = new WebSocket.Server({ server });

// Único endpoint - Brasil
const BR_ENDPOINT = 'wss://chunderw-vpc-gll-br1.twilio.com/signal';

wss.on('connection', (clientWs, req) => {
    console.log(`🟢 Cliente conectado: ${req.socket.remoteAddress}`);
    
    let twilioWs = null;
    
    clientWs.on('message', (message) => {
        const msgStr = message.toString();
        console.log(`📥 Cliente: ${msgStr.substring(0, 100)}`);
        
        try {
            const data = JSON.parse(msgStr);
            
            if (data.type === 'register' && data.token) {
                console.log('🔑 Token recebido, conectando à Twilio Brasil...');
                
                // Headers necessários
                const headers = {
                    'Host': 'chunderw-vpc-gll-br1.twilio.com',
                    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
                    'Origin': 'https://sdk.twilio.com',
                    'Connection': 'Upgrade',
                    'Upgrade': 'websocket',
                    'Sec-WebSocket-Key': req.headers['sec-websocket-key'] || 'dGhlIHNhbXBsZSBub25jZQ==',
                    'Sec-WebSocket-Version': '13',
                    'Sec-WebSocket-Protocol': 'sip',
                    'Authorization': 'Bearer ' + data.token
                };
                
                console.log('📤 Conectando à Twilio...');
                
                twilioWs = new WebSocket(BR_ENDPOINT, {
                    headers: headers,
                    perMessageDeflate: false,
                    handshakeTimeout: 10000,
                    rejectUnauthorized: false
                });
                
                twilioWs.on('open', () => {
                    console.log('✅✅✅ CONECTADO À TWILIO BRASIL!');
                    
                    // Encaminhar mensagens do cliente para Twilio
                    clientWs.on('message', (clientMsg) => {
                        if (twilioWs.readyState === WebSocket.OPEN) {
                            twilioWs.send(clientMsg);
                        }
                    });
                    
                    // Encaminhar mensagens da Twilio para cliente
                    twilioWs.on('message', (twilioMsg) => {
                        console.log(`📥 Twilio -> Cliente: ${twilioMsg.length} bytes`);
                        if (clientWs.readyState === WebSocket.OPEN) {
                            clientWs.send(twilioMsg);
                        }
                    });
                    
                    // Enviar confirmação para o cliente
                    clientWs.send(JSON.stringify({
                        type: 'registered',
                        message: 'Conectado à Twilio Brasil'
                    }));
                });
                
                twilioWs.on('error', (err) => {
                    console.error('❌ Erro Twilio:', err.message);
                    clientWs.send(JSON.stringify({
                        type: 'error',
                        message: 'Erro na conexão: ' + err.message
                    }));
                });
                
                twilioWs.on('close', (code, reason) => {
                    console.log(`🔴 Twilio fechou: ${code} - ${reason}`);
                    clientWs.close();
                });
                
            } else if (twilioWs && twilioWs.readyState === WebSocket.OPEN) {
                twilioWs.send(message);
            }
        } catch (e) {
            console.log('⚠️ Erro ao processar:', e.message);
        }
    });
    
    clientWs.on('close', () => {
        console.log('🔴 Cliente desconectado');
        if (twilioWs) twilioWs.close();
    });
});

server.listen(PROXY_PORT, '0.0.0.0', () => {
    console.log(`✅ Proxy rodando na porta ${PROXY_PORT}`);
});