/*******************************************************************************
 * 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 OfficeOpenXml.FormulaParsing;
using OfficeOpenXml.FormulaParsing.Excel.Functions;
using OfficeOpenXml.FormulaParsing.Exceptions;

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);
    }
  }
}
