import { NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { requireRole } from "@/lib/auth";
import { PAYMENT_METHODS, SMS_PACKAGES } from "@/lib/constants";

/** SMS purchase history + current balance. */
export async function GET() {
  const session = await requireRole("INSTITUTION_ADMIN");
  if (!session || !session.institutionId) {
    return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  }

  const [setting, purchases] = await Promise.all([
    prisma.commSetting.findUnique({
      where: { institutionId: session.institutionId },
      select: { smsBalance: true },
    }),
    prisma.smsPurchase.findMany({
      where: { institutionId: session.institutionId },
      orderBy: { createdAt: "desc" },
      take: 20,
    }),
  ]);

  return NextResponse.json({
    balance: setting?.smsBalance ?? 0,
    purchases: purchases.map((p) => ({
      id: p.id,
      quantity: p.quantity,
      price: Number(p.price),
      method: p.method,
      createdAt: p.createdAt,
    })),
  });
}

/** Purchase an SMS bundle: { quantity, method, note? } — adds to the balance. */
export async function POST(req: Request) {
  const session = await requireRole("INSTITUTION_ADMIN");
  if (!session || !session.institutionId) {
    return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  }

  try {
    const body = await req.json();
    const pack = SMS_PACKAGES.find((p) => p.qty === Number(body.quantity));
    if (!pack) return NextResponse.json({ error: "Invalid package" }, { status: 400 });

    const purchase = await prisma.$transaction(async (tx) => {
      const created = await tx.smsPurchase.create({
        data: {
          institutionId: session.institutionId!,
          quantity: pack.qty,
          price: pack.price,
          method: PAYMENT_METHODS.includes(body.method as never) ? body.method : "BKASH",
          note: String(body.note ?? "").trim() || null,
        },
      });
      await tx.commSetting.upsert({
        where: { institutionId: session.institutionId! },
        update: { smsBalance: { increment: pack.qty } },
        create: { institutionId: session.institutionId!, smsBalance: pack.qty },
      });
      return created;
    });

    return NextResponse.json({ purchase: { id: purchase.id, quantity: pack.qty } });
  } catch {
    return NextResponse.json({ error: "Could not complete purchase" }, { status: 500 });
  }
}
