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

namespace AppsheetEpplus;

public class CountIf : ExcelFunction {
  private readonly NumericExpressionEvaluator _numericExpressionEvaluator;
  private readonly WildCardValueMatcher _wildCardValueMatcher;

  public CountIf()
      : this(new(), new()) {}

  public CountIf(NumericExpressionEvaluator evaluator, WildCardValueMatcher wildCardValueMatcher) {
    Require.That(evaluator).Named("evaluator").IsNotNull();
    Require.That(wildCardValueMatcher).Named("wildCardValueMatcher").IsNotNull();
    _numericExpressionEvaluator = evaluator;
    _wildCardValueMatcher = wildCardValueMatcher;
  }

  private bool Evaluate(object obj, string expression) {
    double? candidate = default(double?);
    if (IsNumeric(obj)) {
      candidate = ConvertUtil.GetValueDouble(obj);
    }
    if (candidate.HasValue) {
      return _numericExpressionEvaluator.Evaluate(candidate.Value, expression);
    }
    if (obj == null) {
      return false;
    }
    return _wildCardValueMatcher.IsMatch(expression, obj.ToString()) == 0;
  }

  public override CompileResult Execute(
      IEnumerable<FunctionArgument> arguments,
      ParsingContext context) {
    var functionArguments = arguments as FunctionArgument[] ?? arguments.ToArray();
    ValidateArguments(functionArguments, 2);
    var range = functionArguments.ElementAt(0);
    var criteria = ArgToString(functionArguments, 1);
    double result = 0d;
    if (range.IsExcelRange) {
      foreach (var cell in range.ValueAsRangeInfo) {
        if (Evaluate(cell.Value, criteria)) {
          result++;
        }
      }
    } else if (range.Value is IEnumerable<FunctionArgument> value) {
      foreach (var arg in value) {
        if (Evaluate(arg.Value, criteria)) {
          result++;
        }
      }
    } else {
      if (Evaluate(range.Value, criteria)) {
        result++;
      }
    }
    return CreateResult(result, DataType.Integer);
  }
}
