import { NextResponse } from "next/server"
import { auth } from "@/lib/auth"
import { payrollProcessSchema, payrollSchema } from "@/features/payroll/schema"
import { deletePayroll, getPayrollById, processPayroll, updatePayroll } from "@/features/payroll/service"
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 payroll = await getPayrollById(id)

    if (!payroll) {
      return NextResponse.json({ error: "Payroll not found" }, { status: 404 })
    }

    return NextResponse.json(payroll)
  } catch (error) {
    console.error("Error fetching payroll:", error)
    return NextResponse.json({ error: "Failed to fetch payroll" }, { 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 = payrollSchema.parse(body)

    const payroll = await updatePayroll(id, validated)
    return NextResponse.json(payroll)
  } 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 }
      )
    }
    if (error instanceof Error) {
      return NextResponse.json({ error: error.message }, { status: 400 })
    }
    console.error("Error updating payroll:", error)
    return NextResponse.json({ error: "Failed to update payroll" }, { 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 deletePayroll(id)
    return NextResponse.json({ success: true })
  } catch (error) {
    if (error instanceof Error) {
      return NextResponse.json({ error: error.message }, { status: 400 })
    }
    console.error("Error deleting payroll:", error)
    return NextResponse.json({ error: "Failed to delete payroll" }, { 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 = payrollProcessSchema.parse(body)

    if (!session.user?.id) {
      return NextResponse.json({ error: "User ID not found" }, { status: 401 })
    }

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