import { Request, Response, NextFunction } from "express";
import { verifyAccessToken, AccessPayload } from "../lib/jwt";
import { Capability, hasCapability } from "../lib/permissions";

declare global {
  // eslint-disable-next-line @typescript-eslint/no-namespace
  namespace Express {
    interface Request {
      user?: AccessPayload;
    }
  }
}

export function requireAuth(req: Request, res: Response, next: NextFunction) {
  const token = req.cookies?.access_token;
  if (!token) {
    return res.status(401).json({ error: "Non authentifié" });
  }
  try {
    req.user = verifyAccessToken(token);
    next();
  } catch {
    return res.status(401).json({ error: "Session invalide ou expirée" });
  }
}

// Exige que l'utilisateur authentifié possède l'un des rôles indiqués.
export function requireRole(...roles: string[]) {
  return (req: Request, res: Response, next: NextFunction) => {
    if (!req.user) return res.status(401).json({ error: "Non authentifié" });
    if (!roles.includes(req.user.role)) {
      return res.status(403).json({ error: "Accès refusé" });
    }
    next();
  };
}

// Exige une capacité précise (selon la matrice rôle → capacités).
export function requireCapability(cap: Capability) {
  return (req: Request, res: Response, next: NextFunction) => {
    if (!req.user) return res.status(401).json({ error: "Non authentifié" });
    if (!hasCapability(req.user.role, cap)) {
      return res.status(403).json({ error: "Accès refusé" });
    }
    next();
  };
}
