/*******************************************************************************
 * 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.Collections.Immutable;
using System.Globalization;
using System.Xml;

namespace AppsheetEpplus;

/// <summary>
/// A richtext part
/// </summary>
public class ExcelRichText : XmlHelper {
  protected override ImmutableArray<string> SchemaNodeOrder { get; } = [
    "rPr",
    "t",
    "b",
    "i",
    "strike",
    "u",
    "vertAlign",
    "sz",
    "color",
    "rFont",
    "family",
    "scheme",
    "charset",
  ];

  internal ExcelRichText(
      XmlNamespaceManager ns,
      XmlNode topNode,
      ExcelRichTextCollection collection)
      : base(ns, topNode) {
    _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";

  /// <summary>
  /// Text color
  /// </summary>
  public string Color {
    get => GetXmlNodeString(_colorPath);
    set {
      _collection.ConvertRichtext();
      SetXmlNodeString(_colorPath, value);
      if (_callback != null) {
        _callback();
      }
    }
  }

  public ExcelRichTextCollection _collection { get; set; }
}
