import { NextRequest } from "next/server";
import { AffiliateCommissionStatus } from "@prisma/client";
import { z } from "zod";
import { prisma } from "@/server/db";
import { requireAffiliateAdmin } from "@/server/affiliation/service";
import { fail, ok, parseJson } from "@/server/http";

const updateCommissionSchema = z.object({
  commissionId: z.string().uuid(),
  status: z.nativeEnum(AffiliateCommissionStatus)
});

export async function GET(request: NextRequest) {
  try {
    await requireAffiliateAdmin(request);
    const commissions = await prisma.affiliateCommission.findMany({
      orderBy: { createdAt: "desc" },
      take: 100,
      include: { account: true, referral: true, offer: true }
    });

    return ok({
      commissions: commissions.map((commission) => ({
        id: commission.id,
        affiliate: commission.account.displayName,
        type: commission.type,
        amount: commission.amount.toString(),
        currency: commission.currency,
        status: commission.status,
        periodStart: commission.periodStart,
        periodEnd: commission.periodEnd,
        payableFrom: commission.payableFrom,
        description: commission.description,
        offer: commission.offer ? { code: commission.offer.code, name: commission.offer.name } : null
      }))
    });
  } catch (error) {
    return fail(error);
  }
}

export async function PATCH(request: NextRequest) {
  try {
    await requireAffiliateAdmin(request);
    const input = await parseJson(request, updateCommissionSchema);
    const commission = await prisma.affiliateCommission.update({
      where: { id: input.commissionId },
      data: { status: input.status }
    });
    return ok({ commission: { id: commission.id, status: commission.status } });
  } catch (error) {
    return fail(error);
  }
}
