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

namespace AppsheetEpplus;

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();
  }
}
