/*******************************************************************************
 * You may amend and distribute as you like, but don't remove this header!
 *
 * EPPlus provides server-side generation of Excel 2007/2010 spreadsheets.
 * See http://www.codeplex.com/EPPlus for details.
 *
 * Copyright (C) 2011  Jan Källman
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.

 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 *
 * The GNU Lesser General Public License can be viewed at http://www.opensource.org/licenses/lgpl-license.php
 * If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html
 *
 * All code and executables are provided "as is" with no warranty either express or implied.
 * The author accepts no liability for any damage or loss of business that this product may cause.
 *
 * Code change notes:
 *
 * Author							Change						Date
 *******************************************************************************
 * Jan Källman		Initial Release		        2009-10-01
 * Jan Källman		License changed GPL-->LGPL 2011-12-27
 *******************************************************************************/

using System;
using System.Collections.Generic;
using System.Globalization;
using OfficeOpenXml.FormulaParsing;
using OfficeOpenXml.FormulaParsing.Excel.Functions;
using OfficeOpenXml.FormulaParsing.LexicalAnalysis;

namespace OfficeOpenXml;

/// <summary>
/// Base class containing cell address manipulating methods.
/// </summary>
public abstract class ExcelCellBase {
  /// <summary>
  /// Get the sheet, row and column from the CellID
  /// </summary>
  /// <param name="cellId"></param>
  /// <param name="sheet"></param>
  /// <param name="row"></param>
  /// <param name="col"></param>
  static internal void SplitCellId(ulong cellId, out int sheet, out int row, out int col) {
    sheet = (int)(cellId % 0x8000);
    col = ((int)(cellId >> 15) & 0x3FF);
    row = ((int)(cellId >> 29));
  }

  /// <summary>
  /// Get the cellID for the cell.
  /// </summary>
  /// <param name="sheetId"></param>
  /// <param name="row"></param>
  /// <param name="col"></param>
  /// <returns></returns>
  internal static ulong GetCellId(int sheetId, int row, int col) {
    return ((ulong)sheetId) + (((ulong)col) << 15) + (((ulong)row) << 29);
  }

  private delegate string AddressTranslator(
    string part,
    int row,
    int col,
    int rowIncr,
    int colIncr);

  /// <summary>
  /// Translates a R1C1 to an absolut address/Formula
  /// </summary>
  /// <param name="value">Address</param>
  /// <param name="row">Current row</param>
  /// <param name="col">Current column</param>
  /// <returns>The RC address</returns>
  public static string TranslateFromR1C1(string value, int row, int col) {
    return Translate(value, ToAbs, row, col, -1, -1);
  }

  /// <summary>
  /// Translates a R1C1 to an absolut address/Formula: Version 1
  /// </summary>
  /// <param name="value">Address</param>
  /// <param name="row">Current row</param>
  /// <param name="col">Current column</param>
  /// <returns>The RC address</returns>
  public static string TranslateFromR1C1_V1(string value, int row, int col) {
    return Translate_V1(value, ToAbs_V1, row, col, -1, -1);
  }

  /// <summary>
  /// Translates a absolut address to R1C1 Format
  /// </summary>
  /// <param name="value">R1C1 Address</param>
  /// <param name="row">Current row</param>
  /// <param name="col">Current column</param>
  /// <returns>The absolut address/Formula</returns>
  public static string TranslateToR1C1(string value, int row, int col) {
    return Translate(value, ToR1C1, row, col, -1, -1);
  }

  /// <summary>
  /// Translates a absolute address to R1C1 Format : Version 1
  /// </summary>
  /// <param name="value">R1C1 Address</param>
  /// <param name="row">Current row</param>
  /// <param name="col">Current column</param>
  /// <returns>The absolut address/Formula</returns>
  public static string TranslateToR1C1_V1(string value, int row, int col) {
    return Translate_V1(value, ToR1C1_V1, row, col, -1, -1);
  }

  /// <summary>
  /// Translates betweein R1C1 or absolute addresses : Version 1
  /// </summary>
  /// <param name="value">The addresss/function</param>
  /// <param name="addressTranslator">The translating function</param>
  /// <param name="row"></param>
  /// <param name="col"></param>
  /// <param name="rowIncr"></param>
  /// <param name="colIncr"></param>
  /// <returns></returns>
  private static string Translate(
      string value,
      AddressTranslator addressTranslator,
      int row,
      int col,
      int rowIncr,
      int colIncr) {
    if (value == "") {
      return "";
    }
    bool isText = false;
    string ret = "";
    string part = "";
    char prevTq = (char)0;
    for (int pos = 0; pos < value.Length; pos++) {
      char c = value[pos];
      if (c == '"' || c == '\'') {
        if (isText && prevTq != c) {
          ret += c;
          continue;
        }

        if (isText == false && part != "" && prevTq == c) {
          ret += addressTranslator(part, row, col, rowIncr, colIncr);
          part = "";
          prevTq = (char)0;
        }
        prevTq = c;
        isText = !isText;
        ret += c;
      } else if (isText) {
        ret += c;
      } else {
        if ((c == '-'
                    || c == '+'
                    || c == '*'
                    || c == '/'
                    || c == '='
                    || c == '^'
                    || c == ','
                    || c == ':'
                    || c == '<'
                    || c == '>'
                    || c == '('
                    || c == ')'
                    || c == '!'
                    || c == ' '
                    || c == '&'
                    || c == '%')
            && (pos == 0
                    || value[pos - 1]
                        != '[')) //Last part to allow for R1C1 style [-x]
        {
          ret += addressTranslator(part, row, col, rowIncr, colIncr) + c;
          part = "";
        } else {
          part += c;
        }
      }
    }
    if (part != "") {
      ret += addressTranslator(part, row, col, rowIncr, colIncr);
    }
    return ret;
  }

  private static string Translate_V1(
      string value,
      AddressTranslator addressTranslator,
      int row,
      int col,
      int rowIncr,
      int colIncr) {
    if (value == "") {
      return "";
    }
    bool isText = false;
    string ret = "";
    string part = "";
    char prevTq = (char)0;
    value = value.Replace("\n", ""); // Eliminate new line characters in the formula
    for (int pos = 0; pos < value.Length; pos++) {
      char c = value[pos];
      if (c == '"' || c == '\'') {
        if (isText && prevTq != c) {
          ret += c;
          continue;
        }

        if (isText == false && part != "" && prevTq == c) {
          ret += addressTranslator(part, row, col, rowIncr, colIncr);
          part = "";
          prevTq = (char)0;
        }
        prevTq = c;
        isText = !isText;
        ret += c;
      } else if (isText) {
        ret += c;
      } else if (c
          == ':') // Keep Range expressions together
      {
        part += c;
      } else {
        if ((c == '-'
                    || c == '+'
                    || c == '*'
                    || c == '/'
                    || c == '='
                    || c == '^'
                    || c == ','
                    || c == '<'
                    || c == '>'
                    || c == '('
                    || c == ')'
                    || c == '!'
                    || c == ' '
                    || c == '&'
                    || c == '%')
            && (pos == 0
                    || value[pos - 1]
                        != '[')) //Last part to allow for R1C1 style [-x]
        {
          ret += addressTranslator(part, row, col, rowIncr, colIncr) + c;
          part = "";
        } else {
          part += c;
        }
      }
    }
    if (part != "") {
      ret += addressTranslator(part, row, col, rowIncr, colIncr);
    }
    return ret;
  }

  /// <summary>
  /// Translate to R1C1
  /// </summary>
  /// <param name="part">the value to be translated</param>
  /// <param name="row"></param>
  /// <param name="col"></param>
  /// <param name="rowIncr"></param>
  /// <param name="colIncr"></param>
  /// <returns></returns>
  private static string ToR1C1(string part, int row, int col, int rowIncr, int colIncr) {
    string ret = "R";
    if (GetRowCol(part, out var addrRow, out var addrCol, false)) {
      if (addrRow == 0 || addrCol == 0) {
        return part;
      }
      if (part.IndexOf('$', 1) > 0) {
        ret += addrRow.ToString();
      } else if (addrRow - row != 0) {
        ret += string.Format("[{0}]", addrRow - row);
      }

      if (part.StartsWith("$")) {
        return ret + "C" + addrCol;
      }
      if (addrCol - col != 0) {
        return ret + "C" + string.Format("[{0}]", addrCol - col);
      }
      return ret + "C";
    }
    return part;
  }

  private static string ToR1C1_V1(string part, int row, int col, int rowIncr, int colIncr) {
    // Handle range expressions
    if ((part.Length > 1) && (part.IndexOf(':', 1) > 0)) {
      return RangeToR1C1_V1(part, row, col, rowIncr, colIncr);
    }

    string ret = "R";
    if (GetRowCol(part, out var addrRow, out var addrCol, false)) {
      if (addrRow == 0 || addrCol == 0) {
        return part;
      }
      if (part.IndexOf('$', 1) > 0) {
        ret += addrRow.ToString();
      } else if (addrRow - row != 0) {
        ret += string.Format("[{0}]", addrRow - row);
      }

      if (part.StartsWith("$")) {
        return ret + "C" + addrCol;
      }
      if (addrCol - col != 0) {
        return ret + "C" + string.Format("[{0}]", addrCol - col);
      }
      return ret + "C";
    }
    return part;
  }

  private static string RangeToR1C1_V1(string part, int row, int col, int rowIncr, int colIncr) {
    // Split range expression
    string[] cellValues = part.Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries);

    // Convert range expressions
    string result = "";
    result += RangeCellToR1C1_V1(cellValues[0], row, col, rowIncr, colIncr);
    result += ":";
    result +=
        (cellValues.Length > 1)
            ? RangeCellToR1C1_V1(cellValues[1], row, col, rowIncr, colIncr)
            : "";

    // Return converted range expression
    return result;
  }

  private static string RangeCellToR1C1_V1(
      string part,
      int row,
      int col,
      int rowIncr,
      int colIncr) {
    string result = "";
    if (GetRowCol_V1(
        part,
        out var addrRow,
        out var addrCol,
        false,
        out var fixedRow,
        out var fixedCol)) {
      if (addrRow > 0) {
        result += "R";
        if (fixedRow) {
          // Absolute row
          result += addrRow.ToString();
        } else if (addrRow - row != 0) {
          // Relative row
          result += string.Format("[{0}]", addrRow - row);
        }
      }

      if (addrCol > 0) {
        result += "C";
        if (fixedCol) {
          // Absolute column
          result += addrCol;
        } else if (addrCol - col != 0) {
          // Relative column
          result += string.Format("[{0}]", addrCol - col);
        }
      }
      return result;
    }
    return part;
  }

  /// <summary>
  /// Translates to absolute address
  /// </summary>
  /// <param name="part"></param>
  /// <param name="row"></param>
  /// <param name="col"></param>
  /// <param name="rowIncr"></param>
  /// <param name="colIncr"></param>
  /// <returns></returns>
  ///
  private static string ToAbs(string part, int row, int col, int rowIncr, int colIncr) {
    string check = part.ToUpper(CultureInfo.InvariantCulture);

    int rStart = check.IndexOf("R");
    if (rStart != 0) {
      return part;
    }
    if (part.Length
        == 1) //R
    {
      return GetAddress(row, col);
    }

    int cStart = check.IndexOf("C");
    bool absoluteRow;
    if (cStart == -1) {
      int rNum = GetRc(part, row, out absoluteRow);
      if (rNum > int.MinValue) {
        return GetAddress(rNum, absoluteRow, col, false);
      }
      return part;
    } else {
      int rNum = GetRc(part.Substring(1, cStart - 1), row, out absoluteRow);
      int cNum = GetRc(
          part.Substring(cStart + 1, part.Length - cStart - 1),
          col,
          out var absoluteCol);
      if (rNum > int.MinValue && cNum > int.MinValue) {
        return GetAddress(rNum, absoluteRow, cNum, absoluteCol);
      }
      return part;
    }
  }

  private static string ToAbs_V1(string part, int row, int col, int rowIncr, int colIncr) {
    bool absoluteCol = false;
    bool absoluteRow = false;
    int colNum = -1;
    int rowNum = -1;
    int num;
    int numLength;
    int pos = 0;

    // Handle range expressions
    if ((part.Length > 1) && (part.IndexOf(':', 1) > 0)) {
      return RangeToA1_V1(part, row, col, rowIncr, colIncr);
    }

    // Ensure part is present
    if (string.IsNullOrWhiteSpace(part)) {
      return "";
    }

    // Convert to upper case
    string check = part.ToUpper(CultureInfo.InvariantCulture);

    // Parse "R", if any
    if (pos < part.Length && check[pos] == 'R') {
      pos += 1;

      if (pos >= part.Length) {
        // Only "R" present
        absoluteRow = false;
        rowNum = row;
      } else if (pos < part.Length && check[pos] == 'C') {
        // "R" followed by "C"
        absoluteRow = false;
        rowNum = row;
      } else if (pos < part.Length && check[pos] == '[') {
        // "R" followed by relative row number
        pos += 1;
        num = GetNumber_V1(check.Substring(pos, part.Length - pos), out numLength);
        if (num == Int32.MinValue) {
          return part;
        }
        pos += numLength;

        if (pos < part.Length && check[pos] == ']') {
          pos += 1;
        } else {
          return part;
        }

        absoluteRow = false;
        rowNum = row + num;
      } else if (pos < part.Length) {
        // "R" followed by absolute row number
        num = GetNumber_V1(check.Substring(pos, part.Length - pos), out numLength);
        if (rowNum == Int32.MinValue) {
          return part;
        }
        pos += numLength;

        absoluteRow = true;
        rowNum = num;
      }
    }

    // Parse "C", if any
    if (pos < part.Length && check[pos] == 'C') {
      pos += 1;

      if (pos >= part.Length) {
        // Only "C" present
        absoluteCol = false;
        colNum = col;
      } else if (pos < part.Length && check[pos] == '[') {
        // "C" followed by relative column number
        pos += 1;
        num = GetNumber_V1(check.Substring(pos, part.Length - pos), out numLength);
        if (num == Int32.MinValue) {
          return part;
        }
        pos += numLength;

        if (pos < part.Length && check[pos] == ']') {
          pos += 1;
        } else {
          return part;
        }

        absoluteCol = false;
        colNum = col + num;
      } else if (pos < part.Length) {
        // "C" followed by absolute column number
        num = GetNumber_V1(check.Substring(pos, part.Length - pos), out numLength);
        if (num == Int32.MinValue) {
          return part;
        }
        pos += numLength;

        absoluteCol = true;
        colNum = num;
      }
    }

    // Ensure nothing remains unparsed
    if (pos < part.Length) {
      return part;
    }

    // Exit if neither row nor column is present
    if ((rowNum == Int32.MinValue) && (colNum == Int32.MinValue)) {
      return part;
    }

    // Append column
    string result = "";
    if (colNum >= 0) {
      if (absoluteCol) {
        result += "$";
      }
      result += GetColumnLetter(colNum);
    }

    // Append row
    if (rowNum >= 0) {
      if (absoluteRow) {
        result += "$";
      }
      result += rowNum.ToString();
    }

    // Return result
    return result;
  }

  private static int GetNumber_V1(string value, out int length) {
    // Get number length
    length = 0;

    // Ensure value is present
    if (string.IsNullOrWhiteSpace(value)) {
      return Int32.MinValue;
    }

    // Check for sign
    if ((length < value.Length) && ((value[length] == '-') || (value[length] == '+'))) {
      length += 1;
    }

    // Get number length
    while (length < value.Length && value[length] >= '0' && value[length] <= '9') {
      length += 1;
    }

    // No number found
    if (length == 0) {
      return Int32.MinValue;
    }

    // Return number value
    return (int.TryParse(value.Substring(0, length), out var result)) ? result : Int32.MinValue;
  }

  private static string RangeToA1_V1(string part, int row, int col, int rowIncr, int colIncr) {
    // Split range expression
    string[] cellValues = part.Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries);

    // Convert range expressions
    string result = "";
    result += ToAbs_V1(cellValues[0], row, col, rowIncr, colIncr);
    result += ":";
    result += ToAbs_V1(cellValues[1], row, col, rowIncr, colIncr);

    // Return converted range expression
    return result;
  }

  /// <summary>
  /// Get the offset value for RC format
  /// </summary>
  /// <param name="value"></param>
  /// <param name="offsetValue"></param>
  /// <param name="fixedAddr"></param>
  /// <returns></returns>
  ///
  private static int GetRc(string value, int offsetValue, out bool fixedAddr) {
    if (value == "") {
      fixedAddr = false;
      return offsetValue;
    }
    int num;
    if (value[0] == '['
        && value[value.Length - 1]
            == ']') //Offset?
    {
      fixedAddr = false;
      if (int.TryParse(value.Substring(1, value.Length - 2), out num)) {
        return (offsetValue + num);
      }
      return int.MinValue;
    }
    // Absolute address
    fixedAddr = true;
    if (int.TryParse(value, out num)) {
      return num;
    }
    return int.MinValue;
  }

  /// <summary>
  /// Returns the character representation of the numbered column
  /// </summary>
  /// <param name="iColumnNumber">The number of the column</param>
  /// <returns>The letter representing the column</returns>
  protected internal static string GetColumnLetter(int iColumnNumber) {
    return GetColumnLetter(iColumnNumber, false);
  }

  protected internal static string GetColumnLetter(int iColumnNumber, bool fixedCol) {
    if (iColumnNumber < 1) {
      //throw new Exception("Column number is out of range");
      return "#REF!";
    }

    string sCol = "";
    do {
      sCol = ((char)('A' + ((iColumnNumber - 1) % 26))) + sCol;
      iColumnNumber = (iColumnNumber - ((iColumnNumber - 1) % 26)) / 26;
    } while (iColumnNumber > 0);
    return fixedCol ? "$" + sCol : sCol;
  }

  internal static bool GetRowColFromAddress(
      string cellAddress,
      out int fromRow,
      out int fromColumn,
      out int toRow,
      out int toColumn) {
    bool fixedFromRow,
        fixedFromColumn,
        fixedToRow,
        fixedToColumn;
    return GetRowColFromAddress(
        cellAddress,
        out fromRow,
        out fromColumn,
        out toRow,
        out toColumn,
        out fixedFromRow,
        out fixedFromColumn,
        out fixedToRow,
        out fixedToColumn);
  }

  /// <summary>
  /// Get the row/columns for a Cell-address
  /// </summary>
  /// <param name="cellAddress">The address</param>
  /// <param name="fromRow">Returns the to column</param>
  /// <param name="fromColumn">Returns the from column</param>
  /// <param name="toRow">Returns the to row</param>
  /// <param name="toColumn">Returns the from row</param>
  /// <param name="fixedFromRow">Is the from row fixed?</param>
  /// <param name="fixedFromColumn">Is the from column fixed?</param>
  /// <param name="fixedToRow">Is the to row fixed?</param>
  /// <param name="fixedToColumn">Is the to column fixed?</param>
  /// <returns></returns>
  internal static bool GetRowColFromAddress(
      string cellAddress,
      out int fromRow,
      out int fromColumn,
      out int toRow,
      out int toColumn,
      out bool fixedFromRow,
      out bool fixedFromColumn,
      out bool fixedToRow,
      out bool fixedToColumn) {
    bool ret;
    if (cellAddress.IndexOf('[')
        > 0) //External reference or reference to Table or Pivottable.
    {
      fromRow = -1;
      fromColumn = -1;
      toRow = -1;
      toColumn = -1;
      fixedFromRow = false;
      fixedFromColumn = false;
      fixedToRow = false;
      fixedToColumn = false;
      return false;
    }

    cellAddress = cellAddress.ToUpper(CultureInfo.InvariantCulture);
    //This one can be removed when the worksheet Select format is fixed
    if (cellAddress.IndexOf(' ') > 0) {
      cellAddress = cellAddress.Substring(0, cellAddress.IndexOf(' '));
    }

    if (cellAddress.IndexOf(':') < 0) {
      ret = GetRowColFromAddress(
          cellAddress,
          out fromRow,
          out fromColumn,
          out fixedFromRow,
          out fixedFromColumn);
      toColumn = fromColumn;
      toRow = fromRow;
      fixedToRow = fixedFromRow;
      fixedToColumn = fixedFromColumn;
    } else {
      string[] cells = cellAddress.Split(':');
      ret = GetRowColFromAddress(
          cells[0],
          out fromRow,
          out fromColumn,
          out fixedFromRow,
          out fixedFromColumn);
      if (ret) {
        ret = GetRowColFromAddress(
            cells[1],
            out toRow,
            out toColumn,
            out fixedToRow,
            out fixedToColumn);
      } else {
        GetRowColFromAddress(cells[1], out toRow, out toColumn, out fixedToRow, out fixedToColumn);
      }

      if (fromColumn <= 0) {
        fromColumn = 1;
      }
      if (fromRow <= 0) {
        fromRow = 1;
      }
      if (toColumn <= 0) {
        toColumn = ExcelPackage.MaxColumns;
      }
      if (toRow <= 0) {
        toRow = ExcelPackage.MaxRows;
      }
    }
    return ret;
  }

  /// <summary>
  /// Get the row/column for n Cell-address
  /// </summary>
  /// <param name="cellAddress">The address</param>
  /// <param name="row">Returns Tthe row</param>
  /// <param name="column">Returns the column</param>
  /// <returns>true if valid</returns>
  internal static bool GetRowColFromAddress(string cellAddress, out int row, out int column) {
    return GetRowCol(cellAddress, out row, out column, true);
  }

  internal static bool GetRowColFromAddress(
      string cellAddress,
      out int row,
      out int col,
      out bool fixedRow,
      out bool fixedCol) {
    return GetRowCol(cellAddress, out row, out col, true, out fixedRow, out fixedCol);
  }

  /// <summary>
  /// Get the row/column for a Cell-address
  /// </summary>
  /// <param name="address">the address</param>
  /// <param name="row">returns the row</param>
  /// <param name="col">returns the column</param>
  /// <param name="throwException">throw exception if invalid, otherwise returns false</param>
  /// <returns></returns>
  internal static bool GetRowCol(string address, out int row, out int col, bool throwException) {
    bool fixedRow,
        fixedCol;
    return GetRowCol(address, out row, out col, throwException, out fixedRow, out fixedCol);
  }

  internal static bool GetRowCol(
      string address,
      out int row,
      out int col,
      bool throwException,
      out bool fixedRow,
      out bool fixedCol) {
    bool colPart = true;
    int colStartIx = 0;
    int colLength = 0;
    col = 0;
    row = 0;
    fixedRow = false;
    fixedCol = false;

    if (address.EndsWith("#REF!")) {
      row = 0;
      col = 0;
      return true;
    }

    int sheetMarkerIndex = address.IndexOf('!');
    if (sheetMarkerIndex >= 0) {
      colStartIx = sheetMarkerIndex + 1;
    }
    address = address.ToUpper(CultureInfo.InvariantCulture);
    for (int i = colStartIx; i < address.Length; i++) {
      char c = address[i];
      if (colPart && (c >= 'A' && c <= 'Z') && colLength <= 3) {
        col *= 26;
        col += c - 64;
        colLength++;
      } else if (c >= '0' && c <= '9') {
        row *= 10;
        row += c - 48;
        colPart = false;
      } else if (c == '$') {
        if (i == colStartIx) {
          colStartIx++;
          fixedCol = true;
        } else {
          colPart = false;
          fixedRow = true;
        }
      } else {
        row = 0;
        col = 0;
        if (throwException) {
          throw (new(string.Format("Invalid Address format {0}", address)));
        }
        return false;
      }
    }
    return row != 0 || col != 0;
  }

  internal static bool GetRowCol_V1(
      string address,
      out int row,
      out int col,
      bool throwException,
      out bool fixedRow,
      out bool fixedCol) {
    bool colPart = true;
    bool isFixed = false;
    int colStartIx = 0;
    int colLength = 0;
    col = 0;
    row = 0;
    fixedRow = false;
    fixedCol = false;

    if (address.EndsWith("#REF!")) {
      row = 0;
      col = 0;
      return true;
    }

    int sheetMarkerIndex = address.IndexOf('!');
    if (sheetMarkerIndex >= 0) {
      colStartIx = sheetMarkerIndex + 1;
    }
    address = address.ToUpper(CultureInfo.InvariantCulture);
    for (int i = colStartIx; i < address.Length; i++) {
      char c = address[i];
      if (c == '$') {
        // Absolute address
        isFixed = true;
      } else if (colPart && (c >= 'A' && c <= 'Z') && colLength <= 3) {
        // Column portion of address
        if (isFixed) {
          fixedCol = true;
          isFixed = false;
        }

        col *= 26;
        col += c - 64;
        colLength++;
      } else if (c >= '0' && c <= '9') {
        // Row portion of address
        if (isFixed) {
          fixedRow = true;
          isFixed = false;
        }

        row *= 10;
        row += c - 48;
        colPart = false;
      } else {
        row = 0;
        col = 0;
        if (throwException) {
          throw (new(string.Format("Invalid Address format {0}", address)));
        }
        return false;
      }
    }
    return row != 0 || col != 0;
  }

  private static int GetColumn(string sCol) {
    int col = 0;
    int len = sCol.Length - 1;
    for (int i = len; i >= 0; i--) {
      col += (sCol[i] - 64) * (int)(Math.Pow(26, len - i));
    }
    return col;
  }

  /// <summary>
  /// Returns the AlphaNumeric representation that Excel expects for a Cell Address
  /// </summary>
  /// <param name="row">The number of the row</param>
  /// <param name="column">The number of the column in the worksheet</param>
  /// <returns>The cell address in the format A1</returns>
  public static string GetAddress(int row, int column) {
    return GetAddress(row, column, false);
  }

  /// <summary>
  /// Returns the AlphaNumeric representation that Excel expects for a Cell Address
  /// </summary>
  /// <param name="row">The number of the row</param>
  /// <param name="column">The number of the column in the worksheet</param>
  /// <param name="absoluteRow">Absolute row</param>
  /// <param name="absoluteCol">Absolute column</param>
  /// <returns>The cell address in the format A1</returns>
  public static string GetAddress(int row, bool absoluteRow, int column, bool absoluteCol) {
    return (absoluteCol ? "$" : "") + GetColumnLetter(column) + (absoluteRow ? "$" : "") + row;
  }

  /// <summary>
  /// Returns the AlphaNumeric representation that Excel expects for a Cell Address
  /// </summary>
  /// <param name="row">The number of the row</param>
  /// <param name="column">The number of the column in the worksheet</param>
  /// <param name="absolute">Get an absolute address ($A$1)</param>
  /// <returns>The cell address in the format A1</returns>
  public static string GetAddress(int row, int column, bool absolute) {
    if (row == 0 || column == 0) {
      return "#REF!";
    }
    if (absolute) {
      return ("$" + GetColumnLetter(column) + "$" + row);
    }
    return (GetColumnLetter(column) + row);
  }

  /// <summary>
  /// Returns the AlphaNumeric representation that Excel expects for a Cell Address
  /// </summary>
  /// <param name="fromRow">From row number</param>
  /// <param name="fromColumn">From column number</param>
  /// <param name="toRow">To row number</param>
  /// <param name="toColumn">From column number</param>
  /// <returns>The cell address in the format A1</returns>
  public static string GetAddress(int fromRow, int fromColumn, int toRow, int toColumn) {
    return GetAddress(fromRow, fromColumn, toRow, toColumn, false);
  }

  /// <summary>
  /// Returns the AlphaNumeric representation that Excel expects for a Cell Address
  /// </summary>
  /// <param name="fromRow">From row number</param>
  /// <param name="fromColumn">From column number</param>
  /// <param name="toRow">To row number</param>
  /// <param name="toColumn">From column number</param>
  /// <param name="absolute">if true address is absolute (like $A$1)</param>
  /// <returns>The cell address in the format A1</returns>
  public static string GetAddress(
      int fromRow,
      int fromColumn,
      int toRow,
      int toColumn,
      bool absolute) {
    if (fromRow == toRow && fromColumn == toColumn) {
      return GetAddress(fromRow, fromColumn, absolute);
    }
    if (fromRow == 1 && toRow == ExcelPackage.MaxRows) {
      var absChar = absolute ? "$" : "";
      return absChar + GetColumnLetter(fromColumn) + ":" + absChar + GetColumnLetter(toColumn);
    }
    if (fromColumn == 1 && toColumn == ExcelPackage.MaxColumns) {
      var absChar = absolute ? "$" : "";
      return absChar + fromRow + ":" + absChar + toRow;
    }
    return GetAddress(fromRow, fromColumn, absolute) + ":" + GetAddress(toRow, toColumn, absolute);
  }

  /// <summary>
  /// Returns the AlphaNumeric representation that Excel expects for a Cell Address
  /// </summary>
  /// <param name="fromRow">From row number</param>
  /// <param name="fromColumn">From column number</param>
  /// <param name="toRow">To row number</param>
  /// <param name="toColumn">From column number</param>
  /// <param name="fixedFromColumn"></param>
  /// <param name="fixedFromRow"></param>
  /// <param name="fixedToColumn"></param>
  /// <param name="fixedToRow"></param>
  /// <returns>The cell address in the format A1</returns>
  public static string GetAddress(
      int fromRow,
      int fromColumn,
      int toRow,
      int toColumn,
      bool fixedFromRow,
      bool fixedFromColumn,
      bool fixedToRow,
      bool fixedToColumn) {
    if (fromRow == toRow && fromColumn == toColumn) {
      return GetAddress(fromRow, fixedFromRow, fromColumn, fixedFromColumn);
    }
    if (fromRow == 1 && toRow == ExcelPackage.MaxRows) {
      return GetColumnLetter(fromColumn, fixedFromColumn)
          + ":"
          + GetColumnLetter(toColumn, fixedToColumn);
    }
    if (fromColumn == 1 && toColumn == ExcelPackage.MaxColumns) {
      return (fixedFromRow ? "$" : "") + fromRow + ":" + (fixedToRow ? "$" : "") + toRow;
    }
    return GetAddress(fromRow, fixedFromRow, fromColumn, fixedFromColumn)
        + ":"
        + GetAddress(toRow, fixedToRow, toColumn, fixedToColumn);
  }

  /// <summary>
  /// Get the full address including the worksheet name
  /// </summary>
  /// <param name="worksheetName">The name of the worksheet</param>
  /// <param name="address">The address</param>
  /// <returns>The full address</returns>
  public static string GetFullAddress(string worksheetName, string address) {
    return GetFullAddress(worksheetName, address, true);
  }

  internal static string GetFullAddress(string worksheetName, string address, bool fullRowCol) {
    if (address.IndexOf("!") == -1 || address == "#REF!") {
      if (fullRowCol) {
        string[] cells = address.Split(':');
        if (cells.Length > 0) {
          address = string.Format("'{0}'!{1}", worksheetName, cells[0]);
          if (cells.Length > 1) {
            address += string.Format(":{0}", cells[1]);
          }
        }
      } else {
        var a = new ExcelAddressBase(address);
        if ((a._fromRow == 1 && a._toRow == ExcelPackage.MaxRows)
            || (a._fromCol == 1 && a._toCol == ExcelPackage.MaxColumns)) {
          address = string.Format(
              "'{0}'!{1}{2}:{3}{4}",
              worksheetName,
              GetColumnLetter(a._fromCol),
              a._fromRow,
              GetColumnLetter(a._toCol),
              a._toRow);
        } else {
          address = GetFullAddress(worksheetName, address, true);
        }
      }
    }
    return address;
  }

  public static bool IsValidAddress(string address) {
    address = address.ToUpper(CultureInfo.InvariantCulture);
    string r1 = "",
        c1 = "",
        r2 = "",
        c2 = "";
    bool isSecond = false;
    for (int i = 0; i < address.Length; i++) {
      if (address[i] >= 'A' && address[i] <= 'Z') {
        if (isSecond == false) {
          if (r1 != "") {
            return false;
          }
          c1 += address[i];
          if (c1.Length > 3) {
            return false;
          }
        } else {
          if (r2 != "") {
            return false;
          }
          c2 += address[i];
          if (c2.Length > 3) {
            return false;
          }
        }
      } else if (address[i] >= '0' && address[i] <= '9') {
        if (isSecond == false) {
          r1 += address[i];
          if (r1.Length > 7) {
            return false;
          }
        } else {
          r2 += address[i];
          if (r2.Length > 7) {
            return false;
          }
        }
      } else if (address[i] == ':') {
        isSecond = true;
      } else if (address[i] == '$') {
        if (i == address.Length - 1 || address[i + 1] == ':') {
          return false;
        }
      } else {
        return false;
      }
    }

    if (r1 != ""
        && c1 != ""
        && r2 == ""
        && c2
            == "") //Single Cell
    {
      return (GetColumn(c1) <= ExcelPackage.MaxColumns && int.Parse(r1) <= ExcelPackage.MaxRows);
    }
    if (r1 != ""
        && r2 != ""
        && c1 != ""
        && c2
            != "") //Range
    {
      var iR2 = int.Parse(r2);
      var iC2 = GetColumn(c2);

      return GetColumn(c1) <= iC2
          && int.Parse(r1) <= iR2
          && iC2 <= ExcelPackage.MaxColumns
          && iR2 <= ExcelPackage.MaxRows;
    }
    if (r1 == ""
        && r2 == ""
        && c1 != ""
        && c2
            != "") //Full Column
    {
      var c2N = GetColumn(c2);
      return (GetColumn(c1) <= c2N && c2N <= ExcelPackage.MaxColumns);
    }
    if (r1 != "" && r2 != "" && c1 == "" && c2 == "") {
      var iR2 = int.Parse(r2);

      return int.Parse(r1) <= iR2 && iR2 <= ExcelPackage.MaxRows;
    }
    return false;
  }

  /// <summary>
  /// Checks that a cell address (e.g. A5) is valid.
  /// </summary>
  /// <param name="cellAddress">The alphanumeric cell address</param>
  /// <returns>True if the cell address is valid</returns>
  public static bool IsValidCellAddress(string cellAddress) {
    bool result = false;
    try {
      if (GetRowColFromAddress(cellAddress, out var row, out var col)) {
        if (row > 0 && col > 0 && row <= ExcelPackage.MaxRows && col <= ExcelPackage.MaxColumns) {
          result = true;
        } else {
          result = false;
        }
      }
    } catch {}
    return result;
  }

  /// <summary>
  /// Updates the Excel formula so that all the cellAddresses are incremented by the row and column increments
  /// if they fall after the afterRow and afterColumn.
  /// Supports inserting rows and columns into existing templates.
  /// </summary>
  /// <param name="formula">The Excel formula</param>
  /// <param name="rowIncrement">The amount to increment the cell reference by</param>
  /// <param name="colIncrement">The amount to increment the cell reference by</param>
  /// <param name="afterRow">Only change rows after this row</param>
  /// <param name="afterColumn">Only change columns after this column</param>
  /// <returns></returns>
  internal static string UpdateFormulaReferences(
      string formula,
      int rowIncrement,
      int colIncrement,
      int afterRow,
      int afterColumn,
      bool setFixed = false) {
    //return Translate(Formula, AddToRowColumnTranslator, afterRow, afterColumn, rowIncrement, colIncrement);
    var d = new Dictionary<string, object>();
    try {
      var sct = new SourceCodeTokenizer(FunctionNameProvider.Empty, NameValueProvider.Empty);
      var tokens = sct.Tokenize(formula);
      String f = "";
      foreach (var t in tokens) {
        if (t.TokenType == TokenType.ExcelAddress) {
          var a = new ExcelAddressBase(t.Value);

          if (!String.IsNullOrEmpty(
              a._ws)) // Bug 15339
          {
            // This is from a different worksheet, thus no update is required
            f += a.Address;
            continue;
          }

          if (rowIncrement > 0) {
            a = a.AddRow(afterRow, rowIncrement, setFixed);
          } else if (rowIncrement < 0) {
            a = a.DeleteRow(afterRow, -rowIncrement, setFixed);
          }
          if (colIncrement > 0) {
            a = a.AddColumn(afterColumn, colIncrement, setFixed);
          } else if (colIncrement < 0) {
            a = a.DeleteColumn(afterColumn, -colIncrement, setFixed);
          }
          if (a == null || !a.IsValidRowCol()) {
            f += "#REF!";
          } else {
            f += a.Address;
          }
        } else {
          f += t.Value;
        }
      }
      return f;
    } catch //Invalid formula, skip updateing addresses
    {
      return formula;
    }
  }
}
