﻿/*******************************************************************************
 * 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.Operators;

namespace OfficeOpenXml.FormulaParsing.ExpressionGraph;

public abstract class Expression {
  public string ExpressionString { get; private set; }

  private readonly List<Expression> _children = new();

  public IEnumerable<Expression> Children => _children;

  public Expression Next { get; set; }

  public Expression Prev { get; set; }

  public IOperator Operator { get; set; }

  public abstract bool IsGroupedExpression { get; }

  public Expression() {}

  public Expression(string expression) {
    ExpressionString = expression;
    Operator = null;
  }

  public virtual bool ParentIsLookupFunction { get; set; }

  public virtual bool HasChildren => _children.Any();

  public virtual Expression PrepareForNextChild() {
    return this;
  }

  public virtual Expression AddChild(Expression child) {
    if (_children.Any()) {
      var last = _children.Last();
      child.Prev = last;
      last.Next = child;
    }
    _children.Add(child);
    return child;
  }

  public virtual Expression MergeWithNext() {
    Expression expression;
    if (Next != null && Operator != null) {
      var result = Operator.Apply(Compile(), Next.Compile());
      expression = ExpressionConverter.Instance.FromCompileResult(result);
      if (expression is ExcelErrorExpression) {
        expression.Next = null;
        expression.Prev = null;
        return expression;
      }
      if (Next != null) {
        expression.Operator = Next.Operator;
      } else {
        expression.Operator = null;
      }
      expression.Next = Next.Next;
      if (expression.Next != null) {
        expression.Next.Prev = expression;
      }
      expression.Prev = Prev;
    } else {
      throw (new FormatException("Invalid formula syntax. Operator missing expression."));
    }
    if (Prev != null) {
      Prev.Next = expression;
    }
    return expression;
  }

  public abstract CompileResult Compile();
}
