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

/** Book catalog + library dashboard stats. */
export async function GET() {
  const session = await requireRole("INSTITUTION_ADMIN");
  if (!session || !session.institutionId) {
    return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  }

  const [books, activeIssues, fines] = await Promise.all([
    prisma.book.findMany({
      where: { institutionId: session.institutionId },
      orderBy: { id: "asc" },
      include: { _count: { select: { issues: { where: { status: "ISSUED" } } } } },
    }),
    prisma.bookIssue.findMany({
      where: { institutionId: session.institutionId, status: "ISSUED" },
      select: { dueDate: true },
    }),
    prisma.bookIssue.aggregate({
      where: { institutionId: session.institutionId, status: "RETURNED" },
      _sum: { fine: true },
    }),
  ]);

  const today = new Date(new Date().toISOString().slice(0, 10));
  const overdue = activeIssues.filter((i) => i.dueDate < today).length;
  const totalCopies = books.reduce((sum, b) => sum + b.totalCopies, 0);
  const availableCopies = books.reduce((sum, b) => sum + b.availableCopies, 0);

  return NextResponse.json({
    stats: {
      titles: books.length,
      totalCopies,
      available: availableCopies,
      issued: totalCopies - availableCopies,
      overdue,
      fines: Number(fines._sum.fine ?? 0),
    },
    books: books.map((b) => ({
      id: b.id,
      title: b.title,
      titleBn: b.titleBn,
      author: b.author,
      publisher: b.publisher,
      isbn: b.isbn,
      category: b.category,
      shelf: b.shelf,
      totalCopies: b.totalCopies,
      availableCopies: b.availableCopies,
      price: Number(b.price),
      activeIssues: b._count.issues,
    })),
  });
}

/** Add a book to the catalog. */
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 title = String(body.title ?? "").trim();
    const author = String(body.author ?? "").trim();
    const totalCopies = Math.max(1, Number(body.totalCopies) || 1);
    if (!title || !author) {
      return NextResponse.json({ error: "Missing fields" }, { status: 400 });
    }

    const book = await prisma.book.create({
      data: {
        institutionId: session.institutionId,
        title,
        titleBn: String(body.titleBn ?? "").trim() || null,
        author,
        publisher: String(body.publisher ?? "").trim() || null,
        isbn: String(body.isbn ?? "").trim() || null,
        category: BOOK_CATEGORIES.includes(body.category as never) ? body.category : "OTHER",
        shelf: String(body.shelf ?? "").trim() || null,
        totalCopies,
        availableCopies: totalCopies,
        price: body.price !== undefined ? Number(body.price) : 0,
      },
    });
    return NextResponse.json({ book });
  } catch {
    return NextResponse.json({ error: "Could not create book" }, { status: 500 });
  }
}
