import { NextRequest } from "next/server";
import { KycStatus, Role } from "@prisma/client";
import { prisma } from "@/server/db";
import { fail, ok } from "@/server/http";
import { requireUser } from "@/server/security/auth";
import { requireRole } from "@/server/security/rbac";

export const dynamic = "force-dynamic";

export async function GET(request: NextRequest) {
  try {
    const auth = await requireUser(request);
    requireRole(auth.roles, [Role.KYC_ANALYST, Role.ADMIN, Role.SUPER_ADMIN]);
    const status = request.nextUrl.searchParams.get("status");
    const where = status && status !== "ALL" ? { status: status as KycStatus } : {};
    const cases = await prisma.kycCase.findMany({
      where,
      include: {
        user: { select: { id: true, email: true, username: true, createdAt: true, profile: true } },
        documents: { orderBy: { uploadedAt: "desc" } },
        decisions: { orderBy: { createdAt: "desc" } }
      },
      orderBy: { openedAt: "desc" },
      take: 100
    });

    return ok({
      cases: cases.map((kycCase) => ({
        id: kycCase.id,
        status: kycCase.status,
        amlScore: kycCase.amlScore,
        pepMatch: kycCase.pepMatch,
        sanctionsMatch: kycCase.sanctionsMatch,
        countryRisk: kycCase.countryRisk,
        openedAt: kycCase.openedAt,
        decidedAt: kycCase.decidedAt,
        expiresAt: kycCase.expiresAt,
        user: {
          id: kycCase.user.id,
          email: kycCase.user.email,
          username: kycCase.user.username,
          createdAt: kycCase.user.createdAt,
          country: kycCase.user.profile?.country ?? null,
          name: kycCase.user.profile ? `${kycCase.user.profile.firstName} ${kycCase.user.profile.lastName}` : kycCase.user.username
        },
        documents: kycCase.documents.map((document) => ({
          id: document.id,
          type: document.type,
          status: document.status,
          metadata: document.metadata,
          uploadedAt: document.uploadedAt,
          viewUrl: `/api/admin/kyc/documents/${document.id}`
        })),
        decisions: kycCase.decisions.map((decision) => ({
          id: decision.id,
          status: decision.status,
          reason: decision.reason,
          createdAt: decision.createdAt
        }))
      }))
    });
  } catch (error) {
    return fail(error);
  }
}
