import type { EnvironmentConfig } from "@arizeai/phoenix-config";
import {
  DEFAULT_PHOENIX_BASE_URL,
  getEnvironmentConfig,
} from "@arizeai/phoenix-config";
import type { ClientOptions } from "openapi-fetch";

/**
 * Convert a EnvironmentConfig object into a ClientOptions object.
 *
 * @param environment - The EnvironmentConfig object to convert.
 * @returns The converted ClientOptions object.
 */
const phoenixEnvironmentToClientOptions = (
  environment: EnvironmentConfig
): Partial<ClientOptions> => {
  const options: Partial<ClientOptions> = {
    baseUrl: environment.PHOENIX_HOST,
    headers: {
      ...(environment.PHOENIX_CLIENT_HEADERS ?? {}),
      ...(environment.PHOENIX_API_KEY
        ? { Authorization: `Bearer ${environment.PHOENIX_API_KEY}` }
        : {}),
    },
  };

  // if headers is an empty object, delete it
  if (options.headers && Object.keys(options.headers).length === 0) {
    delete options.headers;
  }

  // filter out undefined values
  // this will prevent clobbering over default values when merging
  return Object.fromEntries(
    Object.entries(options).filter(([_, v]) => v !== undefined)
  );
};

/**
 * Get the environment options from the environment.
 *
 * @returns The environment options as a Partial<ClientOptions> object.
 */
export const defaultGetEnvironmentOptions = (): Partial<ClientOptions> => {
  // feature detect process and process.env
  if (typeof process !== "object" || typeof process.env !== "object") {
    return {};
  }
  return phoenixEnvironmentToClientOptions(getEnvironmentConfig());
};

/**
 * Make the default client options.
 *
 * @returns The default client options as a Partial<ClientOptions> object.
 */
export const makeDefaultClientOptions = (): Partial<ClientOptions> => {
  return {
    baseUrl: DEFAULT_PHOENIX_BASE_URL,
  };
};
