/*******************************************************************************
 * 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.Drawing;
using System.Globalization;
using System.Text.RegularExpressions;
using System.Xml;
using OfficeOpenXml.Utils;

namespace OfficeOpenXml.ConditionalFormatting;

/// <summary>
/// Conditional formatting helper
/// </summary>
internal static class ExcelConditionalFormattingHelper {
  /// <summary>
  /// Check and fix an address (string address)
  /// </summary>
  /// <param name="address"></param>
  /// <returns></returns>
  public static string CheckAndFixRangeAddress(string address) {
    if (address.Contains(',')) {
      throw new FormatException(
          ExcelConditionalFormattingConstants.Errors._commaSeparatedAddresses);
    }

    address = address.ToUpper(CultureInfo.InvariantCulture);

    if (Regex.IsMatch(address, "[A-Z]+:[A-Z]+")) {
      address = AddressUtility.ParseEntireColumnSelections(address);
    }

    return address;
  }

  /// <summary>
  /// Convert a color code to Color Object
  /// </summary>
  /// <param name="colorCode">Color Code (Ex. "#FFB43C53" or "FFB43C53")</param>
  /// <returns></returns>
  public static Color ConvertFromColorCode(string colorCode) {
    try {
      return Color.FromArgb(Int32.Parse(colorCode.Replace("#", ""), NumberStyles.HexNumber));
    } catch {
      // Assume white is the default color (instead of giving an error)
      return Color.White;
    }
  }

  /// <summary>
  ///
  /// </summary>
  /// <param name="node"></param>
  /// <param name="attribute"></param>
  /// <returns></returns>
  public static string GetAttributeString(XmlNode node, string attribute) {
    try {
      var value = node.Attributes[attribute].Value;
      return (value == null) ? string.Empty : value;
    } catch {
      return string.Empty;
    }
  }

  /// <summary>
  ///
  /// </summary>
  /// <param name="node"></param>
  /// <param name="attribute"></param>
  /// <returns></returns>
  public static int GetAttributeInt(XmlNode node, string attribute) {
    try {
      var value = node.Attributes[attribute].Value;
      return int.Parse(value, NumberStyles.Integer, CultureInfo.InvariantCulture);
    } catch {
      return int.MinValue;
    }
  }

  /// <summary>
  ///
  /// </summary>
  /// <param name="node"></param>
  /// <param name="attribute"></param>
  /// <returns></returns>
  public static int? GetAttributeIntNullable(XmlNode node, string attribute) {
    try {
      if (node.Attributes[attribute] == null) {
        return null;
      }
      var value = node.Attributes[attribute].Value;
      return int.Parse(value, NumberStyles.Integer, CultureInfo.InvariantCulture);
    } catch {
      return null;
    }
  }

  /// <summary>
  ///
  /// </summary>
  /// <param name="node"></param>
  /// <param name="attribute"></param>
  /// <returns></returns>
  public static bool GetAttributeBool(XmlNode node, string attribute) {
    try {
      var value = node.Attributes[attribute].Value;
      return (value == "1"
              || value == "-1"
              || value.Equals("TRUE", StringComparison.InvariantCultureIgnoreCase));
    } catch {
      return false;
    }
  }

  /// <summary>
  ///
  /// </summary>
  /// <param name="node"></param>
  /// <param name="attribute"></param>
  /// <returns></returns>
  public static bool? GetAttributeBoolNullable(XmlNode node, string attribute) {
    try {
      if (node.Attributes[attribute] == null) {
        return null;
      }
      var value = node.Attributes[attribute].Value;
      return (value == "1"
              || value == "-1"
              || value.Equals("TRUE", StringComparison.InvariantCultureIgnoreCase));
    } catch {
      return null;
    }
  }

  /// <summary>
  ///
  /// </summary>
  /// <param name="node"></param>
  /// <param name="attribute"></param>
  /// <returns></returns>
  public static double GetAttributeDouble(XmlNode node, string attribute) {
    try {
      var value = node.Attributes[attribute].Value;
      return double.Parse(value, NumberStyles.Number, CultureInfo.InvariantCulture);
    } catch {
      return double.NaN;
    }
  }

  /// <summary>
  ///
  /// </summary>
  /// <param name="node"></param>
  /// <param name="attribute"></param>
  /// <returns></returns>
  public static decimal GetAttributeDecimal(XmlNode node, string attribute) {
    try {
      var value = node.Attributes[attribute].Value;
      return decimal.Parse(value, NumberStyles.Any, CultureInfo.InvariantCulture);
    } catch {
      return decimal.MinValue;
    }
  }

  /// <summary>
  /// Encode to XML (special characteres: &apos; &quot; &gt; &lt; &amp;)
  /// </summary>
  /// <param name="s"></param>
  /// <returns></returns>
  public static string EncodeXml(this string s) {
    return s.Replace("&", "&amp;")
        .Replace("<", "&lt;")
        .Replace(">", "&gt;")
        .Replace("\"", "&quot;")
        .Replace("'", "&apos;");
  }

  /// <summary>
  /// Decode from XML (special characteres: &apos; &quot; &gt; &lt; &amp;)
  /// </summary>
  /// <param name="s"></param>
  /// <returns></returns>
  public static string DecodeXml(this string s) {
    return s.Replace("'", "&apos;")
        .Replace("\"", "&quot;")
        .Replace(">", "&gt;")
        .Replace("<", "&lt;")
        .Replace("&", "&amp;");
  }
}
