/*******************************************************************************
 * 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
 * ******************************************************************************
 * Jan Källman		                Initial Release		        2009-10-01
 * Jan Källman		License changed GPL-->LGPL 2011-12-16
 * Richard Tallent					Fix inadvertent removal of XML node					2012-10-31
 * Richard Tallent					Remove VertAlign node if no alignment specified		2012-10-31
 *******************************************************************************/

using System;
using System.Drawing;
using System.Globalization;
using System.Xml;

namespace OfficeOpenXml.Style;

/// <summary>
/// A richtext part
/// </summary>
public class ExcelRichText : XmlHelper {
  internal ExcelRichText(
      XmlNamespaceManager ns,
      XmlNode topNode,
      ExcelRichTextCollection collection)
      : base(ns, topNode) {
    SchemaNodeOrder = new[] {
      "rPr",
      "t",
      "b",
      "i",
      "strike",
      "u",
      "vertAlign",
      "sz",
      "color",
      "rFont",
      "family",
      "scheme",
      "charset",
    };
    _collection = collection;
  }

  internal delegate void CallbackDelegate();

  private CallbackDelegate _callback;

  internal void SetCallback(CallbackDelegate callback) {
    _callback = callback;
  }

  private const string _textPath = "d:t";

  /// <summary>
  /// The text
  /// </summary>
  public string Text {
    get {
      // Bug 15151
      if (TopNode.Name == "t") {
        return TopNode.InnerText;
      }
      return GetXmlNodeString(_textPath);
    }
    set {
      _collection.ConvertRichtext();
      // Don't remove if blank -- setting a blank rich text value on a node is common,
      // for example when applying both bold and italic to text.
      SetXmlNodeString(_textPath, value, false);
      if (PreserveSpace) {
        XmlElement elem = TopNode.SelectSingleNode(_textPath, NameSpaceManager) as XmlElement;
        elem.SetAttribute("xml:space", "preserve");
      }
      if (_callback != null) {
        _callback();
      }
    }
  }

  /// <summary>
  /// Preserves whitespace. Default true
  /// </summary>
  public bool PreserveSpace {
    get {
      XmlElement elem = TopNode.SelectSingleNode(_textPath, NameSpaceManager) as XmlElement;
      if (elem != null) {
        return elem.GetAttribute("xml:space") == "preserve";
      }
      return false;
    }
    set {
      _collection.ConvertRichtext();
      XmlElement elem = TopNode.SelectSingleNode(_textPath, NameSpaceManager) as XmlElement;
      if (elem != null) {
        if (value) {
          elem.SetAttribute("xml:space", "preserve");
        } else {
          elem.RemoveAttribute("xml:space");
        }
      }
      if (_callback != null) {
        _callback();
      }
    }
  }

  private const string _boldPath = "d:rPr/d:b";

  /// <summary>
  /// Bold text
  /// </summary>
  public bool Bold {
    get => ExistNode(_boldPath);
    set {
      _collection.ConvertRichtext();
      if (value) {
        CreateNode(_boldPath);
      } else {
        DeleteNode(_boldPath);
      }
      if (_callback != null) {
        _callback();
      }
    }
  }

  private const string _italicPath = "d:rPr/d:i";

  /// <summary>
  /// Italic text
  /// </summary>
  public bool Italic {
    get =>
      //return GetXmlNodeBool(ITALIC_PATH, false);
      ExistNode(_italicPath);
    set {
      _collection.ConvertRichtext();
      if (value) {
        CreateNode(_italicPath);
      } else {
        DeleteNode(_italicPath);
      }
      if (_callback != null) {
        _callback();
      }
    }
  }

  private const string _strikePath = "d:rPr/d:strike";

  /// <summary>
  /// Strike-out text
  /// </summary>
  public bool Strike {
    get => ExistNode(_strikePath);
    set {
      _collection.ConvertRichtext();
      if (value) {
        CreateNode(_strikePath);
      } else {
        DeleteNode(_strikePath);
      }
      if (_callback != null) {
        _callback();
      }
    }
  }

  private const string _underlinePath = "d:rPr/d:u";

  /// <summary>
  /// Underlined text
  /// </summary>
  public bool UnderLine {
    get => ExistNode(_underlinePath);
    set {
      _collection.ConvertRichtext();
      if (value) {
        CreateNode(_underlinePath);
      } else {
        DeleteNode(_underlinePath);
      }
      if (_callback != null) {
        _callback();
      }
    }
  }

  private const string _vertAlignPath = "d:rPr/d:vertAlign/@val";

  /// <summary>
  /// Vertical Alignment
  /// </summary>
  public ExcelVerticalAlignmentFont VerticalAlign {
    get {
      string v = GetXmlNodeString(_vertAlignPath);
      if (v == "") {
        return ExcelVerticalAlignmentFont.None;
      }
      try {
        return (ExcelVerticalAlignmentFont)Enum.Parse(typeof(ExcelVerticalAlignmentFont), v, true);
      } catch {
        return ExcelVerticalAlignmentFont.None;
      }
    }
    set {
      _collection.ConvertRichtext();
      if (value == ExcelVerticalAlignmentFont.None) {
        // If Excel 2010 encounters a vertical align value of blank, it will not load
        // the spreadsheet. So if None is specified, delete the node, it will be
        // recreated if a new value is applied later.
        DeleteNode(_vertAlignPath);
      } else {
        SetXmlNodeString(_vertAlignPath, value.ToString().ToLowerInvariant());
      }
      if (_callback != null) {
        _callback();
      }
    }
  }

  private const string _sizePath = "d:rPr/d:sz/@val";

  /// <summary>
  /// Font size
  /// </summary>
  public float Size {
    get => Convert.ToSingle(GetXmlNodeDecimal(_sizePath));
    set {
      _collection.ConvertRichtext();
      SetXmlNodeString(_sizePath, value.ToString(CultureInfo.InvariantCulture));
      if (_callback != null) {
        _callback();
      }
    }
  }

  private const string _fontPath = "d:rPr/d:rFont/@val";

  /// <summary>
  /// Name of the font
  /// </summary>
  public string FontName {
    get => GetXmlNodeString(_fontPath);
    set {
      _collection.ConvertRichtext();
      SetXmlNodeString(_fontPath, value);
      if (_callback != null) {
        _callback();
      }
    }
  }

  private const string _colorPath = "d:rPr/d:color/@rgb";

  /// <summary>
  /// Text color
  /// </summary>
  public Color Color {
    get {
      string col = GetXmlNodeString(_colorPath);
      if (col == "") {
        return Color.Empty;
      }
      return Color.FromArgb(int.Parse(col, NumberStyles.AllowHexSpecifier));
    }
    set {
      _collection.ConvertRichtext();
      SetXmlNodeString(
          _colorPath,
          value
              .ToArgb()
              .ToString(
                  "X") /*.Substring(2, 6)*/);
      if (_callback != null) {
        _callback();
      }
    }
  }

  public ExcelRichTextCollection _collection { get; set; }
}
