﻿/* 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		                2015-01-11
 *******************************************************************************/

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

namespace OfficeOpenXml.FormulaParsing.Excel.Functions.Math;

public class CountIfs : MultipleRangeCriteriasFunction {
  public override CompileResult Execute(
      IEnumerable<FunctionArgument> arguments,
      ParsingContext context) {
    var functionArguments = arguments as FunctionArgument[] ?? arguments.ToArray();
    ValidateArguments(functionArguments, 2);
    var argRanges = new List<ExcelDataProvider.IRangeInfo>();
    var criterias = new List<object>();
    for (var ix = 0; ix < 30; ix += 2) {
      if (functionArguments.Length <= ix) {
        break;
      }
      var rangeInfo = functionArguments[ix].ValueAsRangeInfo;
      argRanges.Add(rangeInfo);
      if (ix > 0) {
        ThrowExcelErrorValueExceptionIf(
            () => rangeInfo.GetNCells() != argRanges[0].GetNCells(),
            eErrorType.Value);
      }
      criterias.Add(functionArguments[ix + 1].Value);
    }
    IEnumerable<int> matchIndexes = GetMatchIndexes(argRanges[0], criterias[0]);
    var enumerable = matchIndexes as IList<int> ?? matchIndexes.ToList();
    for (var ix = 1; ix < argRanges.Count && enumerable.Any(); ix++) {
      var indexes = GetMatchIndexes(argRanges[ix], criterias[ix]);
      matchIndexes = enumerable.Intersect(indexes);
    }

    return CreateResult((double)matchIndexes.Count(), DataType.Integer);
  }
}
