/**
 * 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 executor_exports = {};
__export(executor_exports, {
  executeMutateOps: () => executeMutateOps,
  inspectFlowSurfaceValueKey: () => inspectFlowSurfaceValueKey,
  resolveFlowSurfaceValueKeys: () => resolveFlowSurfaceValueKeys
});
module.exports = __toCommonJS(executor_exports);
var import_lodash = __toESM(require("lodash"));
var import_errors = require("./errors");
var import_reference_guards = require("./reference-guards");
var import_created_keys = require("./planning/created-keys");
async function executeMutateOps(ops, ctx, dispatcher) {
  const results = [];
  for (const op of ops) {
    const resolvedValues = resolveFlowSurfaceValueKeys(
      import_lodash.default.cloneDeep({
        ...op.target ? { target: op.target } : {},
        ...op.values || {}
      }),
      ctx.keys
    );
    const result = await dispatcher(op, resolvedValues, ctx);
    if (op.opId) {
      ctx.keys.set(op.opId, result);
    }
    results.push({ opId: op.opId, result });
  }
  return results;
}
function resolveFlowSurfaceValueKeys(input, keys) {
  if (Array.isArray(input)) {
    return input.map((item) => resolveFlowSurfaceValueKeys(item, keys));
  }
  if (import_lodash.default.isPlainObject(input)) {
    (0, import_reference_guards.assertNoFlowSurfaceLegacyRef)(input, {
      actionName: "mutate",
      path: "values",
      dollarRefAllowed: "{ key } or { step, path }",
      refAllowed: "{ key } or { step, path }"
    });
    if ((0, import_reference_guards.isFlowSurfacePlanStepValue)(input)) {
      return readStepResult(input, keys);
    }
    if ((0, import_created_keys.isFlowSurfacePureKeyObject)(input)) {
      return readKey(input.key, keys);
    }
    return Object.fromEntries(
      Object.entries(input).map(([key, value]) => [key, resolveFlowSurfaceValueKeys(value, keys)])
    );
  }
  return input;
}
function inspectFlowSurfaceValueKey(path, keys) {
  const trimmedPath = String(path || "").trim();
  if (!trimmedPath) {
    throw new import_errors.FlowSurfaceBadRequestError(`flowSurfaces mutate key cannot be empty`);
  }
  if (keys.has(trimmedPath)) {
    return {
      found: true,
      value: keys.get(trimmedPath)
    };
  }
  return {
    found: false,
    missingHead: trimmedPath
  };
}
function readKey(path, keys) {
  const resolved = inspectFlowSurfaceValueKey(path, keys);
  if (!resolved.found) {
    throw new import_errors.FlowSurfaceBadRequestError(`flowSurfaces mutate key '${resolved.missingHead}' not found`);
  }
  return resolved.value;
}
function readStepResult(input, keys) {
  const step = String(input.step || "").trim();
  if (!step) {
    throw new import_errors.FlowSurfaceBadRequestError(`flowSurfaces mutate step cannot be empty`);
  }
  if (!keys.has(step)) {
    throw new import_errors.FlowSurfaceBadRequestError(`flowSurfaces mutate step '${step}' not found`);
  }
  const value = keys.get(step);
  const path = import_lodash.default.isUndefined(input.path) ? void 0 : String(input.path || "").trim();
  if (import_lodash.default.has(input, "path") && !path) {
    throw new import_errors.FlowSurfaceBadRequestError(`flowSurfaces mutate path cannot be empty`);
  }
  return path ? import_lodash.default.get(value, path) : value;
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
  executeMutateOps,
  inspectFlowSurfaceValueKey,
  resolveFlowSurfaceValueKeys
});
