{
  "version": 3,
  "sources": ["../../../../../src/functions/reference/address/address.ts"],
  "sourcesContent": [
    "import {\n  FormulaError,\n  type CellValue,\n  type CellNumber,\n  type FunctionDefinition,\n  type FunctionEvaluationResult,\n  type ValueEvaluationResult,\n  type CellAddress,\n  type SpreadsheetRange,\n  type SpilledValuesEvaluationResult,\n  type SingleEvaluationResult,\n} from \"../../../core/types.mjs\";\nimport type { EvaluationContext } from \"../../../evaluator/evaluation-context.mjs\";\n\n/**\n * ADDRESS function - Creates a cell reference as text given row and column numbers\n * \n * Usage: ADDRESS(row_num, column_num, [abs_num], [a1], [sheet_text])\n * \n * row_num: The row number to use in the cell reference\n * column_num: The column number to use in the cell reference\n * abs_num: (optional) Type of reference to return (1=absolute, 2=absolute row/relative col, 3=relative row/absolute col, 4=relative)\n * a1: (optional) A logical value that specifies the A1 or R1C1 reference style (TRUE or omitted = A1 style)\n * sheet_text: (optional) The name of the worksheet to be used as the external reference\n * \n * Examples:\n * - ADDRESS(2, 3) returns \"$C$2\"\n * - ADDRESS(2, 3, 4) returns \"C2\"\n * - ADDRESS(2, 3, 1, TRUE, \"Sheet2\") returns \"Sheet2!$C$2\"\n */\nexport const ADDRESS: FunctionDefinition = {\n  name: \"ADDRESS\",\n  evaluate: function (node, context): FunctionEvaluationResult {\n    if (node.args.length < 2 || node.args.length > 5) {\n      return {\n        type: \"error\",\n        err: FormulaError.VALUE,\n        message: \"ADDRESS function requires 2 to 5 arguments\",\n        errAddress: context.dependencyNode,\n      };\n    }\n\n    // Evaluate row_num\n    const rowResult = this.evaluateNode(node.args[0]!, context);\n    if (\n      rowResult.type === \"error\" ||\n      rowResult.type === \"awaiting-evaluation\"\n    ) {\n      return rowResult;\n    }\n\n    if (rowResult.type !== \"value\" || rowResult.result.type !== \"number\") {\n      return {\n        type: \"error\",\n        err: FormulaError.VALUE,\n        message: \"ADDRESS function row_num must be a number\",\n        errAddress: context.dependencyNode,\n      };\n    }\n\n    // Evaluate column_num\n    const colResult = this.evaluateNode(node.args[1]!, context);\n    if (\n      colResult.type === \"error\" ||\n      colResult.type === \"awaiting-evaluation\"\n    ) {\n      return colResult;\n    }\n\n    if (colResult.type !== \"value\" || colResult.result.type !== \"number\") {\n      return {\n        type: \"error\",\n        err: FormulaError.VALUE,\n        message: \"ADDRESS function column_num must be a number\",\n        errAddress: context.dependencyNode,\n      };\n    }\n\n    const rowNum = Math.floor(rowResult.result.value);\n    const colNum = Math.floor(colResult.result.value);\n\n    if (rowNum < 1 || colNum < 1) {\n      return {\n        type: \"error\",\n        err: FormulaError.VALUE,\n        message: \"ADDRESS function row and column numbers must be positive\",\n        errAddress: context.dependencyNode,\n      };\n    }\n\n    // Default values\n    let absNum = 1; // Absolute reference by default\n    let a1Style = true;\n    let sheetText = \"\";\n\n    // Optional abs_num parameter\n    if (node.args.length >= 3) {\n      const absResult = this.evaluateNode(node.args[2]!, context);\n      if (\n        absResult.type === \"error\" ||\n        absResult.type === \"awaiting-evaluation\"\n      ) {\n        return absResult;\n      }\n\n      if (absResult.type === \"value\" && absResult.result.type === \"number\") {\n        absNum = Math.floor(absResult.result.value);\n        if (absNum < 1 || absNum > 4) {\n          return {\n            type: \"error\",\n            err: FormulaError.VALUE,\n            message: \"ADDRESS function abs_num must be between 1 and 4\",\n            errAddress: context.dependencyNode,\n          };\n        }\n      }\n    }\n\n    // Optional a1 parameter\n    if (node.args.length >= 4) {\n      const a1Result = this.evaluateNode(node.args[3]!, context);\n      if (\n        a1Result.type === \"error\" ||\n        a1Result.type === \"awaiting-evaluation\"\n      ) {\n        return a1Result;\n      }\n\n      if (a1Result.type === \"value\" && a1Result.result.type === \"boolean\") {\n        a1Style = a1Result.result.value;\n      }\n    }\n\n    // Optional sheet_text parameter\n    if (node.args.length === 5) {\n      const sheetResult = this.evaluateNode(node.args[4]!, context);\n      if (\n        sheetResult.type === \"error\" ||\n        sheetResult.type === \"awaiting-evaluation\"\n      ) {\n        return sheetResult;\n      }\n\n      if (sheetResult.type === \"value\" && sheetResult.result.type === \"string\") {\n        sheetText = sheetResult.result.value;\n      }\n    }\n\n    // Build the address string\n    let address = \"\";\n\n    if (a1Style) {\n      // A1 style reference\n      const colLetter = columnNumberToLetter(colNum);\n      \n      switch (absNum) {\n        case 1: // $A$1\n          address = `$${colLetter}$${rowNum}`;\n          break;\n        case 2: // A$1\n          address = `${colLetter}$${rowNum}`;\n          break;\n        case 3: // $A1\n          address = `$${colLetter}${rowNum}`;\n          break;\n        case 4: // A1\n          address = `${colLetter}${rowNum}`;\n          break;\n      }\n    } else {\n      // R1C1 style reference\n      return {\n        type: \"error\",\n        err: FormulaError.VALUE,\n        message: \"ADDRESS function R1C1 style not yet implemented\",\n        errAddress: context.dependencyNode,\n      };\n    }\n\n    // Add sheet prefix if provided\n    if (sheetText) {\n      address = `${sheetText}!${address}`;\n    }\n\n    return {\n      type: \"value\",\n      result: { type: \"string\", value: address },\n    };\n  },\n};\n\n/**\n * Helper function to convert column number to letter(s)\n */\nfunction columnNumberToLetter(num: number): string {\n  let letter = \"\";\n  while (num > 0) {\n    const remainder = (num - 1) % 26;\n    letter = String.fromCharCode(65 + remainder) + letter;\n    num = Math.floor((num - 1) / 26);\n  }\n  return letter;\n}\n"
  ],
  "mappings": "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",
  "debugId": "8DF18DEFCCCDC87B64756E2164756E21",
  "names": []
}