/**
 * This file is part of the NocoBase (R) project.
 * Copyright (c) 2020-2024 NocoBase Co., Ltd.
 * Authors: NocoBase Team.
 *
 * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
 * For more information, please refer to: https://www.nocobase.com/agreement.
 */

var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
  if (from && typeof from === "object" || typeof from === "function") {
    for (let key of __getOwnPropNames(from))
      if (!__hasOwnProp.call(to, key) && key !== except)
        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  }
  return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
  // If the importer is in node compatibility mode or this is not an ESM
  // file that has been converted to a CommonJS file using a Babel-
  // compatible transform (i.e. "__esModule" has not been set), then set
  // "default" to the CommonJS "module.exports" for node compatibility.
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
  mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var step_link_exports = {};
__export(step_link_exports, {
  assertFlowSurfaceKnownPlanStepLink: () => assertFlowSurfaceKnownPlanStepLink,
  isFlowSurfacePlanStepLink: () => isFlowSurfacePlanStepLink,
  normalizeFlowSurfacePlanStepLink: () => normalizeFlowSurfacePlanStepLink,
  replaceFlowSurfacePlanStepLinks: () => replaceFlowSurfacePlanStepLinks
});
module.exports = __toCommonJS(step_link_exports);
var import_lodash = __toESM(require("lodash"));
var import_errors = require("../errors");
var import_reference_guards = require("../reference-guards");
var import_created_keys = require("./created-keys");
const isFlowSurfacePlanStepLink = import_reference_guards.isFlowSurfacePlanStepValue;
function normalizeFlowSurfacePlanStepLink(actionName, input, fieldName) {
  return (0, import_reference_guards.normalizeFlowSurfacePlanStepValue)(actionName, input, fieldName);
}
function assertFlowSurfaceKnownPlanStepLink(actionName, stepLink, fieldName, knownStepIds) {
  if (!knownStepIds || knownStepIds.has(stepLink.step)) {
    return;
  }
  (0, import_errors.throwBadRequest)(`flowSurfaces ${actionName} ${fieldName}.step '${stepLink.step}' is not a previous step id`);
}
function replaceFlowSurfacePlanStepLinks(actionName, input, path, knownStepIds, knownRuntimeKeys, blockedRuntimeKeys) {
  if (Array.isArray(input)) {
    return input.map(
      (item, index) => replaceFlowSurfacePlanStepLinks(
        actionName,
        item,
        `${path}[${index}]`,
        knownStepIds,
        knownRuntimeKeys,
        blockedRuntimeKeys
      )
    );
  }
  if (!import_lodash.default.isPlainObject(input)) {
    return input;
  }
  (0, import_reference_guards.assertNoFlowSurfaceLegacyRef)(input, {
    actionName,
    path,
    dollarRefAllowed: "{ step, path }",
    refAllowed: "{ key } or { step, path }"
  });
  if (isFlowSurfacePlanStepLink(input)) {
    const stepLink = normalizeFlowSurfacePlanStepLink(actionName, input, path);
    assertFlowSurfaceKnownPlanStepLink(actionName, stepLink, path, knownStepIds);
    return stepLink;
  }
  if ((0, import_created_keys.isFlowSurfacePureKeyObject)(input)) {
    const runtimeKey = String(input.key || "").trim();
    if (!runtimeKey) {
      (0, import_errors.throwBadRequest)(`flowSurfaces ${actionName} ${path}.key cannot be empty`);
    }
    if (blockedRuntimeKeys == null ? void 0 : blockedRuntimeKeys.has(runtimeKey)) {
      (0, import_errors.throwBadRequest)(
        `flowSurfaces ${actionName} ${path}.key '${runtimeKey}' belongs to the current replace scope; replace-step key links cannot resolve to old replace subtree nodes`
      );
    }
    if (!(knownRuntimeKeys == null ? void 0 : knownRuntimeKeys.has(runtimeKey))) {
      (0, import_errors.throwBadRequest)(`flowSurfaces ${actionName} ${path}.key '${runtimeKey}' is not defined`);
    }
    return {
      key: runtimeKey
    };
  }
  return Object.fromEntries(
    Object.entries(input).map(([key, value]) => [
      key,
      replaceFlowSurfacePlanStepLinks(
        actionName,
        value,
        `${path}.${key}`,
        knownStepIds,
        knownRuntimeKeys,
        blockedRuntimeKeys
      )
    ])
  );
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
  assertFlowSurfaceKnownPlanStepLink,
  isFlowSurfacePlanStepLink,
  normalizeFlowSurfacePlanStepLink,
  replaceFlowSurfacePlanStepLinks
});
