/*******************************************************************************
 * 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;

namespace AppsheetEpplus;

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) {
    ArgumentNullException.ThrowIfNull(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 => DataType == DataType.String && ConvertUtil.IsNumericString(Result);

  public bool IsResultOfSubtotal { get; set; }

  public bool IsHiddenCell { get; set; }
}
