import { Router } from 'express';
import { getOrRegisterUser } from '../services/users.js';
import { readDBOnce } from '../db.js';
import { createChallenge, validateAndConsume } from '../services/sessionGuard.js';
import { ADMIN_PASSWORD } from '../config.js';

const router = Router();

// ─── Session challenge: token de un solo uso para proteger /api/player_info ──
const GUARD_SECRET = ADMIN_PASSWORD || 'dev-guard-secret';

router.get('/api/session/challenge', (req, res) => {
  const challenge = createChallenge(GUARD_SECRET);
  if (!challenge) return res.status(503).json({ error: 'challenge_limit', message: 'Demasiados challenges activos.' });
  res.json({ success: true, ...challenge });
});

function requireChallenge(req) {
  if (process.env.NODE_ENV === 'test') return true;
  const token = req.headers['x-challenge-token'] || '';
  return validateAndConsume(String(token), GUARD_SECRET);
}

// Mapea cada estado de error del servicio a su respuesta HTTP
const ERRORS = {
  no_cookie: [500, { error: 'no_cookie', message: 'Falta full-cookies.json (ejecuta: npm run cookie para generar una cookie validada)' }],
  datadome: [503, { error: 'datadome', message: 'Garena pidió verificación de seguridad (DataDome) y bloqueó la consulta. Reintenta en unos segundos.' }],
  invalid_id: [400, { error: 'invalid_id', message: 'ID inválido o no encontrado. Revisa el número e inténtalo de nuevo.' }],
};

// Verifica un ID y registra el usuario solo la primera vez.
// Después users.json pasa a ser la fuente de verdad del jugador.
router.get('/api/player_info', async (req, res) => {
  const { id, code } = req.query;
  if (!id) return res.status(400).json({ error: 'missing_id', message: 'Falta el ID del jugador' });

  // Challenge de un solo uso: sin token válido, rechazar
  if (!requireChallenge(req)) {
    return res.status(403).json({ error: 'invalid_challenge', message: 'Sesión de verificación inválida. Recarga la página.' });
  }

  try {
    if (code) {
      const codeUpper = code.trim().toUpperCase();
      const db = await readDBOnce();
      const creator = db.creators[codeUpper];
      if (!creator || creator.status !== 'active') {
        return res.status(400).json({ 
          error: 'invalid_code', 
          message: `El código '${codeUpper}' no existe o está inactivo. Déjalo en blanco para continuar o revisa si está bien escrito.` 
        });
      }
    }

    const result = await getOrRegisterUser(id);
    if (result.status !== 'ok') {
      const [code, payload] = ERRORS[result.status] || [500, { error: 'error', message: 'Error de red o DataDome' }];
      return res.status(code).json(payload);
    }
    const { nickname, packages, discountedPackages, purchasedPackages } = result.user;
    res.json({ success: true, playerId: id, nickname, packages, discountedPackages, purchasedPackages, cached: result.cached });
  } catch (err) {
    console.error('Error en Garena API:', err.message);
    res.status(500).json({ error: 'error', message: 'Error de red o DataDome' });
  }
});

export default router;
