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

namespace OfficeOpenXml.FormulaParsing.Excel.Functions.Information;

public class IsErr : ErrorHandlingFunction {
  public override CompileResult Execute(
      IEnumerable<FunctionArgument> arguments,
      ParsingContext context) {
    var isError = new IsError();
    var result = isError.Execute(arguments, context);
    if ((bool)result.Result) {
      var arg = GetFirstValue(arguments);
      if (arg is ExcelDataProvider.IRangeInfo) {
        var r = (ExcelDataProvider.IRangeInfo)arg;
        var e = r.GetValue(r.Address._fromRow, r.Address._fromCol) as ExcelErrorValue;
        if (e != null && e.Type == eErrorType.Na) {
          return CreateResult(false, DataType.Boolean);
        }
      } else {
        if (arg is ExcelErrorValue && ((ExcelErrorValue)arg).Type == eErrorType.Na) {
          return CreateResult(false, DataType.Boolean);
        }
      }
    }
    return result;
  }

  public override CompileResult HandleError(string errorCode) {
    return CreateResult(true, DataType.Boolean);
  }
}
