import { NextRequest } from "next/server";
import { KycStatus } from "@prisma/client";
import { fail, ok } from "@/server/http";
import { createKycProvider } from "@/server/providers/kyc/factory";
import { requireUser } from "@/server/security/auth";
import { prisma } from "@/server/db";

export const dynamic = "force-dynamic";

export async function GET(request: NextRequest) {
  try {
    const { user } = await requireUser(request);
    const cases = await prisma.kycCase.findMany({
      where: { userId: user.id },
      include: { documents: true, decisions: true },
      orderBy: { openedAt: "desc" }
    });
    return ok({
      cases: cases.map((kycCase) => ({
        id: kycCase.id,
        status: kycCase.status,
        provider: kycCase.provider,
        providerRef: kycCase.providerRef,
        amlScore: kycCase.amlScore,
        pepMatch: kycCase.pepMatch,
        sanctionsMatch: kycCase.sanctionsMatch,
        countryRisk: kycCase.countryRisk,
        openedAt: kycCase.openedAt,
        decidedAt: kycCase.decidedAt,
        expiresAt: kycCase.expiresAt,
        documents: kycCase.documents.map((document) => ({
          id: document.id,
          type: document.type,
          status: document.status,
          uploadedAt: document.uploadedAt
        })),
        decisions: kycCase.decisions.map((decision) => ({
          id: decision.id,
          status: decision.status,
          reason: decision.reason,
          createdAt: decision.createdAt
        }))
      }))
    });
  } catch (error) {
    return fail(error);
  }
}

export async function POST(request: NextRequest) {
  try {
    const { user } = await requireUser(request);
    if (!user.profile) {
      throw new Error("Profile required before KYC");
    }
    const provider = createKycProvider();
    const applicant = {
      userId: user.id,
      email: user.email,
      firstName: user.profile.firstName,
      lastName: user.profile.lastName,
      country: user.profile.country
    };
    const [created, screening] = await Promise.all([provider.createApplicant(applicant), provider.screenApplicant(applicant)]);
    const kycCase = await prisma.kycCase.create({
      data: {
        userId: user.id,
        status: KycStatus.PENDING,
        provider: provider.key,
        providerRef: created.providerRef,
        amlScore: screening.amlScore,
        pepMatch: screening.pepMatch,
        sanctionsMatch: screening.sanctionsMatch,
        countryRisk: screening.countryRisk
      }
    });
    return ok({ case: kycCase });
  } catch (error) {
    return fail(error);
  }
}
