import { NextResponse } from "next/server"
import { auth } from "@/lib/auth"
import { leaveRequestSchema, leaveRequestActionSchema } from "@/features/leave/schema"
import {
  deleteLeaveRequest,
  getLeaveRequestById,
  processLeaveRequest,
  updateLeaveRequest,
} from "@/features/leave/service"
import { userCanProcessLeave } from "@/lib/leave-approval"
import { ZodError } from "zod"

export const runtime = "nodejs"

export async function GET(
  req: Request,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const session = await auth()
    if (!session) {
      return NextResponse.json({ error: "Unauthorized" }, { status: 401 })
    }

    const { id } = await params
    const request = await getLeaveRequestById(id)
    if (!request) {
      return NextResponse.json({ error: "Leave request not found" }, { status: 404 })
    }

    return NextResponse.json(request)
  } catch (error) {
    console.error("Error fetching leave request:", error)
    return NextResponse.json({ error: "Failed to fetch leave request" }, { status: 500 })
  }
}

export async function PUT(
  req: Request,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const session = await auth()
    if (!session) {
      return NextResponse.json({ error: "Unauthorized" }, { status: 401 })
    }

    const { id } = await params
    const body = await req.json()
    const validated = leaveRequestSchema.parse(body)

    const request = await updateLeaveRequest(id, validated)
    return NextResponse.json(request)
  } 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 updating leave request:", error)
    return NextResponse.json({ error: "Failed to update leave request" }, { status: 500 })
  }
}

export async function DELETE(
  req: Request,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const session = await auth()
    if (!session) {
      return NextResponse.json({ error: "Unauthorized" }, { status: 401 })
    }

    const { id } = await params
    await deleteLeaveRequest(id)
    return NextResponse.json({ success: true })
  } catch (error) {
    console.error("Error deleting leave request:", error)
    return NextResponse.json(
      { error: error instanceof Error ? error.message : "Failed to delete leave request" },
      { status: 500 }
    )
  }
}

export async function PATCH(
  req: Request,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const session = await auth()
    if (!session) {
      return NextResponse.json({ error: "Unauthorized" }, { status: 401 })
    }

    const { id } = await params
    const body = await req.json()
    const validated = leaveRequestActionSchema.parse(body)

    const canProcess = await userCanProcessLeave(session.user.id)
    if (!canProcess) {
      return NextResponse.json(
        { error: "You do not have permission to process leave requests" },
        { status: 403 },
      )
    }

    const request = await processLeaveRequest(id, validated, session.user.id)
    return NextResponse.json(request)
  } 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 processing leave request:", error)
    return NextResponse.json(
      { error: error instanceof Error ? error.message : "Failed to process leave request" },
      { status: 500 }
    )
  }
}
