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

namespace OfficeOpenXml.FormulaParsing;

/// <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.ExpressionGraph ParseToGraph(string formula) {
    return _parser.ParseToGraph(formula);
  }
}
