/**
 * Rutas de autenticación de jugadores.
 *
 * POST /api/auth/login  — challenge + ID → valida contra Garena → devuelve token firmado
 * El playerId NUNCA más viaja en URLs ni bodies después del login.
 */

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

const router = Router();
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' });
  res.json({ success: true, ...challenge });
});

router.post('/api/auth/login', async (req, res) => {
  const { playerId, code, challengeToken } = req.body || {};

  // Capa 1: challenge de un solo uso obligatorio
  if (!validateAndConsume(String(challengeToken || ''), GUARD_SECRET)) {
    return res.status(403).json({ error: 'invalid_challenge', message: 'Sesión inválida. Recarga la página.' });
  }

  const idStr = String(playerId || '').trim();
  if (!idStr) return res.status(400).json({ error: 'missing_id', message: 'Falta el ID del jugador.' });

  try {
    // Validar código de creador si viene
    if (code) {
      const codeUpper = String(code).trim().toUpperCase();
      const db = await import('../db.js').then(m => m.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.` });
      }
    }

    const result = await getOrRegisterUser(idStr);
    if (result.status !== 'ok') {
      const errors = {
        no_cookie: [500, { error: 'no_cookie', message: 'Falta full-cookies.json.' }],
        datadome: [503, { error: 'datadome', message: 'Verificación de seguridad. Reintenta en unos segundos.' }],
        invalid_id: [400, { error: 'invalid_id', message: 'ID inválido o no encontrado.' }],
      };
      const [status, payload] = errors[result.status] || [500, { error: 'error', message: 'Error interno.' }];
      return res.status(status).json(payload);
    }

    const { nickname, discountedPackages, purchasedPackages } = result.user;
    const token = issueAuthToken(idStr);

    res.json({
      success: true,
      authToken: token,
      profile: {
        playerId: idStr,
        nickname,
        discountedPackages,
        purchasedPackages,
      },
    });
  } catch (_err) {
    res.status(500).json({ error: 'error', message: 'Error interno del servidor.' });
  }
});

export default router;
