import { NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { requireAnyRole, MEMBER_ROLES } from "@/lib/auth";
import { getMemberStudentId } from "@/lib/member";
import { COMPLAINT_CATEGORIES } from "@/lib/constants";

/** Member complaints: list + submit. Students/parents are scoped by their
    student link, teachers/staff by the login that filed the complaint
    (Complaint.createdByUserId). Everyone sees the institution's response. */
export async function GET() {
  const session = await requireAnyRole(MEMBER_ROLES);
  if (!session || !session.institutionId) {
    return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  }

  let where: { studentId?: number; createdByUserId?: number };
  if (session.role === "STUDENT" || session.role === "PARENT") {
    const studentId = await getMemberStudentId(session.userId);
    if (!studentId) {
      return NextResponse.json({ error: "NO_LINKED_STUDENT" }, { status: 409 });
    }
    where = { studentId };
  } else {
    where = { createdByUserId: session.userId };
  }

  const complaints = await prisma.complaint.findMany({
    where,
    orderBy: { createdAt: "desc" },
    select: {
      id: true,
      category: true,
      subject: true,
      description: true,
      status: true,
      responseNote: true,
      resolvedAt: true,
      createdAt: true,
    },
  });

  return NextResponse.json({ complaints });
}

export async function POST(req: Request) {
  const session = await requireAnyRole(MEMBER_ROLES);
  if (!session || !session.institutionId) {
    return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  }

  try {
    const isStudentSide = session.role === "STUDENT" || session.role === "PARENT";
    const studentId = isStudentSide ? await getMemberStudentId(session.userId) : null;
    if (isStudentSide && !studentId) {
      return NextResponse.json({ error: "NO_LINKED_STUDENT" }, { status: 409 });
    }

    const body = await req.json();
    const category = String(body.category ?? "");
    const subject = String(body.subject ?? "").trim();
    const description = String(body.description ?? "").trim();

    if (!subject || !description) {
      return NextResponse.json({ error: "MISSING_FIELDS" }, { status: 400 });
    }
    if (!(COMPLAINT_CATEGORIES as readonly string[]).includes(category)) {
      return NextResponse.json({ error: "INVALID_CATEGORY" }, { status: 400 });
    }

    const complaint = await prisma.complaint.create({
      data: {
        institutionId: session.institutionId,
        complainantType: isStudentSide ? session.role : "STAFF",
        complainantName: session.name,
        studentId: isStudentSide ? studentId : null,
        createdByUserId: session.userId,
        category,
        subject,
        description,
      },
      select: { id: true, subject: true, status: true, createdAt: true },
    });

    return NextResponse.json({ complaint }, { status: 201 });
  } catch {
    return NextResponse.json({ error: "Could not submit complaint" }, { status: 500 });
  }
}
