export const InternalHeaders = {
  NFDebugLogging: 'x-nf-debug-logging',
  NFRequestID: 'x-nf-request-id',
}

// Next 13 supports request header mutations and has the side effect of prepending header values with 'x-middleware-request'
// as part of invoking NextResponse.next() in the middleware. We need to remove that before sending the response the user
// as the code that removes it in Next isn't run based on how we handle the middleware
//
// Related Next.js code:
// * https://github.com/vercel/next.js/blob/68d06fe015b28d8f81da52ca107a5f4bd72ab37c/packages/next/server/next-server.ts#L1918-L1928
// * https://github.com/vercel/next.js/blob/43c9d8940dc42337dd2f7d66aa90e6abf952278e/packages/next/server/web/spec-extension/response.ts#L10-L27
export function updateModifiedHeaders(requestHeaders: Headers, responseHeaders: Headers) {
  const overriddenHeaders = responseHeaders.get('x-middleware-override-headers')
  if (!overriddenHeaders) {
    return
  }

  const headersToUpdate = new Set(overriddenHeaders.split(',').map((header) => header.trim()))

  // We can't iterate this directly, because we modify the headers in the loop.
  // This was causing values to be skipped. By spreading them first we avoid that.
  for (const key of [...requestHeaders.keys()]) {
    if (!headersToUpdate.has(key)) {
      requestHeaders.delete(key)
    }
  }

  for (const header of headersToUpdate) {
    const oldHeaderKey = 'x-middleware-request-' + header
    const headerValue = responseHeaders.get(oldHeaderKey) || ''

    const oldValue = requestHeaders.get(header) || ''

    if (oldValue !== headerValue) {
      if (headerValue) {
        requestHeaders.set(header, headerValue)
      } else {
        requestHeaders.delete(header)
      }
    }
    responseHeaders.delete(oldHeaderKey)
  }
  responseHeaders.delete('x-middleware-override-headers')
}