/*******************************************************************************
 * 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
 * ******************************************************************************
 * Mats Alm   		                Added       		        2013-03-01 (Prior file history on https://github.com/swmal/ExcelFormulaParser)
 *******************************************************************************/

using System;
using System.Collections.Generic;
using System.Linq;

namespace AppsheetEpplus;

/// <summary>
/// Provides access to various functionality regarding
/// excel formula evaluation.
/// </summary>
public class FormulaParserManager {
  private readonly FormulaParser _parser;

  internal FormulaParserManager(FormulaParser parser) {
    Require.That(parser).Named("parser").IsNotNull();
    _parser = parser;
  }

  /// <summary>
  /// Loads a module containing custom functions to the formula parser. By using
  /// this method you can add your own implementations of Excel functions, by
  /// implementing a <see cref="IFunctionModule"/>.
  /// </summary>
  /// <param name="module">A <see cref="IFunctionModule"/> containing <see cref="ExcelFunction"/>s.</param>
  public void LoadFunctionModule(IFunctionModule module) {
    _parser.Configure(x => x.FunctionRepository.LoadModule(module));
  }

  /// <summary>
  /// If the supplied <paramref name="functionName"/> does not exist, the supplied
  /// <paramref name="functionImpl"/> implementation will be added to the formula parser.
  /// If it exists, the existing function will be replaced by the supplied <paramref name="functionImpl">function implementation</paramref>
  /// </summary>
  /// <param name="functionName"></param>
  /// <param name="functionImpl"></param>
  public void AddOrReplaceFunction(string functionName, ExcelFunction functionImpl) {
    _parser.Configure(x => x.FunctionRepository.AddOrReplaceFunction(functionName, functionImpl));
  }

  /// <summary>
  /// Returns an enumeration of all functions implemented, both the built in functions
  /// and functions added using the LoadFunctionModule method of this class.
  /// </summary>
  /// <returns>Function names in lower case</returns>
  public IEnumerable<string> GetImplementedFunctionNames() {
    var fnList = _parser.FunctionNames.ToList();
    fnList.Sort((x, y) => String.Compare(x, y, StringComparison.Ordinal));
    return fnList;
  }

  /// <summary>
  /// Parses the supplied <paramref name="formula"/> and returns the result.
  /// </summary>
  /// <param name="formula"></param>
  /// <returns></returns>
  public object Parse(string formula) {
    return _parser.Parse(formula);
  }

  // Praveen's Parser Support
  public ExpressionGraph ParseToGraph(string formula) {
    return _parser.ParseToGraph(formula);
  }
}
