using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OfficeOpenXml.FormulaParsing.ExpressionGraph;

namespace OfficeOpenXml.FormulaParsing.Excel.Functions.Math {
  public class Rank : ExcelFunction {
    bool _isAvg;

    public Rank(bool isAvg = false) {
      _isAvg = isAvg;
    }

    public override CompileResult Execute(
        IEnumerable<FunctionArgument> arguments,
        ParsingContext context) {
      ValidateArguments(arguments, 2);
      var number = ArgToDecimal(arguments, 0);
      var refer = arguments.ElementAt(1);
      bool asc = false;
      if (arguments.Count() > 2) {
        asc = base.ArgToBool(arguments, 2);
      }
      var l = new List<double>();

      foreach (var c in refer.ValueAsRangeInfo) {
        var v = Utils.ConvertUtil.GetValueDouble(c.Value, false, true);
        if (!double.IsNaN(v)) {
          l.Add(v);
        }
      }
      l.Sort();
      double ix;
      if (asc) {
        ix = l.IndexOf(number) + 1;
        if (_isAvg) {
          int st = Convert.ToInt32(ix);
          while (l.Count > st && l[st] == number) {
            st++;
          }
          if (st > ix) {
            ix = ix + ((st - ix) / 2D);
          }
        }
      } else {
        ix = l.LastIndexOf(number);
        if (_isAvg) {
          int st = Convert.ToInt32(ix) - 1;
          while (0 <= st && l[st] == number) {
            st--;
          }
          if (st + 1 < ix) {
            ix = ix - ((ix - st - 1) / 2D);
          }
        }
        ix = l.Count - ix;
      }
      if (ix <= 0 || ix > l.Count) {
        return new CompileResult(ExcelErrorValue.Create(eErrorType.NA), DataType.ExcelError);
      } else {
        return CreateResult(ix, DataType.Decimal);
      }
    }
  }
}
