import { eq } from "drizzle-orm";
import { getChatGPTUser } from "../chatgpt-auth";
import { getDb } from "../../db";
import { members } from "../../db/schema";

export class ApiAccessError extends Error {
  constructor(public status: number, message: string) {
    super(message);
  }
}

export async function requirePortalProfile(bureauOnly = false) {
  const user = await getChatGPTUser();
  if (!user) throw new ApiAccessError(401, "Connexion requise");
  const db = await getDb();
  const [profile] = await db
    .select()
    .from(members)
    .where(eq(members.email, user.email.trim().toLowerCase()))
    .limit(1);
  if (!profile || profile.accessStatus !== "active") {
    throw new ApiAccessError(403, "Ce compte n’est pas encore autorisé dans l’ASL");
  }
  if (bureauOnly && profile.role !== "bureau") {
    throw new ApiAccessError(403, "Accès réservé aux membres du bureau");
  }
  return { user, profile, db };
}

export function apiError(error: unknown) {
  if (error instanceof ApiAccessError) {
    return Response.json({ error: error.message }, { status: error.status });
  }
  const message = error instanceof Error ? error.message : "Erreur inattendue";
  if (message.includes("UNIQUE constraint failed")) {
    return Response.json({ error: "Cette adresse e-mail ou cette référence de lot existe déjà." }, { status: 409 });
  }
  if (message.includes("no such table")) {
    return Response.json({ error: "La base du portail est en cours d’initialisation." }, { status: 503 });
  }
  return Response.json({ error: message }, { status: 500 });
}
