{
  "version": 3,
  "sources": ["../../../src/core/autofill-utils.ts"],
  "sourcesContent": [
    "/**\n * AutoFill class for handling spreadsheet autofill functionality\n */\n\nimport type {\n  CellAddress,\n  SerializedCellValue,\n  SpreadsheetRange,\n  FiniteSpreadsheetRange,\n  LocalCellAddress,\n  ConditionalStyle,\n  DirectCellStyle,\n  RangeAddress,\n} from \"./types.mjs\";\nimport type { FillDirection } from \"@ricsam/selection-manager\";\nimport { parseFormula } from \"../parser/parser.mjs\";\nimport { astToString } from \"../parser/formatter.mjs\";\nimport { transformAST } from \"./ast-traverser.mjs\";\nimport type { ReferenceNode, RangeNode } from \"../parser/ast.mjs\";\nimport { getCellReference } from \"./utils.mjs\";\nimport type { WorkbookManager } from \"./managers/workbook-manager.mjs\";\nimport type { StyleManager } from \"./managers/style-manager.mjs\";\nimport { intersectRanges } from \"./utils/range-utils.mjs\";\n\nexport class AutoFill {\n  constructor(\n    private workbookManager: WorkbookManager,\n    private styleManager: StyleManager\n  ) {}\n\n  /**\n   * Converts a SpreadsheetRange to FiniteSpreadsheetRange, throwing an error if infinite\n   */\n  private toFiniteRange(range: SpreadsheetRange): FiniteSpreadsheetRange {\n    if (\n      range.end.col.type === \"infinity\" ||\n      range.end.row.type === \"infinity\"\n    ) {\n      throw new Error(\"AutoFill with infinite ranges is not supported\");\n    }\n\n    return {\n      start: range.start,\n      end: {\n        col: range.end.col.value,\n        row: range.end.row.value,\n      },\n    };\n  }\n\n  private getCellContent(address: CellAddress): SerializedCellValue {\n    const sheet = this.workbookManager.getSheet(address);\n    if (!sheet) {\n      throw new Error(\"Sheet not found\");\n    }\n    return sheet.content.get(getCellReference(address));\n  }\n\n  fill(\n    opts: { sheetName: string; workbookName: string },\n    seedRange: SpreadsheetRange,\n    fillRanges: SpreadsheetRange[],\n    direction: FillDirection\n  ) {\n    // Process each fill range\n    for (const fillRange of fillRanges) {\n      this.fillSingleRange(opts, seedRange, fillRange, direction);\n    }\n  }\n\n  /**\n   * Fill a single range with seed data and styles\n   */\n  private fillSingleRange(\n    opts: { sheetName: string; workbookName: string },\n    seedRange: SpreadsheetRange,\n    fillRange: SpreadsheetRange,\n    direction: FillDirection\n  ) {\n    // Convert to finite ranges (throws error if infinite)\n    const finiteSeedRange = this.toFiniteRange(seedRange);\n    const finiteFillRange = this.toFiniteRange(fillRange);\n\n    // Get seed cells data\n    const seedCells = this.getSeedCells(opts, finiteSeedRange);\n\n    // Collect all changes to apply in a single batch\n    const changes = new Map<string, SerializedCellValue>();\n\n    // Determine if we have a single cell or multi-cell seed\n    const isSingleCell = seedCells.length === 1;\n\n    if (isSingleCell) {\n      const seedCell = seedCells[0];\n      if (seedCell) {\n        this.collectSingleCellPattern(\n          seedCell,\n          finiteFillRange,\n          direction,\n          changes\n        );\n      }\n    } else {\n      this.collectMultiCellPattern(\n        seedCells,\n        finiteSeedRange,\n        finiteFillRange,\n        direction,\n        changes\n      );\n    }\n\n    // Get current sheet content and merge with changes\n    const currentContent = this.workbookManager.getSheetSerialized(opts);\n    const newContent = new Map(currentContent);\n\n    // Apply all changes\n    changes.forEach((value, key) => {\n      if (value === undefined) {\n        newContent.delete(key);\n      } else {\n        newContent.set(key, value);\n      }\n    });\n\n    // Update sheet content in a single operation (direct manager call, not through engine)\n    this.workbookManager.setSheetContent(opts, newContent);\n\n    // Copy styles from seed to fill range\n    this.fillStyles(opts, finiteSeedRange, finiteFillRange, direction);\n\n    // Copy metadata from seed to fill range\n    this.fillMetadata(opts, finiteSeedRange, finiteFillRange, direction);\n  }\n\n  private getSeedCells(\n    opts: { sheetName: string; workbookName: string },\n    seedRange: FiniteSpreadsheetRange\n  ) {\n    const cells: Array<{\n      address: CellAddress;\n      content: SerializedCellValue;\n      rowOffset: number;\n      colOffset: number;\n    }> = [];\n\n    const startCol = seedRange.start.col;\n    const startRow = seedRange.start.row;\n    const endCol = seedRange.end.col;\n    const endRow = seedRange.end.row;\n\n    for (let row = startRow; row <= endRow; row++) {\n      for (let col = startCol; col <= endCol; col++) {\n        const address: CellAddress = {\n          sheetName: opts.sheetName,\n          workbookName: opts.workbookName,\n          colIndex: col,\n          rowIndex: row,\n        };\n        const content = this.getCellContent(address);\n        cells.push({\n          address,\n          content,\n          rowOffset: row - startRow,\n          colOffset: col - startCol,\n        });\n      }\n    }\n\n    return cells;\n  }\n\n  private collectSingleCellPattern(\n    seedCell: { address: CellAddress; content: SerializedCellValue },\n    fillRange: FiniteSpreadsheetRange,\n    direction: FillDirection,\n    changes: Map<string, SerializedCellValue>\n  ) {\n    const { content } = seedCell;\n\n    const startCol = fillRange.start.col;\n    const startRow = fillRange.start.row;\n    const endCol = fillRange.end.col;\n    const endRow = fillRange.end.row;\n\n    for (let row = startRow; row <= endRow; row++) {\n      for (let col = startCol; col <= endCol; col++) {\n        const targetAddress: CellAddress = {\n          sheetName: seedCell.address.sheetName,\n          workbookName: seedCell.address.workbookName,\n          colIndex: col,\n          rowIndex: row,\n        };\n\n        let newContent: SerializedCellValue;\n\n        if (content === undefined || content === \"\") {\n          // Blank cell - fills blanks (effectively clears targets)\n          newContent = undefined;\n        } else if (typeof content === \"string\" && content.startsWith(\"=\")) {\n          // Formula - adjust relative references\n          newContent = this.adjustFormulaReferences(\n            content,\n            seedCell.address,\n            targetAddress\n          );\n        } else {\n          // Number or text - copy by default\n          newContent = content;\n        }\n\n        changes.set(getCellReference(targetAddress), newContent);\n      }\n    }\n  }\n\n  private collectMultiCellPattern(\n    seedCells: Array<{\n      address: CellAddress;\n      content: SerializedCellValue;\n      rowOffset: number;\n      colOffset: number;\n    }>,\n    seedRange: FiniteSpreadsheetRange,\n    fillRange: FiniteSpreadsheetRange,\n    direction: FillDirection,\n    changes: Map<string, SerializedCellValue>\n  ) {\n    // Try to infer linear step from numbers\n    const step = this.inferLinearStep(seedCells, direction);\n\n    const startCol = fillRange.start.col;\n    const startRow = fillRange.start.row;\n    const endCol = fillRange.end.col;\n    const endRow = fillRange.end.row;\n\n    const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n    const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n\n    for (let row = startRow; row <= endRow; row++) {\n      for (let col = startCol; col <= endCol; col++) {\n        const targetAddress: LocalCellAddress = {\n          colIndex: col,\n          rowIndex: row,\n        };\n\n        let newContent: SerializedCellValue;\n\n        if (step !== null) {\n          // Use linear progression\n          newContent = this.applyLinearStep(\n            seedCells,\n            targetAddress,\n            seedRange,\n            step,\n            direction\n          );\n        } else {\n          // Repeat pattern (cycle through seed block)\n          const seedColOffset = (col - startCol) % seedWidth;\n          const seedRowOffset = (row - startRow) % seedHeight;\n\n          const seedCell = seedCells.find(\n            (cell) =>\n              cell.colOffset === seedColOffset &&\n              cell.rowOffset === seedRowOffset\n          );\n\n          if (seedCell) {\n            if (\n              typeof seedCell.content === \"string\" &&\n              seedCell.content.startsWith(\"=\")\n            ) {\n              // Formula - adjust relative references\n              newContent = this.adjustFormulaReferences(\n                seedCell.content,\n                seedCell.address,\n                targetAddress\n              );\n            } else {\n              newContent = seedCell.content;\n            }\n          } else {\n            newContent = undefined;\n          }\n        }\n\n        changes.set(getCellReference(targetAddress), newContent);\n      }\n    }\n  }\n\n  private inferLinearStep(\n    seedCells: Array<{\n      content: SerializedCellValue;\n      rowOffset: number;\n      colOffset: number;\n    }>,\n    direction: FillDirection\n  ): number | null {\n    // Extract numeric values in the direction of fill\n    const values: number[] = [];\n\n    if (direction === \"down\" || direction === \"up\") {\n      // Look at first column, different rows\n      const firstColCells = seedCells\n        .filter((cell) => cell.colOffset === 0)\n        .sort((a, b) => a.rowOffset - b.rowOffset);\n\n      for (const cell of firstColCells) {\n        if (typeof cell.content === \"number\") {\n          values.push(cell.content);\n        } else if (typeof cell.content === \"string\") {\n          const num = parseFloat(cell.content);\n          if (!isNaN(num)) {\n            values.push(num);\n          } else {\n            return null; // Non-numeric content, can't infer step\n          }\n        } else {\n          return null;\n        }\n      }\n    } else {\n      // Look at first row, different columns\n      const firstRowCells = seedCells\n        .filter((cell) => cell.rowOffset === 0)\n        .sort((a, b) => a.colOffset - b.colOffset);\n\n      for (const cell of firstRowCells) {\n        if (typeof cell.content === \"number\") {\n          values.push(cell.content);\n        } else if (typeof cell.content === \"string\") {\n          const num = parseFloat(cell.content);\n          if (!isNaN(num)) {\n            values.push(num);\n          } else {\n            return null; // Non-numeric content, can't infer step\n          }\n        } else {\n          return null;\n        }\n      }\n    }\n\n    if (values.length < 2) {\n      return null;\n    }\n\n    // Check if there's a consistent step\n    const step = values[1]! - values[0]!;\n    for (let i = 2; i < values.length; i++) {\n      if (Math.abs(values[i]! - values[i - 1]! - step) > 1e-10) {\n        return null; // Inconsistent step\n      }\n    }\n\n    return step;\n  }\n\n  private applyLinearStep(\n    seedCells: Array<{\n      content: SerializedCellValue;\n      rowOffset: number;\n      colOffset: number;\n    }>,\n    targetAddress: LocalCellAddress,\n    seedRange: FiniteSpreadsheetRange,\n    step: number,\n    direction: FillDirection\n  ): SerializedCellValue {\n    // Calculate the position in the overall sequence\n    let positionInSequence: number;\n    let baseValue: number;\n\n    if (direction === \"down\") {\n      positionInSequence = targetAddress.rowIndex - seedRange.start.row;\n\n      // Find the base value from the first row of the seed\n      const baseCell = seedCells.find(\n        (cell) =>\n          cell.colOffset === targetAddress.colIndex - seedRange.start.col &&\n          cell.rowOffset === 0\n      );\n\n      if (!baseCell) return undefined;\n      baseValue =\n        typeof baseCell.content === \"number\"\n          ? baseCell.content\n          : parseFloat(String(baseCell.content || \"0\"));\n    } else if (direction === \"up\") {\n      positionInSequence = targetAddress.rowIndex - seedRange.start.row;\n\n      // Find the base value from the first row of the seed (same as down direction)\n      const baseCell = seedCells.find(\n        (cell) =>\n          cell.colOffset === targetAddress.colIndex - seedRange.start.col &&\n          cell.rowOffset === 0\n      );\n\n      if (!baseCell) return undefined;\n      baseValue =\n        typeof baseCell.content === \"number\"\n          ? baseCell.content\n          : parseFloat(String(baseCell.content || \"0\"));\n    } else if (direction === \"right\") {\n      positionInSequence = targetAddress.colIndex - seedRange.start.col;\n\n      // Find the base value from the first column of the seed\n      const baseCell = seedCells.find(\n        (cell) =>\n          cell.rowOffset === targetAddress.rowIndex - seedRange.start.row &&\n          cell.colOffset === 0\n      );\n\n      if (!baseCell) return undefined;\n      baseValue =\n        typeof baseCell.content === \"number\"\n          ? baseCell.content\n          : parseFloat(String(baseCell.content || \"0\"));\n    } else {\n      // left\n      positionInSequence = targetAddress.colIndex - seedRange.start.col;\n\n      // Find the base value from the first column of the seed (same as right direction)\n      const baseCell = seedCells.find(\n        (cell) =>\n          cell.rowOffset === targetAddress.rowIndex - seedRange.start.row &&\n          cell.colOffset === 0\n      );\n\n      if (!baseCell) return undefined;\n      baseValue =\n        typeof baseCell.content === \"number\"\n          ? baseCell.content\n          : parseFloat(String(baseCell.content || \"0\"));\n    }\n\n    if (isNaN(baseValue)) {\n      return undefined;\n    }\n\n    const result = baseValue + step * positionInSequence;\n    return typeof seedCells[0]?.content === \"string\"\n      ? result.toString()\n      : result;\n  }\n\n  private adjustFormulaReferences(\n    formula: string,\n    sourceAddress: LocalCellAddress,\n    targetAddress: LocalCellAddress\n  ): string {\n    try {\n      const ast = parseFormula(formula.slice(1)); // Remove the \"=\" sign\n\n      const rowDelta = targetAddress.rowIndex - sourceAddress.rowIndex;\n      const colDelta = targetAddress.colIndex - sourceAddress.colIndex;\n\n      const adjustedAst = transformAST(ast, (node) => {\n        if (node.type === \"reference\") {\n          const refNode = node as ReferenceNode;\n          return {\n            ...refNode,\n            address: {\n              colIndex: refNode.isAbsolute.col\n                ? refNode.address.colIndex\n                : refNode.address.colIndex + colDelta,\n              rowIndex: refNode.isAbsolute.row\n                ? refNode.address.rowIndex\n                : refNode.address.rowIndex + rowDelta,\n            },\n          };\n        } else if (node.type === \"range\") {\n          const rangeNode = node as RangeNode;\n          return {\n            ...rangeNode,\n            range: {\n              start: {\n                col: rangeNode.isAbsolute.start.col\n                  ? rangeNode.range.start.col\n                  : rangeNode.range.start.col + colDelta,\n                row: rangeNode.isAbsolute.start.row\n                  ? rangeNode.range.start.row\n                  : rangeNode.range.start.row + rowDelta,\n              },\n              end: {\n                col:\n                  rangeNode.range.end.col.type === \"number\"\n                    ? rangeNode.isAbsolute.end.col\n                      ? rangeNode.range.end.col\n                      : {\n                          type: \"number\" as const,\n                          value: rangeNode.range.end.col.value + colDelta,\n                        }\n                    : rangeNode.range.end.col,\n                row:\n                  rangeNode.range.end.row.type === \"number\"\n                    ? rangeNode.isAbsolute.end.row\n                      ? rangeNode.range.end.row\n                      : {\n                          type: \"number\" as const,\n                          value: rangeNode.range.end.row.value + rowDelta,\n                        }\n                    : rangeNode.range.end.row,\n              },\n            },\n          };\n        }\n        return node;\n      });\n\n      return `=${astToString(adjustedAst)}`;\n    } catch (error) {\n      // If parsing fails, return the original formula\n      console.warn(\"Failed to adjust formula references:\", error);\n      return formula;\n    }\n  }\n\n  /**\n   * Fill styles from seed range to fill range based on direction\n   * Clears existing cell styles in fill range first (Excel behavior)\n   */\n  private fillStyles(\n    opts: { sheetName: string; workbookName: string },\n    seedRange: FiniteSpreadsheetRange,\n    fillRange: FiniteSpreadsheetRange,\n    direction: FillDirection\n  ): void {\n    // STEP 1: Clear existing cell styles in fill range (Excel-like replacement)\n    const fillRangeAddress: RangeAddress = {\n      workbookName: opts.workbookName,\n      sheetName: opts.sheetName,\n      range: {\n        start: { col: fillRange.start.col, row: fillRange.start.row },\n        end: {\n          col: { type: \"number\", value: fillRange.end.col },\n          row: { type: \"number\", value: fillRange.end.row },\n        },\n      },\n    };\n    \n    this.styleManager.clearCellStylesInRange(fillRangeAddress);\n\n    const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n    const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n\n    // STEP 2: Get all styles intersecting with seed range\n    const seedSpreadsheetRange: SpreadsheetRange = {\n      start: { col: seedRange.start.col, row: seedRange.start.row },\n      end: {\n        col: { type: \"number\", value: seedRange.end.col },\n        row: { type: \"number\", value: seedRange.end.row },\n      },\n    };\n\n    const allConditionalStyles = this.styleManager.getAllConditionalStyles();\n    const allCellStyles = this.styleManager.getAllCellStyles();\n\n    // STEP 3: For each cell in fill range, determine corresponding seed cell and copy styles\n    for (let row = fillRange.start.row; row <= fillRange.end.row; row++) {\n      for (let col = fillRange.start.col; col <= fillRange.end.col; col++) {\n        // Determine which seed cell corresponds to this fill cell\n        let seedCol: number;\n        let seedRow: number;\n\n        if (direction === \"down\" || direction === \"up\") {\n          // Vertical fill: keep column aligned, pattern repeat on rows\n          seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n          seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n        } else {\n          // Horizontal fill: keep row aligned, pattern repeat on columns\n          seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n          seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n        }\n\n        const sourceCellRange: SpreadsheetRange = {\n          start: { col: seedCol, row: seedRow },\n          end: {\n            col: { type: \"number\", value: seedCol },\n            row: { type: \"number\", value: seedRow },\n          },\n        };\n\n        const targetCell: CellAddress = {\n          workbookName: opts.workbookName,\n          sheetName: opts.sheetName,\n          colIndex: col,\n          rowIndex: row,\n        };\n\n        // Copy conditional styles\n        for (const style of allConditionalStyles) {\n          for (const area of style.areas) {\n            if (\n              area.workbookName === opts.workbookName &&\n              area.sheetName === opts.sheetName\n            ) {\n              const intersection = intersectRanges(area.range, sourceCellRange);\n              if (intersection) {\n                const newStyle: ConditionalStyle = {\n                  areas: [{\n                    workbookName: opts.workbookName,\n                    sheetName: opts.sheetName,\n                    range: {\n                      start: { col: targetCell.colIndex, row: targetCell.rowIndex },\n                      end: {\n                        col: { type: \"number\", value: targetCell.colIndex },\n                        row: { type: \"number\", value: targetCell.rowIndex },\n                      },\n                    },\n                  }],\n                  condition: style.condition,\n                };\n                this.styleManager.addConditionalStyle(newStyle);\n              }\n            }\n          }\n        }\n\n        // Copy cell styles\n        for (const style of allCellStyles) {\n          for (const area of style.areas) {\n            if (\n              area.workbookName === opts.workbookName &&\n              area.sheetName === opts.sheetName\n            ) {\n              const intersection = intersectRanges(area.range, sourceCellRange);\n              if (intersection) {\n                const newStyle: DirectCellStyle = {\n                  areas: [{\n                    workbookName: opts.workbookName,\n                    sheetName: opts.sheetName,\n                    range: {\n                      start: { col: targetCell.colIndex, row: targetCell.rowIndex },\n                      end: {\n                        col: { type: \"number\", value: targetCell.colIndex },\n                        row: { type: \"number\", value: targetCell.rowIndex },\n                      },\n                    },\n                  }],\n                  style: style.style,\n                };\n                this.styleManager.addCellStyle(newStyle);\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Copy metadata from seed range to fill range with pattern repetition\n   */\n  private fillMetadata(\n    opts: { sheetName: string; workbookName: string },\n    seedRange: FiniteSpreadsheetRange,\n    fillRange: FiniteSpreadsheetRange,\n    direction: FillDirection\n  ): void {\n    const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n    const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n\n    // For each cell in fill range, copy metadata from corresponding seed cell\n    for (let row = fillRange.start.row; row <= fillRange.end.row; row++) {\n      for (let col = fillRange.start.col; col <= fillRange.end.col; col++) {\n        // Determine which seed cell corresponds to this fill cell\n        let seedCol: number;\n        let seedRow: number;\n\n        if (direction === \"down\" || direction === \"up\") {\n          // Vertical fill: keep column aligned, pattern repeat on rows\n          seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n          seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n        } else {\n          // Horizontal fill: keep row aligned, pattern repeat on columns\n          seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n          seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n        }\n\n        const sourceCellAddress: CellAddress = {\n          workbookName: opts.workbookName,\n          sheetName: opts.sheetName,\n          colIndex: seedCol,\n          rowIndex: seedRow,\n        };\n\n        const targetCellAddress: CellAddress = {\n          workbookName: opts.workbookName,\n          sheetName: opts.sheetName,\n          colIndex: col,\n          rowIndex: row,\n        };\n\n        // Copy metadata from source to target\n        const sourceMetadata = this.workbookManager.getCellMetadata(sourceCellAddress);\n        if (sourceMetadata) {\n          this.workbookManager.setCellMetadata(targetCellAddress, { ...sourceMetadata });\n        }\n      }\n    }\n  }\n}\n"
  ],
  "mappings": "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",
  "debugId": "744C43D0BAFDD79264756E2164756E21",
  "names": []
}