/*******************************************************************************
 * 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                      Added                       2012-03-04
 *******************************************************************************/

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using OfficeOpenXml.FormulaParsing;
using OfficeOpenXml.FormulaParsing.Excel.Functions;
using OfficeOpenXml.FormulaParsing.Exceptions;
using OfficeOpenXml.FormulaParsing.LexicalAnalysis;

namespace OfficeOpenXml;

public static class CalculationExtension {
  public static void Calculate(this ExcelWorkbook workbook) {
    Calculate(
        workbook,
        new() {
          AllowCirculareReferences = false,
        });
  }

  public static void Calculate(this ExcelWorkbook workbook, ExcelCalculationOption options) {
    Init(workbook);

    var dc = DependencyChainFactory.Create(workbook, options);
    workbook.FormulaParser.InitNewCalc();
    CalcChain(workbook, workbook.FormulaParser, dc);
  }

  public static void Calculate(this ExcelWorksheet worksheet) {
    Calculate(worksheet, new ExcelCalculationOption());
  }

  public static void Calculate(this ExcelWorksheet worksheet, ExcelCalculationOption options) {
    Init(worksheet.Workbook);
    //worksheet.Workbook._formulaParser = null; TODO:Cant reset. Don't work with userdefined or overrided worksheet functions
    var dc = DependencyChainFactory.Create(worksheet, options);

    // Display Calc Chain to determine why formula calculation is taking so long.
    // Uncomment the following line to display the Calc Chain.
    // DisplayCalcChain(worksheet, dc);

    var parser = worksheet.Workbook.FormulaParser;
    parser.InitNewCalc();
    CalcChain(worksheet.Workbook, parser, dc);
  }

  public static void Calculate(this ExcelRangeBase range) {
    Calculate(range, new());
  }

  public static void Calculate(this ExcelRangeBase range, ExcelCalculationOption options) {
    Init(range._workbook);
    var parser = range._workbook.FormulaParser;
    parser.InitNewCalc();
    var dc = DependencyChainFactory.Create(range, options);
    CalcChain(range._workbook, parser, dc);
  }

  public static object Calculate(this ExcelWorksheet worksheet, string formula) {
    return Calculate(worksheet, formula, new());
  }

  public static object Calculate(
      this ExcelWorksheet worksheet,
      string formula,
      ExcelCalculationOption options) {
    try {
      worksheet.CheckSheetType();
      if (string.IsNullOrEmpty(formula.Trim())) {
        return null;
      }
      Init(worksheet.Workbook);
      var parser = worksheet.Workbook.FormulaParser;
      parser.InitNewCalc();
      if (formula[0] == '=') {
        formula = formula.Substring(1); //Remove any starting equal sign
      }
      var dc = DependencyChainFactory.Create(worksheet, formula, options);
      var f = dc.list[0];
      dc.CalcOrder.RemoveAt(dc.CalcOrder.Count - 1);

      CalcChain(worksheet.Workbook, parser, dc);

      return parser.ParseCell(f.Tokens, worksheet.Name, -1, -1);
    } catch (Exception ex) {
      return new ExcelErrorValueException(ex.Message, ExcelErrorValue.Create(eErrorType.Value));
    }
  }

  private static void CalcChain(ExcelWorkbook wb, FormulaParser parser, DependencyChain dc) {
    foreach (var ix in dc.CalcOrder) {
      var item = dc.list[ix];
      try {
        var ws = wb.Worksheets.GetBySheetId(item.SheetID);
        var v = parser.ParseCell(item.Tokens, ws == null ? "" : ws.Name, item.Row, item.Column);
        SetValue(wb, item, v);
      } catch (FunctionException) {
        // Excel function is not supported by EPPlus
        throw;
      } catch (FormatException) {
        throw;
      } catch (Exception) {
        var error = ExcelErrorValue.Parse(ExcelErrorValue.Values.Value);
        SetValue(wb, item, error);
      }
    }
  }

  private static void Init(ExcelWorkbook workbook) {
    workbook._formulaTokens = new();
    ;
    foreach (var ws in workbook.Worksheets) {
      if (!(ws is ExcelChartsheet)) {
        ws._formulaTokens = new();
      }
    }
  }

  private static void SetValue(ExcelWorkbook workbook, FormulaCell item, object v) {
    if (item.Column == 0) {
      if (item.SheetID <= 0) {
        workbook.Names[item.Row].NameValue = v;
      } else {
        var sh = workbook.Worksheets.GetBySheetId(item.SheetID);
        sh.Names[item.Row].NameValue = v;
      }
    } else {
      var sheet = workbook.Worksheets.GetBySheetId(item.SheetID);
      sheet._values.SetValue(item.Row, item.Column, v);
    }
  }
}
