/*******************************************************************************
 * 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.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 =>
    Enum.TryParse<ExcelVerticalAlignmentFont>(
        GetXmlNodeString(TopNode, _vertAlignPath),
        true,
        out var result)
        ? result
        : ExcelVerticalAlignmentFont.None;

  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";

  public ExcelRichTextCollection _collection { get; set; }
}
