import { NextRequest, NextResponse } from "next/server"
import { auth } from "@/lib/auth"
import { employeeSchema } from "@/features/employees/schema"
import { createEmployee, listEmployees } from "@/features/employees/service"
import { ZodError } from "zod"
import { db } from "@/lib/db"
import type { PrismaClient } from "@prisma/client"

const prisma = db as PrismaClient

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 forManagers = searchParams.get("managers") // /api/employees?managers=1&branchId=...

    // Managers cascade: /api/employees?managers=1&branchId=xxx[&departmentId=yyy&subDepartmentId=zzz]
    if (forManagers) {
      const branchId        = searchParams.get("branchId")
      const departmentId    = searchParams.get("departmentId")
      const subDepartmentId = searchParams.get("subDepartmentId")

      const where: Record<string, unknown> = {}
      if (branchId)        where.branchId        = branchId
      if (departmentId)    where.departmentId    = departmentId
      if (subDepartmentId) where.subDepartmentId = subDepartmentId

      const managers = await prisma.employee.findMany({
        where,
        orderBy: { fullName: "asc" },
        select: { id: true, fullName: true },
      })
      return NextResponse.json(managers)
    }

    // Default — full employee list for the employees table
    const employees = await listEmployees()
    return NextResponse.json(employees)
  } catch (error) {
    console.error("Error fetching employees:", error)
    return NextResponse.json({ error: "Failed to fetch employees" }, { 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 = employeeSchema.parse(body)

    const employee = await createEmployee(validated)
    return NextResponse.json(employee, { status: 201 })
  } catch (error) {
    if (error instanceof ZodError) {
      return NextResponse.json(
        { error: "Validation failed", details: error.errors.map((e) => ({ path: e.path, message: e.message })) },
        { status: 400 }
      )
    }
    console.error("Error creating employee:", error)
    return NextResponse.json({ error: "Failed to create employee" }, { status: 500 })
  }
}