import type {NextRequest} from 'next/server'
import {NextResponse} from 'next/server'
import {cookies} from 'next/headers'

// De proxy functie wordt uitgevoerd voor elk request.
// We gebruiken deze functie hier om een uniek requestId toe te voegen aan elk request, zo kan de gebruiker het id
// meegeven aan support als er iets mis gaat.
export async function proxy(request: NextRequest): Promise<NextResponse> {
  const response = NextResponse.next()
  // Skip internal Next files and any requests for static assets (paths that end with an extension).
  if (request.nextUrl.pathname.startsWith('/_next') || request.nextUrl.pathname.match(/.*\.[^.]+$/)) return response

  const awaitedCookies = await cookies()

  // Proxy wordt uitgevoerd in een afgezonderd proces, hierdoor kunnen we geen variabelen delen tussen proxy en de rest
  // van de Node applicatie.
  // In plaats daarvan kan informatie doorgegeven worden via HTTP Headers.
  // Let op, je mag dit niet gebruiken voor grote of gevoelige informatie.
  const requestId = crypto.randomUUID()

  response.headers.set('x-request-id', requestId)
  response.headers.set('x-request-path', request.nextUrl.pathname)
  response.headers.set('x-request-method', request.method)

  // Om het id op de client weer te geven, moet dit in een cookie bewaard worden.
  // Aangezien het cookie getoond moet kunnen worden op de webpagina, moet de httpOnly vlag op false staan.
  awaitedCookies.set({
    name: 'requestId',
    value: requestId,
    httpOnly: false,
  })

  return response
}
