/*******************************************************************************
 * 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
 * ******************************************************************************
 * Eyal Seagull        Added       		  2012-04-03
 *******************************************************************************/

using System;
using System.Collections.Immutable;
using System.Drawing;
using System.Globalization;
using System.Xml;

namespace AppsheetEpplus;

/// <summary>
/// 18.3.1.11 cfvo (Conditional Format Value Object)
/// Describes the values of the interpolation points in a gradient scale.
/// </summary>
public class ExcelConditionalFormattingIconDataBarValue : XmlHelper {
  private eExcelConditionalFormattingRuleType _ruleType;
  private readonly ExcelWorksheet _worksheet;

  /// <summary>
  /// Initialize the cfvo (§18.3.1.11) node
  /// </summary>
  /// <param name="type"></param>
  /// <param name="value"></param>
  /// <param name="formula"></param>
  /// <param name="ruleType"></param>
  /// <param name="address"></param>
  /// <param name="priority"></param>
  /// <param name="worksheet"></param>
  /// <param name="itemElementNode">The cfvo (§18.3.1.11) node parent. Can be any of the following:
  /// colorScale (§18.3.1.16); dataBar (§18.3.1.28); iconSet (§18.3.1.49)</param>
  /// <param name="namespaceManager"></param>
  internal ExcelConditionalFormattingIconDataBarValue(
      eExcelConditionalFormattingValueObjectType type,
      double value,
      string formula,
      eExcelConditionalFormattingRuleType ruleType,
      ExcelAddress address,
      int priority,
      ExcelWorksheet worksheet,
      XmlNode itemElementNode,
      XmlNamespaceManager namespaceManager)
      : this(ruleType, address, worksheet, itemElementNode, namespaceManager) {
    ArgumentOutOfRangeException.ThrowIfLessThan(priority, 1);

    // Check if the parent does not exists
    if (itemElementNode == null) {
      // Get the parent node path by the rule type
      string parentNodePath = ExcelConditionalFormattingValueObjectType.GetParentPathByRuleType(
          ruleType);

      // Check for en error (rule type does not have <cfvo>)
      if (parentNodePath == string.Empty) {
        throw new(ExcelConditionalFormattingConstants.Errors._missingCfvoParentNode);
      }

      // Point to the <cfvo> parent node
      itemElementNode = _worksheet.WorksheetXml.SelectSingleNode(
          string.Format(
              "//{0}[{1}='{2}']/{3}[{4}='{5}']/{6}",
              // {0}
              ExcelConditionalFormattingConstants.Paths._conditionalFormatting,
              // {1}
              ExcelConditionalFormattingConstants.Paths._sqrefAttribute,
              // {2}
              address.Address,
              // {3}
              ExcelConditionalFormattingConstants.Paths._cfRule,
              // {4}
              ExcelConditionalFormattingConstants.Paths._priorityAttribute,
              // {5}
              priority,
              // {6}
              parentNodePath),
          _worksheet.NameSpaceManager);

      // Check for en error (rule type does not have <cfvo>)
      if (itemElementNode == null) {
        throw new(ExcelConditionalFormattingConstants.Errors._missingCfvoParentNode);
      }
    }

    TopNode = itemElementNode;

    // Save the attributes
    RuleType = ruleType;
    Type = type;
    Value = value;
    Formula = formula;
  }

  protected override ImmutableArray<string> SchemaNodeOrder { get; } = [
    ExcelConditionalFormattingConstants.Nodes._cfvo,
  ];

  /// <summary>
  /// Initialize the cfvo (§18.3.1.11) node
  /// </summary>
  /// <param name="ruleType"></param>
  /// <param name="address"></param>
  /// <param name="worksheet"></param>
  /// <param name="itemElementNode">The cfvo (§18.3.1.11) node parent. Can be any of the following:
  /// colorScale (§18.3.1.16); dataBar (§18.3.1.28); iconSet (§18.3.1.49)</param>
  /// <param name="namespaceManager"></param>
  internal ExcelConditionalFormattingIconDataBarValue(
      eExcelConditionalFormattingRuleType ruleType,
      ExcelAddress address,
      ExcelWorksheet worksheet,
      XmlNode itemElementNode,
      XmlNamespaceManager namespaceManager)
      : base(namespaceManager, itemElementNode) {
    ArgumentNullException.ThrowIfNull(address);
    ArgumentNullException.ThrowIfNull(worksheet);

    // Save the worksheet for private methods to use
    _worksheet = worksheet;

    //Check if the parent does not exists
    if (itemElementNode == null) {
      // Get the parent node path by the rule type
      string parentNodePath = ExcelConditionalFormattingValueObjectType.GetParentPathByRuleType(
          ruleType);

      // Check for en error (rule type does not have <cfvo>)
      if (parentNodePath == string.Empty) {
        throw new(ExcelConditionalFormattingConstants.Errors._missingCfvoParentNode);
      }
    }
    RuleType = ruleType;
  }

  /// <summary>
  /// Initialize the <see cref="ExcelConditionalFormattingColorScaleValue"/>
  /// </summary>
  /// <param name="type"></param>
  /// <param name="value"></param>
  /// <param name="formula"></param>
  /// <param name="ruleType"></param>
  /// <param name="priority"></param>
  /// <param name="address"></param>
  /// <param name="worksheet"></param>
  /// <param name="namespaceManager"></param>
  internal ExcelConditionalFormattingIconDataBarValue(
      eExcelConditionalFormattingValueObjectType type,
      double value,
      string formula,
      eExcelConditionalFormattingRuleType ruleType,
      ExcelAddress address,
      int priority,
      ExcelWorksheet worksheet,
      XmlNamespaceManager namespaceManager)
      : this(
          type,
          value,
          formula,
          ruleType,
          address,
          priority,
          worksheet,
          null,
          namespaceManager) {}

  /// <summary>
  /// Initialize the <see cref="ExcelConditionalFormattingColorScaleValue"/>
  /// </summary>
  /// <param name="type"></param>
  /// <param name="color"></param>
  /// <param name="ruleType"></param>
  /// <param name="priority"></param>
  /// <param name="address"></param>
  /// <param name="worksheet"></param>
  /// <param name="namespaceManager"></param>
  internal ExcelConditionalFormattingIconDataBarValue(
      eExcelConditionalFormattingValueObjectType type,
      Color color,
      eExcelConditionalFormattingRuleType ruleType,
      ExcelAddress address,
      int priority,
      ExcelWorksheet worksheet,
      XmlNamespaceManager namespaceManager)
      : this(type, 0, null, ruleType, address, priority, worksheet, null, namespaceManager) {}

  /// <summary>
  ///
  /// </summary>
  internal eExcelConditionalFormattingRuleType RuleType {
    get => _ruleType;
    set => _ruleType = value;
  }

  /// <summary>
  ///
  /// </summary>
  public eExcelConditionalFormattingValueObjectType Type {
    get {
      var typeAttribute = GetXmlNodeString(
          ExcelConditionalFormattingConstants.Paths._typeAttribute);

      return ExcelConditionalFormattingValueObjectType.GetTypeByAttrbiute(typeAttribute);
    }
    set {
      if ((_ruleType == eExcelConditionalFormattingRuleType.ThreeIconSet
                  || _ruleType == eExcelConditionalFormattingRuleType.FourIconSet
                  || _ruleType == eExcelConditionalFormattingRuleType.FiveIconSet)
          && (value == eExcelConditionalFormattingValueObjectType.Min
                  || value == eExcelConditionalFormattingValueObjectType.Max)) {
        throw (new ArgumentException("Value type can't be Min or Max for icon sets"));
      }
      SetXmlNodeString(
          ExcelConditionalFormattingConstants.Paths._typeAttribute,
          value.ToString().ToLower(CultureInfo.InvariantCulture));
    }
  }

  /// <summary>
  /// Get/Set the 'cfvo' node @val attribute
  /// </summary>
  public Double Value {
    get {
      if ((Type == eExcelConditionalFormattingValueObjectType.Num)
          || (Type == eExcelConditionalFormattingValueObjectType.Percent)
          || (Type == eExcelConditionalFormattingValueObjectType.Percentile)) {
        return GetXmlNodeDouble(ExcelConditionalFormattingConstants.Paths._valAttribute);
      }
      return 0;
    }
    set {
      string valueToStore = string.Empty;

      // Only some types use the @val attribute
      if ((Type == eExcelConditionalFormattingValueObjectType.Num)
          || (Type == eExcelConditionalFormattingValueObjectType.Percent)
          || (Type == eExcelConditionalFormattingValueObjectType.Percentile)) {
        valueToStore = value.ToString(CultureInfo.InvariantCulture);
      }

      SetXmlNodeString(ExcelConditionalFormattingConstants.Paths._valAttribute, valueToStore);
    }
  }

  /// <summary>
  /// Get/Set the Formula of the Object Value (uses the same attribute as the Value)
  /// </summary>
  public string Formula {
    get {
      // Return empty if the Object Value type is not Formula
      if (Type != eExcelConditionalFormattingValueObjectType.Formula) {
        return string.Empty;
      }

      // Excel stores the formula in the @val attribute
      return GetXmlNodeString(ExcelConditionalFormattingConstants.Paths._valAttribute);
    }
    set {
      // Only store the formula if the Object Value type is Formula
      if (Type == eExcelConditionalFormattingValueObjectType.Formula) {
        SetXmlNodeString(ExcelConditionalFormattingConstants.Paths._valAttribute, value);
      }
    }
  }
}
