import { NextRequest, NextResponse } from "next/server"
import { auth } from "@/lib/auth"
import { departmentInputSchema } from "@/features/departments/schema"
import { createDepartment, listDepartmentsWithChildren } from "@/features/departments/service"
import { db } from "@/lib/db"
import type { PrismaClient } from "@prisma/client"

const prisma = db as PrismaClient as unknown as any

export const runtime = "nodejs"

export async function GET(req: NextRequest) {
  try {
    const session = await auth()
    if (!session) return NextResponse.json({ error: "Unauthorized" }, { status: 401 })

    const { searchParams } = new URL(req.url)
    const branchId = searchParams.get("branchId")
    const departmentId = searchParams.get("departmentId") // ← new

    // Sub-departments cascade: /api/departments?departmentId=xxx
    if (departmentId) {
      const subDepartments = await prisma.subDepartment.findMany({
        where: { departmentId },
        orderBy: { name: "asc" },
        select: { id: true, name: true },
      })
      return NextResponse.json(subDepartments)
    }

    // Departments cascade: /api/departments?branchId=xxx
    if (branchId) {
      const departments = await prisma.department.findMany({
        where: { branchId },
        orderBy: { name: "asc" },
        select: { id: true, name: true },
      })
      return NextResponse.json(departments)
    }

    // Default — full list with children for the departments management page
    const departments = await listDepartmentsWithChildren()
    return NextResponse.json(departments)
  } catch (error) {
    console.error("Error fetching departments:", error)
    return NextResponse.json({ error: "Failed to fetch departments" }, { status: 500 })
  }
}

export async function POST(req: Request) {
  try {
    const session = await auth()
    if (!session) return NextResponse.json({ error: "Unauthorized" }, { status: 401 })

    const body = await req.json()
    const validated = departmentInputSchema.parse(body)

    const department = await createDepartment(validated)
    return NextResponse.json(department, { status: 201 })
  } catch (error) {
    if (error instanceof Error && error.name === "ZodError") {
      return NextResponse.json({ error: "Validation failed", details: error }, { status: 400 })
    }
    console.error("Error creating department:", error)
    return NextResponse.json({ error: "Failed to create department" }, { status: 500 })
  }
}