{
  "version": 3,
  "sources": ["../../../../../src/functions/text/right/right.ts"],
  "sourcesContent": [
    "import {\n  FormulaError,\n  type CellAddress,\n  type CellString,\n  type ErrorEvaluationResult,\n  type FunctionDefinition,\n  type FunctionEvaluationResult,\n  type SingleEvaluationResult,\n  type SpilledValuesEvaluationResult,\n  type SpreadsheetRange,\n} from \"../../../core/types.mjs\";\nimport type { EvaluationContext } from \"../../../evaluator/evaluation-context.mjs\";\nimport { FormulaEvaluator } from \"../../../evaluator/formula-evaluator.mjs\";\nimport {\n  convertToString,\n  extractNumericValue,\n  midOperation\n} from \"../text-helpers.mjs\";\n\n/**\n * RIGHT function - Returns the rightmost characters from a text string\n *\n * Usage: RIGHT(text, num_chars)\n *\n * text: The text string to extract characters from.\n * num_chars: The number of characters to extract from the right side of the text.\n *\n * Example: RIGHT(\"Hello, World!\", 6) returns \"World!\"\n *\n * Note:\n * - If num_chars is less than 0, the function returns an error.\n * - If num_chars is greater than the length of text, the function returns the entire text.\n * - Supports dynamic arrays (spilled values) for both arguments\n * - Strict type checking: text must be string, num_chars must be number\n * - Implemented as MID(text, LEN(text) - num_chars + 1, num_chars)\n */\n\n/**\n * Helper function to calculate RIGHT operation using MID\n */\nfunction rightOperation(\n  textResult: FunctionEvaluationResult,\n  numCharsResult: FunctionEvaluationResult,\n  context: EvaluationContext\n): { type: \"value\"; result: CellString } | ErrorEvaluationResult {\n  const textStr = convertToString(textResult, context);\n  const numChars = extractNumericValue(numCharsResult, context);\n\n  // Check if any of the results are awaiting evaluation or errors\n  if (\n    typeof textStr === \"object\" &&\n    (textStr.type === \"awaiting-evaluation\" || textStr.type === \"error\")\n  ) {\n    return textStr;\n  }\n  if (\n    typeof numChars === \"object\" &&\n    (numChars.type === \"awaiting-evaluation\" || numChars.type === \"error\")\n  ) {\n    return numChars;\n  }\n\n  // At this point, all values should be primitive types\n  const textValue = textStr as string;\n  const numCharsValue = numChars as number;\n\n  // Validate numChars\n  if (numCharsValue < 0) {\n    return {\n      type: \"error\",\n      err: FormulaError.VALUE,\n      message: \"NumChars argument must be a positive number\",\n      errAddress: context.dependencyNode,\n    };\n  }\n\n  // Calculate start position: LEN(text) - num_chars + 1\n  const textLength = textValue.length;\n  const startPos = Math.max(1, textLength - Math.floor(numCharsValue) + 1);\n\n  // Create start_num result\n  const startNumResult: FunctionEvaluationResult = {\n    type: \"value\",\n    result: { type: \"number\", value: startPos },\n  };\n\n  // Use MID operation\n  return midOperation(textResult, startNumResult, numCharsResult, context);\n}\n\nexport const RIGHT: FunctionDefinition = {\n  name: \"RIGHT\",\n  evaluate: function (node, context): FunctionEvaluationResult {\n    if (node.args.length < 1 || node.args.length > 2) {\n      return {\n        type: \"error\",\n        err: FormulaError.VALUE,\n        message: \"RIGHT function takes 1 or 2 arguments\",\n        errAddress: context.dependencyNode,\n      };\n    }\n\n    // Evaluate the text argument\n    const textResult = this.evaluateNode(node.args[0]!, context);\n    if (\n      textResult.type === \"error\" ||\n      textResult.type === \"awaiting-evaluation\"\n    ) {\n      return textResult;\n    }\n\n    // Evaluate the numChars argument (optional, defaults to 1)\n    let numCharsResult: FunctionEvaluationResult;\n    if (node.args.length > 1) {\n      numCharsResult = this.evaluateNode(node.args[1]!, context);\n      if (\n        numCharsResult.type === \"error\" ||\n        numCharsResult.type === \"awaiting-evaluation\"\n      ) {\n        return numCharsResult;\n      }\n    } else {\n      numCharsResult = {\n        type: \"value\",\n        result: { type: \"number\", value: 1 },\n      };\n    }\n\n    // Handle spilled-values inputs\n    if (\n      textResult.type === \"spilled-values\" ||\n      numCharsResult.type === \"spilled-values\"\n    ) {\n      // For RIGHT with spilled values, we need a custom spilled result handler\n      // because we need to calculate start_num dynamically for each text value\n      return createRightSpilledResult.call(this, {\n        textResult,\n        numCharsResult,\n        context,\n      });\n    }\n\n    // Strict type checking - no coercion\n    if (textResult.result.type !== \"string\") {\n      return {\n        type: \"error\",\n        err: FormulaError.VALUE,\n        message: \"Text argument must be a string\",\n        errAddress: context.dependencyNode,\n      };\n    }\n\n    if (numCharsResult.result.type !== \"number\") {\n      return {\n        type: \"error\",\n        err: FormulaError.VALUE,\n        message: \"NumChars argument must be a number\",\n        errAddress: context.dependencyNode,\n      };\n    }\n\n    // Use RIGHT operation: RIGHT(text, num_chars) = MID(text, LEN(text) - num_chars + 1, num_chars)\n    return rightOperation(textResult, numCharsResult, context);\n  },\n};\n\n/**\n * Helper for creating spilled-values result for RIGHT function\n */\nfunction createRightSpilledResult(\n  this: FormulaEvaluator,\n  {\n    textResult,\n    numCharsResult,\n    context,\n  }: {\n    textResult: FunctionEvaluationResult;\n    numCharsResult: FunctionEvaluationResult;\n    context: EvaluationContext;\n  }\n): SpilledValuesEvaluationResult | ErrorEvaluationResult {\n  if (\n    textResult.type !== \"spilled-values\" &&\n    numCharsResult.type !== \"spilled-values\"\n  ) {\n    throw new Error(\"createRightSpilledResult called without spilled values\");\n  }\n\n  return {\n    type: \"spilled-values\",\n    spillArea: (origin: CellAddress): SpreadsheetRange => {\n      // Calculate spill area\n      let spillArea;\n      if (textResult.type === \"spilled-values\") {\n        spillArea = textResult.spillArea(origin);\n      } else if (numCharsResult.type === \"spilled-values\") {\n        spillArea = numCharsResult.spillArea(origin);\n      } else {\n        throw new Error(\"No spilled values found\");\n      }\n\n      // Union spill areas if both are spilled\n      if (\n        textResult.type === \"spilled-values\" &&\n        numCharsResult.type === \"spilled-values\"\n      ) {\n        spillArea = this.unionRanges(\n          this.projectRange(textResult.spillArea(origin), origin),\n          this.projectRange(numCharsResult.spillArea(origin), origin)\n        );\n      }\n      return spillArea;\n    },\n    source: \"RIGHT with spilled values\",\n    evaluate: (spilledCell, evalContext): SingleEvaluationResult => {\n      // Evaluate arguments at this spilled position\n      const spillTextResult =\n        textResult.type === \"spilled-values\"\n          ? textResult.evaluate(spilledCell, evalContext)\n          : textResult;\n      const spillNumResult =\n        numCharsResult.type === \"spilled-values\"\n          ? numCharsResult.evaluate(spilledCell, evalContext)\n          : numCharsResult;\n\n      if (spillTextResult === undefined || spillNumResult === undefined) {\n        return {\n          type: \"error\",\n          err: FormulaError.REF,\n          message: \"The spilled results have not been evaluated\",\n          errAddress: context.dependencyNode,\n        };\n      }\n      if (spillNumResult.type === \"error\") {\n        return spillNumResult;\n      }\n      if (spillTextResult.type === \"error\") {\n        return spillTextResult;\n      }\n\n      return rightOperation(spillTextResult, spillNumResult, context);\n    },\n    evaluateAllCells: (intersectingRange) => {\n      throw new Error(\"WIP: evaluateAllCells for RIGHT is not implemented\");\n    },\n  };\n}\n"
  ],
  "mappings": "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",
  "debugId": "EFF4C4EDF198F8B764756E2164756E21",
  "names": []
}