/*******************************************************************************
 * 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.Collections.Generic;
using System.Linq;

namespace AppsheetEpplus;

public class ExpressionCompiler : IExpressionCompiler {
  private IEnumerable<Expression> _expressions;
  private readonly IExpressionConverter _expressionConverter;
  private readonly ICompileStrategyFactory _compileStrategyFactory;

  public ExpressionCompiler()
      : this(new ExpressionConverter(), new CompileStrategyFactory()) {}

  public ExpressionCompiler(
      IExpressionConverter expressionConverter,
      ICompileStrategyFactory compileStrategyFactory) {
    _expressionConverter = expressionConverter;
    _compileStrategyFactory = compileStrategyFactory;
  }

  public CompileResult Compile(IEnumerable<Expression> expressions) {
    _expressions = expressions;
    return PerformCompilation();
  }

  public CompileResult Compile(
      string worksheet,
      int row,
      int column,
      IEnumerable<Expression> expressions) {
    _expressions = expressions;
    return PerformCompilation(worksheet, row, column);
  }

  private CompileResult PerformCompilation(string worksheet = "", int row = -1, int column = -1) {
    var compiledExpressions = HandleGroupedExpressions();
    while (compiledExpressions.Any(x => x.Operator != null)) {
      var prec = FindLowestPrecedence();
      compiledExpressions = HandlePrecedenceLevel(prec);
    }
    if (_expressions.Any()) {
      return compiledExpressions.First().Compile();
    }
    return CompileResult.Empty;
  }

  private IEnumerable<Expression> HandleGroupedExpressions() {
    if (!_expressions.Any()) {
      return [];
    }
    var first = _expressions.First();
    var groupedExpressions = _expressions.Where(x => x.IsGroupedExpression);
    foreach (var groupedExpression in groupedExpressions) {
      var result = groupedExpression.Compile();
      if (result == CompileResult.Empty) {
        continue;
      }
      var newExp = _expressionConverter.FromCompileResult(result);
      newExp.Operator = groupedExpression.Operator;
      newExp.Prev = groupedExpression.Prev;
      newExp.Next = groupedExpression.Next;
      if (groupedExpression.Prev != null) {
        groupedExpression.Prev.Next = newExp;
      }
      if (groupedExpression.Next != null) {
        groupedExpression.Next.Prev = newExp;
      }
      if (groupedExpression == first) {
        first = newExp;
      }
    }
    return RefreshList(first);
  }

  private IEnumerable<Expression> HandlePrecedenceLevel(int precedence) {
    var first = _expressions.First();
    var expressionsToHandle = _expressions.Where(x =>
        x.Operator != null && x.Operator.Precedence == precedence);
    var last = expressionsToHandle.Last();
    var expression = expressionsToHandle.First();
    do {
      var strategy = _compileStrategyFactory.Create(expression);
      var compiledExpression = strategy.Compile();
      if (compiledExpression is ExcelErrorExpression) {
        return RefreshList(compiledExpression);
      }
      if (expression == first) {
        first = compiledExpression;
      }

      expression = compiledExpression;
    } while (expression != null
            && expression.Operator != null
            && expression.Operator.Precedence == precedence);
    return RefreshList(first);
  }

  private int FindLowestPrecedence() {
    return _expressions.Where(x => x.Operator != null).Min(x => x.Operator.Precedence);
  }

  private IEnumerable<Expression> RefreshList(Expression first) {
    var resultList = new List<Expression>();
    var exp = first;
    resultList.Add(exp);
    while (exp.Next != null) {
      resultList.Add(exp.Next);
      exp = exp.Next;
    }
    _expressions = resultList;
    return resultList;
  }
}
