{
  "version": 3,
  "sources": ["../../../src/functions/criteria-utils.ts"],
  "sourcesContent": [
    "import type { LookupOrder } from \"../core/managers/range-eval-order-builder.cjs\";\nimport {\n  FormulaError,\n  type CellInfinity,\n  type ErrorEvaluationResult,\n  type FunctionEvaluationResult,\n  type SingleEvaluationResult,\n  type ValueEvaluationResult\n} from \"../core/types.cjs\";\nimport { getRelativeRange } from \"../core/utils.cjs\";\nimport type { EvaluationContext } from \"../evaluator/evaluation-context.cjs\";\nimport {\n  EvaluationError\n} from \"../evaluator/evaluation-error.cjs\";\nimport type { FormulaEvaluator } from \"../evaluator/formula-evaluator.cjs\";\nimport type { ASTNode, FunctionNode } from \"../parser/ast.cjs\";\nimport {\n  matchesParsedCriteria,\n  parseCriteria,\n  type ParsedCriteria,\n} from \"./criteria-parser.cjs\";\n\n/**\n * Criteria pair for criteria-based functions\n */\nexport interface CriteriaPair {\n  rangeResult: FunctionEvaluationResult;\n  parsedCriteria: ParsedCriteria;\n}\n\n/**\n * Parse criteria pairs from function arguments\n * @param node - The function node\n * @param context - Evaluation context\n * @param evaluateNode - Node evaluation function\n * @param startIndex - Index to start parsing criteria pairs from (1 for IFS functions, 0 for COUNTIFS)\n * @returns Array of criteria pairs or error\n */\nexport function parseCriteriaPairs(\n  this: FormulaEvaluator,\n  node: FunctionNode,\n  context: EvaluationContext,\n  evaluateNode: (\n    node: ASTNode,\n    context: EvaluationContext\n  ) => FunctionEvaluationResult,\n  startIndex: number = 1\n): CriteriaPair[] | ErrorEvaluationResult {\n  const criteriaPairs: CriteriaPair[] = [];\n\n  for (let i = startIndex; i < node.args.length; i += 2) {\n    const criteriaRangeResult = evaluateNode.call(this, node.args[i]!, context);\n    if (\n      criteriaRangeResult.type === \"error\" ||\n      criteriaRangeResult.type === \"awaiting-evaluation\"\n    ) {\n      return criteriaRangeResult;\n    }\n\n    const criteriaResult = evaluateNode.call(this, node.args[i + 1]!, context);\n    if (\n      criteriaResult.type === \"error\" ||\n      criteriaResult.type === \"awaiting-evaluation\"\n    ) {\n      return criteriaResult;\n    }\n\n    let result: ValueEvaluationResult;\n\n    if (criteriaResult.type === \"spilled-values\") {\n      // just take the first spilled value\n      const firstSpilledValue = criteriaResult.evaluate(\n        { x: 0, y: 0 },\n        context\n      );\n      if (\n        firstSpilledValue.type === \"error\" ||\n        firstSpilledValue.type === \"awaiting-evaluation\"\n      ) {\n        return firstSpilledValue;\n      } else {\n        result = firstSpilledValue;\n      }\n    } else {\n      result = criteriaResult;\n    }\n\n    const parsedCriteria = parseCriteria(result.result);\n    if (parsedCriteria.type === \"error\") {\n      return {\n        type: \"error\",\n        err: FormulaError.VALUE,\n        message: parsedCriteria.message,\n        errAddress: context.dependencyNode,\n      };\n    }\n\n    criteriaPairs.push({\n      rangeResult: criteriaRangeResult,\n      parsedCriteria,\n    });\n  }\n\n  return criteriaPairs;\n}\n\n/**\n * Check if any criteria involves empty/non-empty cell matching\n */\nexport function hasEmptyCriteria(criteriaPairs: CriteriaPair[]): boolean {\n  return criteriaPairs.some(\n    ({ parsedCriteria }) =>\n      parsedCriteria.type === \"exact\" &&\n      parsedCriteria.value.type === \"string\" &&\n      parsedCriteria.value.value === \"\"\n  );\n}\n\n/**\n * Returns matching values from ranges based on criteria\n * @param evaluator - The function evaluator context\n * @param valueRangeResult - The range of values to process\n * @param criteriaPairs - Array of criteria pairs to match against\n * @param context - Evaluation context\n * @returns Array of SingleEvaluationResult for each matching cell - includes both values and errors\n * Consuming functions decide whether to skip errors or propagate them\n */\nexport function processMultiCriteriaValues(\n  evaluator: FormulaEvaluator,\n  valueRangeResult: FunctionEvaluationResult,\n  criteriaPairs: CriteriaPair[],\n  context: EvaluationContext,\n  lookupOrder: LookupOrder\n):\n  | { type: \"values\"; values: SingleEvaluationResult[] }\n  | ErrorEvaluationResult {\n  const results: SingleEvaluationResult[] = [];\n\n  const criteriaPairWithError = criteriaPairs\n    .map((pair) => pair.rangeResult)\n    .find(\n      (result) =>\n        result.type === \"error\" || result.type === \"awaiting-evaluation\"\n    );\n  if (criteriaPairWithError) {\n    return criteriaPairWithError;\n  }\n\n  // Check if this is an empty criteria case\n  if (\n    hasEmptyCriteria(criteriaPairs) &&\n    valueRangeResult.type === \"spilled-values\"\n  ) {\n    return handleEmptyCriteriaSpilledValues(\n      valueRangeResult,\n      criteriaPairs,\n      context\n    );\n  }\n\n  // Handle different value range types\n  if (valueRangeResult.type === \"value\") {\n    // Single value case - check if all criteria match\n    let allMatch = true;\n    for (const { rangeResult, parsedCriteria } of criteriaPairs) {\n      if (rangeResult.type === \"value\") {\n        if (!matchesParsedCriteria(rangeResult.result, parsedCriteria)) {\n          allMatch = false;\n          break;\n        }\n      } else {\n        // Single value but range criteria - doesn't make sense\n        allMatch = false;\n        break;\n      }\n    }\n\n    if (allMatch) {\n      results.push(valueRangeResult); // Add the entire result (ValueEvaluationResult)\n    }\n  } else if (valueRangeResult.type === \"spilled-values\") {\n    // Range case - first validate dimensions using spillArea for efficiency\n    const valueSpillArea = valueRangeResult.spillArea(context.cellAddress);\n\n    // Check that all criteria ranges have compatible dimensions\n    for (const { rangeResult } of criteriaPairs) {\n      if (rangeResult.type === \"spilled-values\") {\n        const criteriaSpillArea = rangeResult.spillArea(context.cellAddress);\n\n        // Compare dimensions using relative ranges to get width/height\n        const valueRelRange = getRelativeRange(\n          valueSpillArea,\n          context.cellAddress\n        );\n        const criteriaRelRange = getRelativeRange(\n          criteriaSpillArea,\n          context.cellAddress\n        );\n\n        // Check if dimensions are compatible\n        const widthsMatch =\n          (valueRelRange.width.type === \"infinity\" &&\n            criteriaRelRange.width.type === \"infinity\") ||\n          (valueRelRange.width.type === \"number\" &&\n            criteriaRelRange.width.type === \"number\" &&\n            valueRelRange.width.value === criteriaRelRange.width.value);\n\n        const heightsMatch =\n          (valueRelRange.height.type === \"infinity\" &&\n            criteriaRelRange.height.type === \"infinity\") ||\n          (valueRelRange.height.type === \"number\" &&\n            criteriaRelRange.height.type === \"number\" &&\n            valueRelRange.height.value === criteriaRelRange.height.value);\n\n        if (!widthsMatch || !heightsMatch) {\n          // Return #VALUE! error for dimension mismatch\n          throw new EvaluationError(\n            FormulaError.VALUE,\n            \"Criteria range dimensions do not match value range dimensions\"\n          );\n        }\n      }\n      // Single values (type === \"value\") are compatible with any range size\n    }\n\n    // Get all cells to simplify position-based pairing\n    const valueResults = valueRangeResult.evaluateAllCells.call(evaluator, {\n      context,\n      evaluate: valueRangeResult.evaluate,\n      origin: context.cellAddress,\n      lookupOrder,\n    });\n\n    // Get criteria ranges (or track if single value)\n    const criteriaResultsArrays = criteriaPairs.map(({ rangeResult }) => {\n      if (rangeResult.type === \"spilled-values\") {\n        const criteriaResults = rangeResult.evaluateAllCells.call(evaluator, {\n          context,\n          evaluate: rangeResult.evaluate,\n          origin: context.cellAddress,\n          lookupOrder,\n        });\n        return { type: \"array\" as const, results: criteriaResults };\n      } else {\n        // Single value - we'll use it for all positions\n        return { type: \"single\" as const, value: rangeResult };\n      }\n    });\n\n    // Create maps from position to value for each criteria range\n    const criteriaMaps = criteriaResultsArrays.map((criteriaData) => {\n      if (criteriaData.type === \"single\") {\n        return null; // Single values don't need a map\n      }\n      if (criteriaData.results.type !== \"values\") {\n        return null;\n      }\n      const map = new Map<string, SingleEvaluationResult>();\n      for (const { result, relativePos } of criteriaData.results.values) {\n        const key = `${relativePos.x},${relativePos.y}`;\n        map.set(key, result);\n      }\n      return map;\n    });\n\n    if (valueResults.type !== \"values\") {\n      return valueResults;\n    }\n\n    // Iterate through each value position\n    for (const valueCell of valueResults.values) {\n      if (!valueCell) {\n        continue;\n      }\n\n      const posKey = `${valueCell.relativePos.x},${valueCell.relativePos.y}`;\n\n      // Check if all criteria match for this position\n      let allMatch = true;\n      for (let j = 0; j < criteriaPairs.length; j++) {\n        let criteriaCell: SingleEvaluationResult | undefined;\n\n        if (criteriaResultsArrays[j]!.type === \"single\") {\n          // Single value - use it for all positions\n          criteriaCell = criteriaResultsArrays[j]!.value;\n        } else {\n          // Array - look up by position, treat missing as empty\n          criteriaCell = criteriaMaps[j]?.get(posKey);\n        }\n\n        // If criteriaCell is undefined, treat it as an empty cell\n        if (!criteriaCell) {\n          // Check if the criteria matches empty cells\n          const parsedCriteria = criteriaPairs[j]!.parsedCriteria;\n          const emptyValue = { type: \"string\" as const, value: \"\" };\n          if (!matchesParsedCriteria(emptyValue, parsedCriteria)) {\n            allMatch = false;\n            break;\n          }\n        } else if (criteriaCell.type === \"error\") {\n          allMatch = false;\n          break;\n        } else if (criteriaCell.type === \"value\") {\n          if (\n            !matchesParsedCriteria(\n              criteriaCell.result,\n              criteriaPairs[j]!.parsedCriteria\n            )\n          ) {\n            allMatch = false;\n            break;\n          }\n        } else if (criteriaCell.type === \"awaiting-evaluation\") {\n          return criteriaCell;\n        } else {\n          allMatch = false;\n          break;\n        }\n      }\n\n      if (allMatch) {\n        results.push(valueCell.result); // Add the entire SingleEvaluationResult (includes errors and values)\n      }\n    }\n  }\n\n  return { type: \"values\", values: results };\n}\n\n/**\n * Validate multi-criteria function arguments (odd number, min 3)\n */\nexport function validateMultiCriteriaArgs(\n  functionName: string,\n  argCount: number,\n  context: EvaluationContext\n): ErrorEvaluationResult | null {\n  if (argCount < 3 || (argCount - 1) % 2 !== 0) {\n    return {\n      type: \"error\",\n      err: FormulaError.VALUE,\n      message: `${functionName} function requires an odd number of arguments (min 3): value_range, criteria_range1, criteria1, [criteria_range2, criteria2], ...`,\n      errAddress: context.dependencyNode,\n    };\n  }\n  return null;\n}\n\n/**\n * Validate COUNTIFS function arguments (even number, min 2)\n */\nexport function validateCountifsArgs(\n  argCount: number,\n  context: EvaluationContext\n): ErrorEvaluationResult | null {\n  if (argCount < 2 || argCount % 2 !== 0) {\n    return {\n      type: \"error\",\n      err: FormulaError.VALUE,\n      message:\n        \"COUNTIFS function requires an even number of arguments (min 2): criteria_range1, criteria1, [criteria_range2, criteria2], ...\",\n      errAddress: context.dependencyNode,\n    };\n  }\n  return null;\n}\n\n/**\n * Validate single criteria function arguments (2 or 3)\n */\nexport function validateSingleCriteriaArgs(\n  functionName: string,\n  argCount: number,\n  context: EvaluationContext\n): ErrorEvaluationResult | null {\n  if (argCount < 2 || argCount > 3) {\n    return {\n      type: \"error\",\n      err: FormulaError.VALUE,\n      message: `${functionName} function takes 2 or 3 arguments`,\n      errAddress: context.dependencyNode,\n    };\n  }\n  return null;\n}\n\n/**\n * Result type for processInfinity - either return infinity immediately or continue with updated state\n */\nexport type ProcessInfinityResult<T> =\n  | { type: \"infinity\"; infinity: CellInfinity }\n  | { type: \"state\"; state: T };\n\n/**\n * Handle empty cell criteria for spilled values - returns matching values for empty criteria cases\n * This is needed when criteria like \"=\" (empty) or \"<>\" (non-empty) are used with ranges\n *\n * @param valueRangeResult - The range of values to process\n * @param criteriaPairs - Array of criteria pairs\n * @param context - Evaluation context\n * @returns Array of matching values\n */\nfunction handleEmptyCriteriaSpilledValues(\n  valueRangeResult: FunctionEvaluationResult,\n  criteriaPairs: CriteriaPair[],\n  context: EvaluationContext\n):\n  | { type: \"values\"; values: SingleEvaluationResult[] }\n  | ErrorEvaluationResult {\n  if (\n    !hasEmptyCriteria(criteriaPairs) ||\n    valueRangeResult.type !== \"spilled-values\"\n  ) {\n    throw new Error(\"Not an empty criteria case\");\n  }\n  const results: SingleEvaluationResult[] = [];\n  const valueSpillArea = valueRangeResult.spillArea(context.cellAddress);\n\n  // Check if this is an infinite range and we are counting empty cells - throw error\n  if (\n    valueSpillArea.end.col.type === \"infinity\" ||\n    valueSpillArea.end.row.type === \"infinity\"\n  ) {\n    throw new EvaluationError(\n      FormulaError.VALUE,\n      \"Can not process infinite ranges with empty cell criteria\"\n    );\n  }\n\n  // Finite range - iterate over all cells in spill areas\n  if (\n    valueSpillArea.end.col.type === \"number\" &&\n    valueSpillArea.end.row.type === \"number\"\n  ) {\n    for (\n      let row = valueSpillArea.start.row;\n      row <= valueSpillArea.end.row.value;\n      row++\n    ) {\n      for (\n        let col = valueSpillArea.start.col;\n        col <= valueSpillArea.end.col.value;\n        col++\n      ) {\n        const valueCell = valueRangeResult.evaluate(\n          {\n            x: col - valueSpillArea.start.col,\n            y: row - valueSpillArea.start.row,\n          },\n          context\n        );\n\n        // Check all criteria for this position\n        let allMatch = true;\n        for (const { rangeResult, parsedCriteria } of criteriaPairs) {\n          let criteriaCell: SingleEvaluationResult | undefined;\n\n          if (rangeResult.type === \"spilled-values\") {\n            const criteriaSpillArea = rangeResult.spillArea(\n              context.cellAddress\n            );\n            const criteriaRow =\n              row - valueSpillArea.start.row + criteriaSpillArea.start.row;\n            const criteriaCol =\n              col - valueSpillArea.start.col + criteriaSpillArea.start.col;\n\n            if (\n              criteriaRow <=\n                (criteriaSpillArea.end.row.type === \"number\"\n                  ? criteriaSpillArea.end.row.value\n                  : Infinity) &&\n              criteriaCol <=\n                (criteriaSpillArea.end.col.type === \"number\"\n                  ? criteriaSpillArea.end.col.value\n                  : Infinity)\n            ) {\n              criteriaCell = rangeResult.evaluate(\n                {\n                  x: criteriaCol - criteriaSpillArea.start.col,\n                  y: criteriaRow - criteriaSpillArea.start.row,\n                },\n                context\n              );\n            }\n          } else if (rangeResult.type === \"value\") {\n            criteriaCell = rangeResult;\n          }\n\n          // Check if criteria matches (including empty cell logic)\n          const isEmptyCriteria =\n            (parsedCriteria.type === \"exact\" &&\n              parsedCriteria.value.type === \"string\" &&\n              parsedCriteria.value.value === \"\") ||\n            (parsedCriteria.type === \"comparison\" &&\n              parsedCriteria.operator === \"<>\" &&\n              parsedCriteria.value.type === \"string\" &&\n              parsedCriteria.value.value === \"\");\n\n          if (isEmptyCriteria) {\n            // Check if criteria cell matches empty condition\n            const isEmpty =\n              !criteriaCell ||\n              (criteriaCell.type === \"value\" &&\n                criteriaCell.result.type === \"string\" &&\n                criteriaCell.result.value === \"\");\n\n            const shouldMatch =\n              parsedCriteria.type === \"exact\" ? isEmpty : !isEmpty;\n            if (!shouldMatch) {\n              allMatch = false;\n              break;\n            }\n          } else {\n            // Regular criteria matching\n            if (\n              !criteriaCell ||\n              criteriaCell.type !== \"value\" ||\n              !matchesParsedCriteria(criteriaCell.result, parsedCriteria)\n            ) {\n              allMatch = false;\n              break;\n            }\n          }\n        }\n\n        if (allMatch && valueCell) {\n          results.push(valueCell); // Add the matching cell result\n        }\n      }\n    }\n  }\n\n  return { type: \"values\", values: results };\n}\n"
  ],
  "mappings": "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",
  "debugId": "B3E3A4359E69FF9464756E2164756E21",
  "names": []
}