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

namespace OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;

public class Index : ExcelFunction {
  public override CompileResult Execute(
      IEnumerable<FunctionArgument> arguments,
      ParsingContext context) {
    ValidateArguments(arguments, 2);
    var arg1 = arguments.ElementAt(0);
    var args = arg1.Value as IEnumerable<FunctionArgument>;
    var crf = new CompileResultFactory();
    if (args != null) {
      var index = ArgToInt(arguments, 1);
      if (index > args.Count()) {
        throw new ExcelErrorValueException(eErrorType.Ref);
      }
      var candidate = args.ElementAt(index - 1);
      //Commented JK-Can be any data type
      //if (!IsNumber(candidate.Value))
      //{
      //    throw new ExcelErrorValueException(eErrorType.Value);
      //}
      //return CreateResult(ConvertUtil.GetValueDouble(candidate.Value), DataType.Decimal);
      return crf.Create(candidate.Value);
    }
    if (arg1.IsExcelRange) {
      var row = ArgToInt(arguments, 1);
      var col = arguments.Count() > 2 ? ArgToInt(arguments, 2) : 1;
      var ri = arg1.ValueAsRangeInfo;
      if (row > ri.Address._toRow - ri.Address._fromRow + 1
          || col > ri.Address._toCol - ri.Address._fromCol + 1) {
        ThrowExcelErrorValueException(eErrorType.Ref);
      }
      var candidate = ri.GetOffset(row - 1, col - 1);
      //Commented JK-Can be any data type
      //if (!IsNumber(candidate.Value))
      //{
      //    throw new ExcelErrorValueException(eErrorType.Value);
      //}
      return crf.Create(candidate);
    }
    throw new NotImplementedException();
  }
}
