import { NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { requireRole } from "@/lib/auth";
import { generateInstitutionCode } from "@/lib/institution-code";
import { sendCentralMail } from "@/lib/central-mail";
import { appBaseUrl, loginCredentialEmail } from "@/lib/email-templates";

export async function GET() {
  const session = await requireRole("SUPER_ADMIN");
  if (!session) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });

  const institutions = await prisma.institution.findMany({
    orderBy: { createdAt: "desc" },
    include: {
      parent: { select: { id: true, name: true } },
      users: { select: { name: true, email: true }, take: 1 },
      _count: { select: { subscriptions: true, requests: true, academicSelections: true } },
      subscriptions: {
        where: { status: "ACTIVE" },
        orderBy: { createdAt: "desc" },
        take: 1,
        include: { packagePlan: { select: { name: true } } },
      },
    },
  });

  return NextResponse.json({
    institutions: institutions.map((i) => ({
      ...i,
      parentId: i.parentId,
      parentName: i.parent?.name ?? null,
    })),
  });
}

/** Create a branch under a parent institution (with its branch admin). */
export async function POST(req: Request) {
  const session = await requireRole("SUPER_ADMIN");
  if (!session) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });

  try {
    const bcrypt = (await import("bcryptjs")).default;
    const body = await req.json();
    const parentId = Number(body.parentId);
    const name = String(body.name ?? "").trim();
    const email = String(body.email ?? "").trim().toLowerCase();
    const adminName = String(body.adminName ?? "").trim();
    const adminPassword = String(body.adminPassword ?? "");

    if (!parentId || !name || !email || !adminName || adminPassword.length < 6) {
      return NextResponse.json({ error: "Missing fields" }, { status: 400 });
    }

    const parent = await prisma.institution.findUnique({ where: { id: parentId } });
    if (!parent) return NextResponse.json({ error: "Parent not found" }, { status: 404 });
    if (parent.parentId) {
      return NextResponse.json({ error: "NO_NESTED_BRANCHES" }, { status: 400 });
    }

    const emailTaken = await prisma.user.findUnique({ where: { email } });
    if (emailTaken) return NextResponse.json({ error: "EMAIL_EXISTS" }, { status: 409 });

    const branch = await prisma.$transaction(async (tx) => {
      const code = await generateInstitutionCode(parent.type);
      const created = await tx.institution.create({
        data: {
          name,
          code,
          type: parent.type,
          isGovernment: parent.isGovernment,
          email,
          phone: String(body.phone ?? "").trim(),
          address: parent.address,
          district: String(body.district ?? "").trim() || parent.district,
          subDistrict: String(body.subDistrict ?? "").trim() || parent.subDistrict,
          parentId,
          status: "ACTIVE",
        },
      });
      await tx.user.create({
        data: {
          name: adminName,
          email,
          passwordHash: await bcrypt.hash(adminPassword, 10),
          role: "INSTITUTION_ADMIN",
          institutionId: created.id,
        },
      });
      return created;
    });

    // Login credentials to the new branch admin — never blocks the creation
    try {
      const tpl = loginCredentialEmail({
        toName: adminName,
        institutionName: name,
        parentInstitutionName: parent.name,
        code: branch.code,
        email,
        password: adminPassword,
        loginUrl: `${appBaseUrl()}/login`,
      });
      await sendCentralMail({
        to: email,
        subject: tpl.subject,
        html: tpl.html,
        text: tpl.text,
        institutionId: branch.id,
      });
    } catch (err) {
      console.error("branch-credential-mail-failed", err);
    }

    return NextResponse.json({ branch });
  } catch {
    return NextResponse.json({ error: "Could not create branch" }, { status: 500 });
  }
}
