const jwt = require("jsonwebtoken");
const tables = require("../tables");

const secretKey = process.env.APP_SECRET;

/**
 * GET /api/auth/callback?code=<token>
 *
 * Reçoit le token SuperOAuth depuis le frontend après redirect OAuth.
 * Valide auprès de SuperOAuth, résout ou crée le user local, retourne un JWT local.
 */
const callback = async (req, res) => {
  const { code } = req.query;

  if (!code) {
    return res.status(400).json({ message: "Missing OAuth code." });
  }

  const superOAuthUrl = process.env.SUPER_OAUTH_URL;
  if (!superOAuthUrl) {
    return res.status(500).json({ message: "Auth service not configured." });
  }

  try {
    const response = await fetch(`${superOAuthUrl}/api/v1/auth/token/validate`, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ token: code }),
    });

    const data = await response.json();

    if (!response.ok || !data.data?.valid || !data.data?.user) {
      return res.status(401).json({ message: "Invalid OAuth token." });
    }

    if (!data.data.user.isActive) {
      return res.status(401).json({ message: "Account is disabled." });
    }

    const { id: superOAuthId, email, nickname } = data.data.user;

    let localUser = await tables.users.getBySuperOAuthId(superOAuthId);

    if (!localUser) {
      // Premier login OAuth — créer le compte local
      const insertId = await tables.users.create({
        nickname: nickname ?? email?.split("@")[0] ?? `user_${Date.now()}`,
        mail: email ?? `${superOAuthId}@oauth.local`,
        password: "",  // pas de password local — auth via SuperOAuth uniquement
        tetardcoin: 1000,
      });
      await tables.users.linkSuperOAuth(insertId, superOAuthId);
      localUser = await tables.users.read(insertId);
    }

    const token = jwt.sign({ user: localUser.id }, secretKey, { expiresIn: "7d" });

    return res.status(200).json({
      message: "Connexion réussie",
      user: localUser,
      token,
    });
  } catch (err) {
    console.error("auth/callback — error", err);
    return res.status(500).json({ message: "Internal server error." });
  }
};

/**
 * POST /api/auth/logout
 * Stateless — le token JWT est géré côté client.
 */
const logout = (_req, res) => {
  return res.status(200).json({ message: "Déconnexion réussie." });
};

module.exports = { callback, logout };
