import { NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { requireRole } from "@/lib/auth";
import { NOTICE_AUDIENCES } from "@/lib/constants";
import { groupsForNoticeAudience, pushNotification } from "@/lib/notify-push";

/** Notice board: stats + notices (pinned first). */
export async function GET() {
  const session = await requireRole("INSTITUTION_ADMIN");
  if (!session || !session.institutionId) {
    return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  }
  const today = new Date(new Date().toISOString().slice(0, 10));

  const notices = await prisma.notice.findMany({
    where: { institutionId: session.institutionId },
    orderBy: [{ isPinned: "desc" }, { publishDate: "desc" }, { id: "desc" }],
  });

  const active = notices.filter((n) => n.isActive && (!n.expiryDate || n.expiryDate >= today));
  return NextResponse.json({
    stats: {
      total: notices.length,
      active: active.length,
      pinned: notices.filter((n) => n.isPinned && n.isActive).length,
      expired: notices.length - active.length,
    },
    notices: notices.map((n) => ({
      id: n.id,
      title: n.title,
      titleBn: n.titleBn,
      body: n.body,
      audience: n.audience,
      publishDate: n.publishDate.toISOString().slice(0, 10),
      expiryDate: n.expiryDate ? n.expiryDate.toISOString().slice(0, 10) : null,
      isPinned: n.isPinned,
      isActive: n.isActive,
      expired: !!(n.expiryDate && n.expiryDate < today),
    })),
  });
}

/** Publish a notice. */
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 text = String(body.body ?? "").trim();
    if (!title || !text) return NextResponse.json({ error: "Missing fields" }, { status: 400 });

    const notice = await prisma.notice.create({
      data: {
        institutionId: session.institutionId,
        title,
        titleBn: String(body.titleBn ?? "").trim() || null,
        body: text,
        audience: NOTICE_AUDIENCES.includes(body.audience as never) ? body.audience : "ALL",
        publishDate: body.publishDate ? new Date(String(body.publishDate)) : new Date(),
        expiryDate: body.expiryDate ? new Date(String(body.expiryDate)) : null,
        isPinned: !!body.isPinned,
        isActive: true,
      },
    });

    // push notification to the chosen recipient groups (falls back to the
    // notice-board audience when the picker is absent)
    const groups: string[] = Array.isArray(body.notifyGroups)
      ? body.notifyGroups.map(String)
      : groupsForNoticeAudience(notice.audience);
    await pushNotification({
      institutionId: session.institutionId,
      kind: "NOTICE",
      title: notice.title,
      body: text.slice(0, 300),
      link: "/me/notices",
      audience: groups,
      refId: notice.id,
      createdById: session.userId,
    });

    return NextResponse.json({ notice });
  } catch {
    return NextResponse.json({ error: "Could not create notice" }, { status: 500 });
  }
}
