import { InjectionToken, inject } from '@angular/core';
import { HttpInterceptorFn } from '@angular/common/http';

export const CORRELATION_ID_HEADER = 'X-Correlation-ID';

export const CORRELATION_ID_GENERATOR = new InjectionToken<() => string>(
  'CORRELATION_ID_GENERATOR',
  { factory: () => () => crypto.randomUUID() }
);

/** Preserves an upstream correlation ID or creates one for a new request chain. */
export const correlationIdInterceptor: HttpInterceptorFn = (request, next) => {
  if (request.headers.has(CORRELATION_ID_HEADER)) {
    return next(request);
  }

  const correlationId = inject(CORRELATION_ID_GENERATOR)();
  return next(request.clone({ setHeaders: { [CORRELATION_ID_HEADER]: correlationId } }));
};
