import { NextRequest } from "next/server";
import { 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 { roles } = await requireUser(request);
    requireRole(roles, [Role.ADMIN, Role.SUPER_ADMIN, Role.FINANCE_MANAGER, Role.SUPPORT]);

    const [deposits, withdrawals] = await Promise.all([
      prisma.cryptoDeposit.findMany({
        include: { user: { select: { email: true, username: true } } },
        orderBy: { createdAt: "desc" },
        take: 25
      }),
      prisma.cryptoWithdrawal.findMany({
        include: { user: { select: { email: true, username: true } } },
        orderBy: [{ status: "asc" }, { createdAt: "desc" }],
        take: 50
      })
    ]);

    return ok({
      deposits: deposits.map((deposit) => ({
        id: deposit.id,
        userId: deposit.userId,
        userEmail: deposit.user.email,
        username: deposit.user.username,
        asset: deposit.asset,
        network: deposit.network,
        txHash: deposit.txHash,
        toAddress: deposit.toAddress,
        cryptoAmount: deposit.cryptoAmount.toString(),
        eurAmount: deposit.eurAmount?.toString() ?? null,
        eurRate: deposit.eurRate?.toString() ?? null,
        rateSource: deposit.rateSource,
        confirmations: deposit.confirmations,
        requiredConfirmations: deposit.requiredConfirmations,
        status: deposit.status,
        createdAt: deposit.createdAt
      })),
      withdrawals: withdrawals.map((withdrawal) => ({
        id: withdrawal.id,
        userId: withdrawal.userId,
        userEmail: withdrawal.user.email,
        username: withdrawal.user.username,
        asset: withdrawal.asset,
        network: withdrawal.network,
        destinationAddress: withdrawal.destinationAddress,
        eurAmount: withdrawal.eurAmount.toString(),
        feeEur: withdrawal.feeEur.toString(),
        totalDebitEur: withdrawal.totalDebitEur.toString(),
        cryptoAmount: withdrawal.cryptoAmount.toString(),
        eurRate: withdrawal.eurRate.toString(),
        rateSource: withdrawal.rateSource,
        status: withdrawal.status,
        txHash: withdrawal.txHash,
        reviewReason: withdrawal.reviewReason,
        createdAt: withdrawal.createdAt,
        reviewedAt: withdrawal.reviewedAt
      }))
    });
  } catch (error) {
    return fail(error);
  }
}
