import path from 'path';
import { fileURLToPath } from 'url';
import fs from 'fs';

const __dirname = path.dirname(fileURLToPath(import.meta.url));

// --- Carga de configuración privada (PHP) -------------------------------------------------
let __privateConfig = {};
try {
  const privatePath = path.join(__dirname, 'config-private.php');
  const raw = fs.readFileSync(privatePath, 'utf-8');
  const defineRegex = /define\s*\(\s*['"]([^'"]+)['"]\s*,\s*['"]([^'"]+)['"]\s*\)\s*;/;
  // Procesamos línea por línea y saltamos las comentadas (// , # , * , /*),
  // para que un `define(...)` dentro de un comentario NO se interprete como real.
  for (const line of raw.split(/\r?\n/)) {
    const trimmed = line.trim();
    if (trimmed.startsWith('//') || trimmed.startsWith('#') || trimmed.startsWith('*') || trimmed.startsWith('/*')) continue;
    const m = trimmed.match(defineRegex);
    if (m) __privateConfig[m[1]] = m[2];
  }
} catch (e) {
  console.warn('config-private.php no encontrado o no se pudo leer.');
}

export const ADMIN_PASSWORD = __privateConfig['ADMIN_PASSWORD'] || '';
// 2Captcha DataDome solver. Cargar la key en config-private.php:
//   define('TWOCAPTCHA_API_KEY', 'xxxxxxxxxxxxxxxx');
// (o variable de entorno TWOCAPTCHA_API_KEY)
export const TWOCAPTCHA_API_KEY = process.env.TWOCAPTCHA_API_KEY || __privateConfig['TWOCAPTCHA_API_KEY'] || '';
// Proxy residencial OPCIONAL para DataDomeSliderTask. La cookie resuelta puede quedar
// atada a la IP de salida; sin proxy se prueba contra la IP del worker de 2Captcha.
//   define('DATADOME_PROXY_HOST', '1.2.3.4');
//   define('DATADOME_PROXY_PORT', '8080');
//   define('DATADOME_PROXY_LOGIN', 'user');     (opcional)
//   define('DATADOME_PROXY_PASSWORD', 'pass');  (opcional)
export const DATADOME_PROXY = {
  type: (__privateConfig['DATADOME_PROXY_TYPE'] || 'http').toLowerCase(),
  host: __privateConfig['DATADOME_PROXY_HOST'] || '',
  port: Number(__privateConfig['DATADOME_PROXY_PORT'] || 0) || undefined,
  login: __privateConfig['DATADOME_PROXY_LOGIN'] || '',
  password: __privateConfig['DATADOME_PROXY_PASSWORD'] || '',
};
export const DATADOME_PROXY_CONFIGURED = Boolean(DATADOME_PROXY.host && DATADOME_PROXY.port);

// ─── Alertas por email (cookie caída, etc.) ────────────────────────────────
// Cargar en config-private.php. Ejemplo con Gmail (requiere App Password):
//   define('SMTP_HOST', 'smtp.gmail.com');
//   define('SMTP_PORT', '465');
//   define('SMTP_USER', 'tucorreo@gmail.com');
//   define('SMTP_PASS', 'abcd efgh ijkl mnop');   ← App Password de 16 caracteres
//   define('ALERT_EMAIL_TO', 'donde_recibes@correo.com');
export const SMTP_HOST = __privateConfig['SMTP_HOST'] || '';
export const SMTP_PORT = Number(__privateConfig['SMTP_PORT'] || 465);
export const SMTP_USER = __privateConfig['SMTP_USER'] || '';
export const SMTP_PASS = __privateConfig['SMTP_PASS'] || '';
export const ALERT_EMAIL_TO = __privateConfig['ALERT_EMAIL_TO'] || SMTP_USER;
export const EMAIL_ALERTS_CONFIGURED = Boolean(SMTP_HOST && SMTP_USER && SMTP_PASS && ALERT_EMAIL_TO);
// ---------------------------------------------------------------------------------------

export const PORT = process.env.PORT || 3002;

// Archivos de estado del backend (resueltos junto a este archivo)
// Usuarios y órdenes se guardan por separado.
export const USERS_FILE = path.join(__dirname, 'users.json');
export const ORDERS_FILE = path.join(__dirname, 'orders.json');
export const CREATORS_FILE = path.join(__dirname, 'creators.json');
export const WITHDRAWALS_FILE = path.join(__dirname, 'withdrawals.json');

export const REFRESH_PROGRESS_FILE = path.join(__dirname, 'refresh-progress.json');

// Directorio y archivo de cookies de Garena
export const COOKIE_DIR = path.join(__dirname, 'cookie');
export const COOKIE_FILE = path.join(COOKIE_DIR, 'cookie-1.json');

// Constantes de la API de PagoStore Garena (Free Fire, región DO)
export const GARENA = {
  // API configuration for Pagostore Garena (Free Fire)
  appId: 100067,
  region: 'DO',
  language: 'es',
  baseUrl: 'https://pagostore.garena.com',
  loginUrl: 'https://pagostore.garena.com/api/auth/player_id_login',
  channelsUrl: 'https://pagostore.garena.com/api/shop/apps/channels?app_id=100067&packed_role_id=0&region=DO&language=es',
};

// User‑Agent string used for Garena HTTP requests
export const USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36';

// Archivo de configuración de precios (JSON externo para cambios sin reinicio)
const PRICING_CONFIG_FILE = path.join(__dirname, 'config.json');

// Cache en memoria de prices.json: se invalida solo si mtime cambia.
// Antes se leía el archivo en cada request (I/O síncrono en el hot path).
let __pricingCache = null;
let __pricingMtime = 0;

/**
 * Devuelve la configuración de precios desde config.json.
 * Cachea en memoria y solo relee si el mtime del archivo cambió,
 * así los edits manuales de config.json se reflejan sin reinicio
 * pero sin tocar disco en cada request.
 * Lanza error si el archivo no existe o el JSON es inválido.
 */
export function getPricingConfig() {
  let stat;
  try {
    stat = fs.statSync(PRICING_CONFIG_FILE);
  } catch (e) {
    // Si no se pudo stat (archivo borrado/inaccesible) pero hay cache, devolverla
    if (__pricingCache) return __pricingCache;
    throw e;
  }
  if (stat.mtimeMs === __pricingMtime && __pricingCache) {
    return __pricingCache;
  }
  const raw = fs.readFileSync(PRICING_CONFIG_FILE, 'utf-8');
  __pricingCache = JSON.parse(raw);
  __pricingMtime = stat.mtimeMs;
  return __pricingCache;
}
