{
  "version": 3,
  "sources": ["../../../../../src/functions/lookup/match/match.ts"],
  "sourcesContent": [
    "import {\n  FormulaError,\n  type CellValue,\n  type EvaluateAllCellsResult,\n  type FunctionDefinition,\n  type FunctionEvaluationResult,\n} from \"../../../core/types.mjs\";\nimport type { EvaluationContext } from \"../../../evaluator/evaluation-context.mjs\";\n\n/**\n * MATCH function - Returns the position of a value in an array\n * MATCH(lookup_value, lookup_array, [match_type])\n * match_type: 1 = less than or equal (default), 0 = exact match, -1 = greater than or equal\n *\n * STRICT TYPE CHECKING:\n * - lookup_value: string or number only\n * - lookup_array: array of strings or numbers only\n * - match_type: number only (must be -1, 0, or 1)\n */\n\n// Helper function to perform MATCH operation\nfunction matchOperation(\n  lookupValue: CellValue,\n  lookupArray: EvaluateAllCellsResult,\n  matchType: number,\n  context: EvaluationContext,\n  isHorizontal: boolean\n): FunctionEvaluationResult {\n  // Strict type checking for lookup_value\n  if (lookupValue.type !== \"string\" && lookupValue.type !== \"number\") {\n    return {\n      type: \"error\",\n      err: FormulaError.VALUE,\n      message: `MATCH lookup_value must be string or number, got ${lookupValue.type}`,\n      errAddress: context.dependencyNode,\n    };\n  }\n\n  // Validate match_type\n  if (matchType !== -1 && matchType !== 0 && matchType !== 1) {\n    return {\n      type: \"error\",\n      err: FormulaError.VALUE,\n      message: `MATCH match_type must be -1, 0, or 1, got ${matchType}`,\n      errAddress: context.dependencyNode,\n    };\n  }\n  if (\n    lookupArray.type === \"awaiting-evaluation\" ||\n    lookupArray.type === \"error\"\n  ) {\n    return lookupArray;\n  }\n\n  for (const value of lookupArray.values) {\n    if (value.result.type === \"value\") {\n      if (matchType === 0) {\n        // Exact match (case-insensitive for strings, matching Excel behavior)\n        const arrayValue = value.result.result;\n\n        const isMatch =\n          arrayValue.type === lookupValue.type &&\n          (arrayValue.type === \"string\" && lookupValue.type === \"string\"\n            ? arrayValue.value.toLowerCase() === lookupValue.value.toLowerCase()\n            : arrayValue.value === lookupValue.value);\n\n        if (isMatch) {\n          // For horizontal arrays (single row), use x position (column index)\n          // For vertical arrays (single/multiple columns), use y position (row index)\n          const position = isHorizontal\n            ? value.relativePos.x + 1\n            : value.relativePos.y + 1;\n\n          return {\n            type: \"value\",\n            result: { type: \"number\", value: position },\n          }; // 1-based index\n        }\n      } else {\n        // Approximate match (1 or -1) - requires sorted array\n        // For now, throw an error until we add sorting validation\n        // TODO: Add proper approximate match logic with sorted array validation\n        throw new Error(\"MATCH: approximate match not fully implemented\");\n      }\n    }\n  }\n\n  return {\n    type: \"error\",\n    err: FormulaError.NA,\n    message: \"MATCH: lookup_value not found in lookup_array\",\n    errAddress: context.dependencyNode,\n  };\n}\n\nexport const MATCH: FunctionDefinition = {\n  name: \"MATCH\",\n  evaluate: function (node, context): FunctionEvaluationResult {\n    if (node.args.length < 2 || node.args.length > 3) {\n      return {\n        type: \"error\",\n        err: FormulaError.VALUE,\n        message: \"MATCH function takes 2 or 3 arguments\",\n        errAddress: context.dependencyNode,\n      };\n    }\n\n    // Evaluate lookup_value\n    const lookupValueResult = this.evaluateNode(node.args[0]!, context);\n    if (\n      lookupValueResult.type === \"error\" ||\n      lookupValueResult.type === \"awaiting-evaluation\"\n    ) {\n      return lookupValueResult;\n    }\n\n    // Evaluate lookup_array\n    const lookupArrayResult = this.evaluateNode(node.args[1]!, context);\n    if (\n      lookupArrayResult.type === \"error\" ||\n      lookupArrayResult.type === \"awaiting-evaluation\"\n    ) {\n      return lookupArrayResult;\n    }\n\n    // Evaluate match_type (optional, defaults to 1)\n    let matchTypeResult: FunctionEvaluationResult = {\n      type: \"value\",\n      result: { type: \"number\", value: 1 },\n    };\n\n    if (node.args[2]) {\n      matchTypeResult = this.evaluateNode(node.args[2], context);\n      if (\n        matchTypeResult.type === \"error\" ||\n        matchTypeResult.type === \"awaiting-evaluation\"\n      ) {\n        return matchTypeResult;\n      }\n    }\n\n    // Handle spilled arrays for lookup_value and match_type (not lookup_array which is expected to be a range)\n    if (\n      lookupValueResult.type === \"spilled-values\" ||\n      matchTypeResult.type === \"spilled-values\"\n    ) {\n      return {\n        type: \"error\",\n        err: FormulaError.VALUE,\n        message: \"MATCH: Spilled array arguments not yet implemented\",\n        errAddress: context.dependencyNode,\n      };\n    }\n\n    // Strict type checking for match_type\n    if (matchTypeResult.result.type !== \"number\") {\n      return {\n        type: \"error\",\n        err: FormulaError.VALUE,\n        message: `MATCH match_type must be number, got ${matchTypeResult.result.type}`,\n        errAddress: context.dependencyNode,\n      };\n    }\n\n    // Extract lookup_array values\n    let lookupArray: EvaluateAllCellsResult = {\n      type: \"awaiting-evaluation\",\n      waitingFor: context.dependencyNode,\n      errAddress: context.dependencyNode,\n    };\n    let isHorizontal = false;\n\n    // Handle direct range arguments (like A:A) before extracting lookup_array values\n\n    // Extract lookup_array values for non-infinite ranges\n    if (lookupArrayResult.type === \"value\") {\n      // Single value case - treat as array with one element\n      lookupArray = {\n        type: \"values\",\n        values: [{ result: lookupArrayResult, relativePos: { x: 0, y: 0 } }],\n      };\n      isHorizontal = false; // Single value, treat as vertical\n    } else if (lookupArrayResult.type === \"spilled-values\") {\n      // Validate that lookup_array is 1D (either single row OR single column)\n      const spillArea = lookupArrayResult.spillArea(context.cellAddress);\n      const startRow = spillArea.start.row;\n      const endRow = spillArea.end.row;\n      const startCol = spillArea.start.col;\n      const endCol = spillArea.end.col;\n\n      // Check if it's a single row (horizontal)\n      const isSingleRow = endRow.type === \"number\" && startRow === endRow.value;\n\n      // Check if it's a single column (vertical)\n      const isSingleCol = endCol.type === \"number\" && startCol === endCol.value;\n\n      // MATCH requires a 1D array - either single row OR single column, not both or neither\n      if (!isSingleRow && !isSingleCol) {\n        return {\n          type: \"error\",\n          err: FormulaError.VALUE,\n          message:\n            \"MATCH lookup_array must be a single row or single column (1D array)\",\n          errAddress: context.dependencyNode,\n        };\n      }\n\n      // Cannot be both single row AND single column (that would be a single cell, which is handled)\n      if (isSingleRow && isSingleCol) {\n        // This is actually a single cell, which is fine\n        isHorizontal = false; // Treat single cell as vertical\n      } else {\n        // Horizontal if it's a single row\n        isHorizontal = isSingleRow;\n      }\n\n      // Extract values from spilled array\n      lookupArray = lookupArrayResult.evaluateAllCells.call(this, {\n        context,\n        evaluate: lookupArrayResult.evaluate,\n        origin: context.cellAddress,\n        lookupOrder: \"col-major\",\n      });\n    }\n\n    // Perform MATCH operation\n    return matchOperation(\n      lookupValueResult.result,\n      lookupArray,\n      Math.floor(matchTypeResult.result.value), // Floor to handle decimal inputs\n      context,\n      isHorizontal\n    );\n  },\n};\n"
  ],
  "mappings": ";AAAA;AAAA;AAAA;AAqBA,SAAS,cAAc,CACrB,aACA,aACA,WACA,SACA,cAC0B;AAAA,EAE1B,IAAI,YAAY,SAAS,YAAY,YAAY,SAAS,UAAU;AAAA,IAClE,OAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,aAAa;AAAA,MAClB,SAAS,oDAAoD,YAAY;AAAA,MACzE,YAAY,QAAQ;AAAA,IACtB;AAAA,EACF;AAAA,EAGA,IAAI,cAAc,MAAM,cAAc,KAAK,cAAc,GAAG;AAAA,IAC1D,OAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,aAAa;AAAA,MAClB,SAAS,6CAA6C;AAAA,MACtD,YAAY,QAAQ;AAAA,IACtB;AAAA,EACF;AAAA,EACA,IACE,YAAY,SAAS,yBACrB,YAAY,SAAS,SACrB;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAEA,WAAW,SAAS,YAAY,QAAQ;AAAA,IACtC,IAAI,MAAM,OAAO,SAAS,SAAS;AAAA,MACjC,IAAI,cAAc,GAAG;AAAA,QAEnB,MAAM,aAAa,MAAM,OAAO;AAAA,QAEhC,MAAM,UACJ,WAAW,SAAS,YAAY,SAC/B,WAAW,SAAS,YAAY,YAAY,SAAS,WAClD,WAAW,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,IACjE,WAAW,UAAU,YAAY;AAAA,QAEvC,IAAI,SAAS;AAAA,UAGX,MAAM,WAAW,eACb,MAAM,YAAY,IAAI,IACtB,MAAM,YAAY,IAAI;AAAA,UAE1B,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ,EAAE,MAAM,UAAU,OAAO,SAAS;AAAA,UAC5C;AAAA,QACF;AAAA,MACF,EAAO;AAAA,QAIL,MAAM,IAAI,MAAM,gDAAgD;AAAA;AAAA,IAEpE;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,KAAK,aAAa;AAAA,IAClB,SAAS;AAAA,IACT,YAAY,QAAQ;AAAA,EACtB;AAAA;AAGK,IAAM,QAA4B;AAAA,EACvC,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAmC;AAAA,IAC3D,IAAI,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,GAAG;AAAA,MAChD,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,MAAM,oBAAoB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IAClE,IACE,kBAAkB,SAAS,WAC3B,kBAAkB,SAAS,uBAC3B;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,oBAAoB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IAClE,IACE,kBAAkB,SAAS,WAC3B,kBAAkB,SAAS,uBAC3B;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAGA,IAAI,kBAA4C;AAAA,MAC9C,MAAM;AAAA,MACN,QAAQ,EAAE,MAAM,UAAU,OAAO,EAAE;AAAA,IACrC;AAAA,IAEA,IAAI,KAAK,KAAK,IAAI;AAAA,MAChB,kBAAkB,KAAK,aAAa,KAAK,KAAK,IAAI,OAAO;AAAA,MACzD,IACE,gBAAgB,SAAS,WACzB,gBAAgB,SAAS,uBACzB;AAAA,QACA,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IAGA,IACE,kBAAkB,SAAS,oBAC3B,gBAAgB,SAAS,kBACzB;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,IAAI,gBAAgB,OAAO,SAAS,UAAU;AAAA,MAC5C,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS,wCAAwC,gBAAgB,OAAO;AAAA,QACxE,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,IAAI,cAAsC;AAAA,MACxC,MAAM;AAAA,MACN,YAAY,QAAQ;AAAA,MACpB,YAAY,QAAQ;AAAA,IACtB;AAAA,IACA,IAAI,eAAe;AAAA,IAKnB,IAAI,kBAAkB,SAAS,SAAS;AAAA,MAEtC,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,QAAQ,CAAC,EAAE,QAAQ,mBAAmB,aAAa,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC;AAAA,MACrE;AAAA,MACA,eAAe;AAAA,IACjB,EAAO,SAAI,kBAAkB,SAAS,kBAAkB;AAAA,MAEtD,MAAM,YAAY,kBAAkB,UAAU,QAAQ,WAAW;AAAA,MACjE,MAAM,WAAW,UAAU,MAAM;AAAA,MACjC,MAAM,SAAS,UAAU,IAAI;AAAA,MAC7B,MAAM,WAAW,UAAU,MAAM;AAAA,MACjC,MAAM,SAAS,UAAU,IAAI;AAAA,MAG7B,MAAM,cAAc,OAAO,SAAS,YAAY,aAAa,OAAO;AAAA,MAGpE,MAAM,cAAc,OAAO,SAAS,YAAY,aAAa,OAAO;AAAA,MAGpE,IAAI,CAAC,eAAe,CAAC,aAAa;AAAA,QAChC,OAAO;AAAA,UACL,MAAM;AAAA,UACN,KAAK,aAAa;AAAA,UAClB,SACE;AAAA,UACF,YAAY,QAAQ;AAAA,QACtB;AAAA,MACF;AAAA,MAGA,IAAI,eAAe,aAAa;AAAA,QAE9B,eAAe;AAAA,MACjB,EAAO;AAAA,QAEL,eAAe;AAAA;AAAA,MAIjB,cAAc,kBAAkB,iBAAiB,KAAK,MAAM;AAAA,QAC1D;AAAA,QACA,UAAU,kBAAkB;AAAA,QAC5B,QAAQ,QAAQ;AAAA,QAChB,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAAA,IAGA,OAAO,eACL,kBAAkB,QAClB,aACA,KAAK,MAAM,gBAAgB,OAAO,KAAK,GACvC,SACA,YACF;AAAA;AAEJ;",
  "debugId": "E8B4E1E3709915CB64756E2164756E21",
  "names": []
}