import { isRecord } from "../../model/config/schema.js";

export function mergeConfigSources(...configs: unknown[]): Record<string, unknown> {
  let output: Record<string, unknown> = {};

  for (const config of configs) {
    if (config === undefined) {
      continue;
    }
    if (!isRecord(config)) {
      output = {};
      continue;
    }
    output = deepMerge(output, config);
  }

  return output;
}

function deepMerge(
  base: Record<string, unknown>,
  override: Record<string, unknown>,
): Record<string, unknown> {
  const output: Record<string, unknown> = { ...base };

  for (const [key, value] of Object.entries(override)) {
    const previous = output[key];
    if (isRecord(previous) && isRecord(value)) {
      output[key] = deepMerge(previous, value);
    } else {
      output[key] = value;
    }
  }

  return output;
}