import { NextResponse } from 'next/server'
import {
  getVisiteMedicaleDetails,
  updateVisiteMedicaleFeed,
  deleteVisiteMedicaleFeed,
} from '@/server/visites-medicales.server'
import { visiteMedicaleUpdateSchema } from '@/validators/visites-medicales'
import { requireAuth } from '@/lib/requireAuth'

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

function parseId(idParam: string) {
  const id = Number(idParam)
  if (!Number.isInteger(id)) {
    return null
  }

  return id
}

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

      if (authError) {
        return authError
      }
  const { id: idParam } = await params
  const id = parseId(idParam)

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

  const { visiteMedicale } = await getVisiteMedicaleDetails(id)

  if (!visiteMedicale) {
    return NextResponse.json(
      { message: 'Visite médicale not found' },
      { status: 404 }
    )
  }

  return NextResponse.json(
    { message: 'Visite médicale retrieved successfully', visiteMedicale },
    { status: 200 }
  )
}

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

      if (authError) {
        return authError
      }
  const { id: idParam } = await params
  const id = parseId(idParam)

  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 = visiteMedicaleUpdateSchema.safeParse(body)
  if (!parsed.success) {
    return NextResponse.json(
      { message: 'Validation error', errors: parsed.error.flatten() },
      { status: 400 }
    )
  }

  const { visiteMedicale } = await updateVisiteMedicaleFeed(id, parsed.data)

  if (!visiteMedicale) {
    return NextResponse.json(
      { message: 'Visite médicale not found' },
      { status: 404 }
    )
  }

  return NextResponse.json(
    { message: 'Visite médicale updated successfully', visiteMedicale },
    { status: 200 }
  )
}

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

      if (authError) {
        return authError
      }
  const { id: idParam } = await params
  const id = parseId(idParam)

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

  let visiteMedicale

  try {
    ({ visiteMedicale } = await deleteVisiteMedicaleFeed(id))
  } catch {
    return NextResponse.json(
      { message: 'Internal Server Error' },
      { status: 500 }
    )
  }

  if (!visiteMedicale) {
    return NextResponse.json(
      { message: 'Visite médicale not found' },
      { status: 404 }
    )
  }

  return NextResponse.json(
    { message: 'Visite médicale deleted successfully', visiteMedicale },
    { status: 200 }
  )
}
