import { NextResponse } from 'next/server'
import {
    getVisitesMedicalesFeed,
    createVisiteMedicaleFeed,
} from '@/server/visites-medicales.server'
import {
    visiteMedicaleListQuerySchema,
    visiteMedicaleCreateSchema,
} from '@/validators/visites-medicales'
import { requireAuth } from '@/lib/requireAuth'

export async function GET(request: Request) {
    const authError = requireAuth(request)

    if (authError) {
        return authError
    }
    const { searchParams } = new URL(request.url)
    const queryParams = {
        limit: searchParams.get('limit') || '10',
        offset: searchParams.get('offset') || '0',
    }

    const parsed = visiteMedicaleListQuerySchema.safeParse(queryParams)
    if (!parsed.success) {
        return NextResponse.json(
            { message: 'Invalid query parameters', errors: parsed.error.flatten() },
            { status: 400 }
        )
    }

    const { items, count } = await getVisitesMedicalesFeed(parsed.data.limit, parsed.data.offset)

    return NextResponse.json(
        {
            message: 'Visites médicales retrieved successfully',
            items,
            count,
        },
        { status: 200 }
    )
}

export async function POST(request: Request) {
    const authError = requireAuth(request)

    if (authError) {
        return authError
    }
    let body: unknown

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

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

    try {
        const { visiteMedicale } = await createVisiteMedicaleFeed(parsed.data)
        return NextResponse.json(
            { message: 'Visite médicale created successfully', visiteMedicale },
            { status: 201 }
        )
    } catch (error) {
        if (error instanceof Error) {
            if (error.message.includes('Foreign key constraint failed')) {
                return NextResponse.json(
                    { message: 'Invalid id_salarie: employee does not exist' },
                    { status: 400 }
                )
            }
        }
        throw error
    }
}
