import { NextRequest, NextResponse } from "next/server";
import { requireAdmin } from "@/lib/api-auth";
import { db, auditLogs } from "@epicure/db";
import { createInvite, listInvites } from "@/lib/invites";
import { randomUUID } from "crypto";

const VALID_ROLES = ["user", "moderator", "admin"] as const;
const VALID_TIERS = ["free", "pro", "family"] as const;

export async function GET() {
  const { response } = await requireAdmin();
  if (response) return response;

  const invites = await listInvites();
  return NextResponse.json({ invites });
}

export async function POST(req: NextRequest) {
  const { session, response } = await requireAdmin();
  if (response) return response;

  const body = (await req.json()) as {
    email?: string;
    role?: string;
    tier?: string;
    expiresInDays?: number;
  };

  const role = body.role ?? "user";
  const tier = body.tier ?? "free";
  if (!VALID_ROLES.includes(role as (typeof VALID_ROLES)[number])) {
    return NextResponse.json({ error: "Invalid role" }, { status: 400 });
  }
  if (!VALID_TIERS.includes(tier as (typeof VALID_TIERS)[number])) {
    return NextResponse.json({ error: "Invalid tier" }, { status: 400 });
  }

  const invite = await createInvite({
    createdById: session!.user.id,
    email: body.email,
    role: role as (typeof VALID_ROLES)[number],
    tier: tier as (typeof VALID_TIERS)[number],
    expiresInDays: body.expiresInDays ?? 7,
  });

  await db.insert(auditLogs).values({
    id: randomUUID(),
    userId: session!.user.id,
    action: "admin.invite.create",
    targetType: "invite",
    targetId: invite!.id,
    metadata: JSON.stringify({ email: body.email, role, tier }),
    createdAt: new Date(),
  });

  return NextResponse.json({ invite });
}
