/*******************************************************************************
 * You may amend and distribute as you like, but don't remove this header!
 *
 * EPPlus provides server-side generation of Excel 2007/2010 spreadsheets.
 * See http://www.codeplex.com/EPPlus for details.
 *
 * 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       		        2013-03-01 (Prior file history on https://github.com/swmal/ExcelFormulaParser)
 *******************************************************************************/

using System;
using System.Globalization;
using System.Linq;
using OfficeOpenXml.Utils;

namespace OfficeOpenXml.FormulaParsing.ExpressionGraph;

public class CompileResult {
  private static readonly CompileResult _empty = new(null, DataType.Empty);

  public static CompileResult Empty => _empty;

  public CompileResult(object result, DataType dataType) {
    Result = result;
    DataType = dataType;
  }

  public CompileResult(eErrorType errorType) {
    Result = ExcelErrorValue.Create(errorType);
    DataType = DataType.ExcelError;
  }

  public CompileResult(ExcelErrorValue errorValue) {
    Require.Argument(errorValue).IsNotNull("errorValue");
    Result = errorValue;
    DataType = DataType.ExcelError;
  }

  public object Result { get; private set; }

  public object ResultValue {
    get {
      var r = Result as ExcelDataProvider.IRangeInfo;
      if (r == null) {
        return Result;
      }
      return r.GetValue(r.Address._fromRow, r.Address._fromCol);
    }
  }

  public double ResultNumeric {
    get {
      if (IsNumeric) {
        return Result == null ? 0 : Convert.ToDouble(Result);
      }
      if (Result is DateTime time) {
        return time.ToOADate();
      }
      if (Result is TimeSpan span) {
        return new DateTime(span.Ticks).ToOADate();
      }
      if (IsNumericString) {
        try {
          return double.Parse(Result.ToString(), NumberStyles.Float, CultureInfo.InvariantCulture);
        } catch (Exception) {
          return 0;
        }
      }
      if (Result is ExcelDataProvider.IRangeInfo info) {
        var c = info.FirstOrDefault();
        if (c == null) {
          return 0;
        }
        return c.ValueDoubleLogical;
      }
      return 0;
    }
  }

  public DataType DataType { get; private set; }

  public bool IsNumeric =>
    DataType == DataType.Decimal
        || DataType == DataType.Integer
        || DataType == DataType.Empty
        || DataType == DataType.Boolean
        || DataType == DataType.Date;

  public bool IsNumericString {
    get { return DataType == DataType.String && ConvertUtil.IsNumericString(Result); }
  }

  public bool IsResultOfSubtotal { get; set; }

  public bool IsHiddenCell { get; set; }
}
