import type { NextFunction, Request, Response } from 'express';
import { randomBytes, timingSafeEqual } from 'node:crypto';
import { env } from '../../config/env.js';

export function requireAuth(req: Request, res: Response, next: NextFunction) {
  if (!req.session.discord || req.session.discord.expiresAt <= Date.now()) {
    req.session.discord = undefined;
    return res.redirect(`${env.BASE_PATH}/login`);
  }
  next();
}

export function ensureCsrf(req: Request): string {
  if (!req.session.csrfToken) req.session.csrfToken = randomBytes(32).toString('hex');
  return req.session.csrfToken;
}

export function verifyCsrf(req: Request, res: Response, next: NextFunction) {
  const expected = req.session.csrfToken;
  const received = typeof req.body?._csrf === 'string' ? req.body._csrf : '';
  if (!expected || expected.length !== received.length) return res.status(403).send('Jeton CSRF invalide.');
  if (!timingSafeEqual(Buffer.from(expected), Buffer.from(received))) return res.status(403).send('Jeton CSRF invalide.');
  next();
}
