import { NextResponse } from 'next/server'
import {
  deleteDisciplinaireFeed,
  getDisciplinaireDetails,
  updateDisciplinaireFeed,
} from '@/server/disciplinaire.server'
import { disciplinaireUpdateSchema } from '@/validators/disciplinaires'
import { requireAuth } from '@/lib/requireAuth'

type RouteContext = {
  params: Promise<{ id: string }>
}

function parseId(value: string) {
  const id = Number(value)
  return Number.isInteger(id) && id > 0 ? id : null
}

export async function GET(request: Request, { params }: RouteContext) {
  const authError = requireAuth(request)
  if (authError) return authError

  const id = parseId((await params).id)

  if (id === null) {
    return NextResponse.json(
      { message: 'Invalid id parameter' },
      { status: 400 },
    )
  }

  const { disciplinaire } = await getDisciplinaireDetails(id)

  if (!disciplinaire) {
    return NextResponse.json(
      { message: 'Disciplinaire not found' },
      { status: 404 },
    )
  }

  return NextResponse.json(
    { message: 'Disciplinaire retrieved successfully', disciplinaire },
    { status: 200 },
  )
}

export async function PUT(request: Request, { params }: RouteContext) {
  const authError = requireAuth(request)
  if (authError) return authError

  const id = parseId((await params).id)

  if (id === null) {
    return NextResponse.json(
      { message: 'Invalid id parameter' },
      { status: 400 },
    )
  }

  let body: unknown

  try {
    body = await request.json()
  } catch {
    return NextResponse.json(
      { message: 'Invalid JSON body' },
      { status: 400 },
    )
  }

  const parsed = disciplinaireUpdateSchema.safeParse(body)

  if (!parsed.success) {
    return NextResponse.json(
      { message: 'Validation error', errors: parsed.error.flatten() },
      { status: 400 },
    )
  }

  const { disciplinaire } = await updateDisciplinaireFeed(id, parsed.data)

  if (!disciplinaire) {
    return NextResponse.json(
      { message: 'Disciplinaire not found' },
      { status: 404 },
    )
  }

  return NextResponse.json(
    { message: 'Disciplinaire updated successfully', disciplinaire },
    { status: 200 },
  )
}

export async function DELETE(request: Request, { params }: RouteContext) {
  const authError = requireAuth(request)
  if (authError) return authError

  const id = parseId((await params).id)

  if (id === null) {
    return NextResponse.json(
      { message: 'Invalid id parameter' },
      { status: 400 },
    )
  }

  const { disciplinaire } = await deleteDisciplinaireFeed(id)

  if (!disciplinaire) {
    return NextResponse.json(
      { message: 'Disciplinaire not found' },
      { status: 404 },
    )
  }

  return NextResponse.json(
    { message: 'Disciplinaire deleted successfully', disciplinaire },
    { status: 200 },
  )
}