/**
 * @file Supplementary OpenAPI fragments merged into the base spec by
 * `createOpenApiSpec()` (server/openapi.js). Each domain fragment under
 * `server/openapi-extra/` exports `{ tags, schemas, paths }`; this module
 * deep-combines them into one `{ tags, schemas, paths }` object. Extra paths
 * and schemas OVERRIDE base entries with the same key, so a comprehensive
 * entry here can supersede a terser one in the base literal; tags are appended
 * only when their `name` is not already present.
 * @author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
 */

// New endpoint groups (previously-undocumented gaps in the base spec).
const ccConfig = require("./openapi-extra/cc-config");
const run = require("./openapi-extra/run");
const lanes = require("./openapi-extra/lanes");
const push = require("./openapi-extra/push");
const misc = require("./openapi-extra/misc");
// Enriched overrides of already-documented endpoints — same operationId, tags,
// and request/response `$ref` schemas as the base, with added examples and
// richer descriptions. Listed last so they win the merge.
const overrideSessionsAgents = require("./openapi-extra/override-sessions-agents");
const overrideCore = require("./openapi-extra/override-core");
const overridePricingAlerts = require("./openapi-extra/override-pricing-alerts");
const overrideOps = require("./openapi-extra/override-ops");

/** Combine N fragments into a single { tags, schemas, paths }. Later fragments
 *  override earlier ones on path/schema key collisions; tags dedupe by name. */
function combine(...fragments) {
  const out = { tags: [], schemas: {}, paths: {} };
  const tagNames = new Set();
  for (const frag of fragments) {
    if (!frag) continue;
    for (const tag of frag.tags || []) {
      if (tag && !tagNames.has(tag.name)) {
        tagNames.add(tag.name);
        out.tags.push(tag);
      }
    }
    Object.assign(out.schemas, frag.schemas || {});
    Object.assign(out.paths, frag.paths || {});
  }
  return out;
}

module.exports = combine(
  ccConfig,
  run,
  lanes,
  push,
  misc,
  overrideSessionsAgents,
  overrideCore,
  overridePricingAlerts,
  overrideOps
);
