const fs = require('fs');
const path = require('path');
const http = require('http');
const https = require('https');

// Escribir errores en un archivo local para depuración sin consola
function registrarError(titulo, err) {
  const rutaLog = path.join(__dirname, 'error_cattv.txt');
  const fecha = new Date().toISOString();
  const mensaje = `[${fecha}] === ${titulo} ===\n${err ? (err.stack || err) : 'Error desconocido'}\n\n`;
  try {
    fs.appendFileSync(rutaLog, mensaje, 'utf8');
  } catch (_) {}
}

// Probar conexión de salida a múltiples servidores
function probarServidoresIPTV() {
  registrarError('TEST MULTI-PUERTOS', 'Iniciando pruebas de conexión para los 3 servidores IPTV...');

  // 1. Test lotvservices.net:2096 (HTTPS)
  const req0 = https.get({ host: 'lotvservices.net', port: 2096, path: '/player_api.php', timeout: 4000, rejectUnauthorized: false }, (res) => {
    registrarError('TEST LOTV (Puerto 2096 HTTPS)', `¡ÉXITO! Puerto 2096 abierto. Código: ${res.statusCode}`);
  });
  req0.on('error', (err) => registrarError('TEST LOTV (Puerto 2096 HTTPS)', `FALLÓ. Error: ${err.message}`));
  req0.on('timeout', () => { req0.destroy(); registrarError('TEST LOTV (Puerto 2096 HTTPS)', 'FALLÓ (Timeout).'); });

  // 2. Test flashtv.mx:80 (HTTP)
  const req1 = http.get({ host: 'flashtv.mx', port: 80, path: '/player_api.php', timeout: 4000 }, (res) => {
    registrarError('TEST FLASH TV (Puerto 80)', `¡ÉXITO! Puerto 80 abierto. Código: ${res.statusCode}`);
  });
  req1.on('error', (err) => registrarError('TEST FLASH TV (Puerto 80)', `FALLÓ. Error: ${err.message}`));
  req1.on('timeout', () => { req1.destroy(); registrarError('TEST FLASH TV (Puerto 80)', 'FALLÓ (Timeout).'); });

  // 3. Test zona593movie.com:8443 (HTTPS)
  const req2 = https.get({ host: 'zona593movie.com', port: 8443, path: '/player_api.php', timeout: 4000, rejectUnauthorized: false }, (res) => {
    registrarError('TEST ZONA 593 (Puerto 8443)', `¡ÉXITO! Puerto 8443 abierto (HTTPS). Código: ${res.statusCode}`);
  });
  req2.on('error', (err) => registrarError('TEST ZONA 593 (Puerto 8443)', `BLOQUEADO. Puerto 8443 cerrado. Error: ${err.message}`));
  req2.on('timeout', () => { req2.destroy(); registrarError('TEST ZONA 593 (Puerto 8443)', 'BLOQUEADO (Timeout). Puerto 8443 cerrado.'); });
}

// Auto-corrector recursivo de permisos para Linux/cPanel
function corregirPermisos(directorio) {
  try {
    const elementos = fs.readdirSync(directorio);
    for (const elemento of elementos) {
      if (elemento === 'node_modules') continue;
      const rutaCompleta = path.join(directorio, elemento);
      const info = fs.statSync(rutaCompleta);
      if (info.isDirectory()) {
        fs.chmodSync(rutaCompleta, 0o755);
        corregirPermisos(rutaCompleta);
      } else {
        fs.chmodSync(rutaCompleta, 0o644);
      }
    }
  } catch (err) {
    registrarError('ERROR CORRIGIENDO PERMISOS', err);
  }
}

// Capturar excepciones globales
process.on('uncaughtException', (err) => {
  registrarError('EXCEPCIÓN NO CAPTURADA (uncaughtException)', err);
  process.exit(1);
});

process.on('unhandledRejection', (razon) => {
  registrarError('RECHAZO NO CONTROLADO (unhandledRejection)', razon);
  process.exit(1);
});

try {
  registrarError('INICIO', 'Ejecutando auto-corrector de permisos...');
  fs.chmodSync(__dirname, 0o755);
  corregirPermisos(__dirname);
  registrarError('PERMISOS OK', 'Permisos corregidos a 0755.');

  // Ejecutar el test multi-puerto
  probarServidoresIPTV();

  const { createServer } = require('http');
  const { parse } = require('url');
  const next = require('next');

  const dev = false;
  const app = next({ dev, dir: __dirname });
  const handle = app.getRequestHandler();
  const port = process.env.PORT || 3000;

  registrarError('INICIO NEXT', 'Intentando arrancar el servidor Next.js...');

  app.prepare().then(() => {
    registrarError('NEXT PREPARE OK', 'Next.js cargado con éxito.');
    
    createServer((req, res) => {
      const parsedUrl = parse(req.url, true);
      handle(req, res, parsedUrl);
    }).listen(port, (err) => {
      if (err) {
        registrarError('ERROR LISTEN PORT', err);
        throw err;
      }
      registrarError('PUERTO ACTIVO', `Escuchando en: ${port}`);
    });
  }).catch((err) => {
    registrarError('FALLO EN APP.PREPARE()', err);
    process.exit(1);
  });
} catch (err) {
  registrarError('FALLO DE ARRANQUE GLOBAL', err);
  process.exit(1);
}
