import type { NextFunction, Request, Response } from "express";
import { prisma } from "../prisma.js";
import { AUTH_COOKIE_NAME, verifyAuthToken } from "../lib/jwt.js";
import { HttpError } from "../lib/http-error.js";

export type AuthenticatedUser = {
  id: number;
  username: string;
  name: string;
};

declare global {
  namespace Express {
    interface Request {
      user?: AuthenticatedUser;
    }
  }
}

export async function requireAuth(
  req: Request,
  _res: Response,
  next: NextFunction
): Promise<void> {
  try {
    const token = req.cookies?.[AUTH_COOKIE_NAME];
    if (!token) throw new HttpError(401, "No autenticado");

    const payload = verifyAuthToken(token);
    const user = await prisma.user.findUnique({
      where: { id: payload.sub },
      select: { id: true, username: true, name: true, active: true },
    });

    if (!user || !user.active) throw new HttpError(401, "No autenticado");

    req.user = { id: user.id, username: user.username, name: user.name };
    next();
  } catch (err) {
    if (err instanceof HttpError) return next(err);
    next(new HttpError(401, "No autenticado"));
  }
}
