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

interface WeekInput {
  id?: number;
  weekNo?: number;
  topic?: string;
  homework?: string | null;
  isDone?: boolean;
}

/** Lesson plans with their weekly breakdown. */
export async function GET() {
  const session = await requireRole("INSTITUTION_ADMIN");
  if (!session || !session.institutionId) {
    return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  }

  const plans = await prisma.lessonPlan.findMany({
    where: { institutionId: session.institutionId },
    orderBy: [{ startDate: "desc" }, { id: "desc" }],
    include: {
      staff: { select: { name: true, employeeCode: true } },
      classItem: { select: { name: true } },
      sectionItem: { select: { name: true } },
      subjectItem: { select: { name: true } },
      weeks: { orderBy: { weekNo: "asc" } },
    },
  });

  return NextResponse.json({
    plans: plans.map((p) => ({
      id: p.id,
      staffId: p.staffId,
      teacherName: p.staff?.name ?? null,
      classItemId: p.classItemId,
      className: p.classItem?.name ?? null,
      sectionItemId: p.sectionItemId,
      sectionName: p.sectionItem?.name ?? null,
      subjectItemId: p.subjectItemId,
      subjectName: p.subjectItem?.name ?? null,
      chapter: p.chapter,
      topics: p.topics,
      startDate: p.startDate.toISOString().slice(0, 10),
      endDate: p.endDate ? p.endDate.toISOString().slice(0, 10) : null,
      totalPeriods: p.totalPeriods,
      completedPeriods: p.completedPeriods,
      status: p.status,
      weeks: p.weeks.map((w) => ({
        id: w.id,
        weekNo: w.weekNo,
        topic: w.topic,
        homework: w.homework,
        isDone: w.isDone,
      })),
    })),
  });
}

function deriveStatus(completed: number, total: number): string {
  if (total > 0 && completed >= total) return "COMPLETED";
  if (completed > 0) return "IN_PROGRESS";
  return "PLANNED";
}

/** Create a lesson plan (weeks replaced wholesale when provided). */
export async function POST(req: Request) {
  const session = await requireRole("INSTITUTION_ADMIN");
  if (!session || !session.institutionId) {
    return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  }
  const institutionId = session.institutionId;

  try {
    const body = await req.json();
    const chapter = String(body.chapter ?? "").trim();
    const startDate = String(body.startDate ?? "");
    if (!chapter || !/^\d{4}-\d{2}-\d{2}$/.test(startDate)) {
      return NextResponse.json({ error: "Missing fields" }, { status: 400 });
    }
    const totalPeriods = Math.max(0, Number(body.totalPeriods) || 0);
    const completedPeriods = Math.max(0, Number(body.completedPeriods) || 0);
    const weeks: WeekInput[] = Array.isArray(body.weeks) ? body.weeks : [];

    const plan = await prisma.lessonPlan.create({
      data: {
        institutionId,
        staffId: body.staffId ? Number(body.staffId) : null,
        classItemId: body.classItemId ? Number(body.classItemId) : null,
        sectionItemId: body.sectionItemId ? Number(body.sectionItemId) : null,
        subjectItemId: body.subjectItemId ? Number(body.subjectItemId) : null,
        chapter,
        topics: String(body.topics ?? "").trim() || null,
        startDate: new Date(startDate),
        endDate: body.endDate ? new Date(String(body.endDate)) : null,
        totalPeriods,
        completedPeriods,
        status: deriveStatus(completedPeriods, totalPeriods),
        weeks: {
          create: weeks
            .filter((w) => String(w.topic ?? "").trim())
            .map((w, i) => ({
              institutionId,
              weekNo: Number(w.weekNo) || i + 1,
              topic: String(w.topic).trim(),
              homework: String(w.homework ?? "").trim() || null,
              isDone: !!w.isDone,
            })),
        },
      },
    });
    return NextResponse.json({ plan });
  } catch {
    return NextResponse.json({ error: "Could not create lesson plan" }, { status: 500 });
  }
}
