const http = require('http');
const { exec } = require('child_process');
const fs = require('fs');

const PORT = 9000;
const HOST = '10.99.0.4';
const SECRET_TOKEN = 'gitea_webhook_secret_clube67_58e4a92c3d18';
const SCRIPT_PATH = '/home/deploy/stack/clube67/deploy-prod-builder.sh';
const LOG_FILE = '/home/deploy/stack/webhook-listener/deploy.log';

function log(message) {
  const timestamp = new Date().toISOString();
  const logMessage = `[${timestamp}] ${message}\n`;
  console.log(message);
  fs.appendFileSync(LOG_FILE, logMessage, 'utf8');
}

// Garante que o arquivo de log exista
try {
  if (!fs.existsSync(LOG_FILE)) {
    fs.writeFileSync(LOG_FILE, '', 'utf8');
  }
} catch (e) {
  console.error('Erro ao inicializar log:', e.message);
}

let isBuilding = false;

const server = http.createServer((req, res) => {
  // Apenas aceita requisições POST na rota /webhook
  const urlPath = req.url.split('?')[0];
  if (req.method !== 'POST' || urlPath !== '/webhook') {
    res.writeHead(404, { 'Content-Type': 'application/json' });
    return res.end(JSON.stringify({ error: 'Rota não encontrada' }));
  }

  // Token de validação nos headers (Gitea envia como x-gitea-token) ou query string (?token=...)
  const tokenHeader = req.headers['x-gitea-token'];
  
  // Parsear query params manualmente de forma simples
  let tokenQuery = null;
  const qIndex = req.url.indexOf('?');
  if (qIndex !== -1) {
    const query = req.url.substring(qIndex + 1);
    const pairs = query.split('&');
    for (let i = 0; i < pairs.length; i++) {
      const pair = pairs[i].split('=');
      if (decodeURIComponent(pair[0]) === 'token') {
        tokenQuery = decodeURIComponent(pair[1] || '');
        break;
      }
    }
  }
  
  const token = tokenHeader || tokenQuery;

  if (!token || token !== SECRET_TOKEN) {
    log('⚠️ Tentativa de acesso não autorizada: Token inválido ou ausente.');
    res.writeHead(401, { 'Content-Type': 'application/json' });
    return res.end(JSON.stringify({ error: 'Não autorizado: Token inválido' }));
  }

  if (isBuilding) {
    log('⏳ Requisição de build recebida, mas já existe um build em andamento. Ignorando para evitar conflito de concorrência.');
    res.writeHead(429, { 'Content-Type': 'application/json' });
    return res.end(JSON.stringify({ error: 'Um build já está sendo executado neste momento' }));
  }

  // Retorna resposta de confirmação imediata (HTTP 202 Accepted) para evitar timeout do Gitea
  res.writeHead(202, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify({ status: 'ok', message: 'Deploy automático iniciado em segundo plano' }));

  // Inicia o processo de deploy
  isBuilding = true;
  log('🚀 Iniciando deploy-prod-builder.sh...');

  exec(SCRIPT_PATH, (error, stdout, stderr) => {
    isBuilding = false;
    if (error) {
      log(`❌ Erro no processo de deploy: ${error.message}`);
      return;
    }
    log('✅ Processo de deploy finalizado.');
  });
});

server.listen(PORT, HOST, () => {
  log(`📡 Webhook listener ativo em http://${HOST}:${PORT}/webhook`);
});
