/** Injection token carrying the resolved {@link ExchangeOptions}. */
export const EXCHANGE_OPTIONS = Symbol("EXCHANGE_OPTIONS");

/** Configuration for the {@link ExchangeService} and its CBE provider. */
export interface ExchangeOptions {
  /**
   * ethio.forex CBET page scraped for USD buying/selling rates.
   * @default 'https://ethio.forex/bank/CBET'
   */
  scrapeUrl?: string;

  /**
   * Base USD→ETB rate used when scraping fails and no previously cached rate
   * exists. The ETB→USD direction is derived as its inverse.
   * @default 130
   */
  fallbackRate?: number;

  /**
   * How long a successfully fetched rate is cached, in milliseconds.
   * @default 3_600_000 (1 hour)
   */
  cacheTtlMs?: number;

  /**
   * Timeout for the scrape HTTP request, in milliseconds.
   * @default 8_000
   */
  requestTimeoutMs?: number;
}

/** Defaults applied to any unset {@link ExchangeOptions} field. */
export const EXCHANGE_DEFAULTS: Required<ExchangeOptions> = {
  scrapeUrl: "https://ethio.forex/bank/CBET",
  fallbackRate: 130,
  cacheTtlMs: 3_600_000,
  requestTimeoutMs: 8_000,
};

/** Factory contract for {@link ExchangeModule.forRootAsync}. */
export interface ExchangeAsyncOptions {
  /** Providers to inject into {@link useFactory} (e.g. `[ConfigService]`). */
  inject?: unknown[];
  /** Returns the options, possibly async. */
  useFactory: (...args: never[]) => ExchangeOptions | Promise<ExchangeOptions>;
}
