/*******************************************************************************
 * 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
 *******************************************************************************/

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

namespace OfficeOpenXml.Style;

/// <summary>
/// Linestyle
/// </summary>
public enum eUnderLineType {
  Dash,
  DashHeavy,
  DashLong,
  DashLongHeavy,
  Double,
  DotDash,
  DotDashHeavy,
  DotDotDash,
  DotDotDashHeavy,
  Dotted,
  DottedHeavy,
  Heavy,
  None,
  Single,
  Wavy,
  WavyDbl,
  WavyHeavy,
  Words,
}

/// <summary>
/// Type of font strike
/// </summary>
public enum eStrikeType {
  Double,
  No,
  Single,
}

/// <summary>
/// Used by Rich-text and Paragraphs.
/// </summary>
public class ExcelTextFont : XmlHelper {
  private string _path;
  private XmlNode _rootNode;

  internal ExcelTextFont(
      XmlNamespaceManager namespaceManager,
      XmlNode rootNode,
      string path,
      string[] schemaNodeOrder)
      : base(namespaceManager, rootNode) {
    SchemaNodeOrder = schemaNodeOrder;
    _rootNode = rootNode;
    if (path != "") {
      XmlNode node = rootNode.SelectSingleNode(path, namespaceManager);
      if (node != null) {
        TopNode = node;
      }
    }
    _path = path;
  }

  private string _fontLatinPath = "a:latin/@typeface";

  public string LatinFont {
    get => GetXmlNodeString(_fontLatinPath);
    set {
      CreateTopNode();
      SetXmlNodeString(_fontLatinPath, value);
    }
  }

  protected internal void CreateTopNode() {
    if (_path != "" && TopNode == _rootNode) {
      CreateNode(_path);
      TopNode = _rootNode.SelectSingleNode(_path, NameSpaceManager);
    }
  }

  private string _fontCsPath = "a:cs/@typeface";

  public string ComplexFont {
    get => GetXmlNodeString(_fontCsPath);
    set {
      CreateTopNode();
      SetXmlNodeString(_fontCsPath, value);
    }
  }

  private string _boldPath = "@b";

  public bool Bold {
    get => GetXmlNodeBool(_boldPath);
    set {
      CreateTopNode();
      SetXmlNodeString(_boldPath, value ? "1" : "0");
    }
  }

  private string _underLinePath = "@u";

  public eUnderLineType UnderLine {
    get => TranslateUnderline(GetXmlNodeString(_underLinePath));
    set {
      CreateTopNode();
      SetXmlNodeString(_underLinePath, TranslateUnderlineText(value));
    }
  }

  private string _underLineColorPath = "a:uFill/a:solidFill/a:srgbClr/@val";

  public Color UnderLineColor {
    get {
      string col = GetXmlNodeString(_underLineColorPath);
      if (col == "") {
        return Color.Empty;
      }
      return Color.FromArgb(int.Parse(col, NumberStyles.AllowHexSpecifier));
    }
    set {
      CreateTopNode();
      SetXmlNodeString(_underLineColorPath, value.ToArgb().ToString("X").Substring(2, 6));
    }
  }

  private string _italicPath = "@i";

  public bool Italic {
    get => GetXmlNodeBool(_italicPath);
    set {
      CreateTopNode();
      SetXmlNodeString(_italicPath, value ? "1" : "0");
    }
  }

  private string _strikePath = "@strike";

  public eStrikeType Strike {
    get => TranslateStrike(GetXmlNodeString(_strikePath));
    set {
      CreateTopNode();
      SetXmlNodeString(_strikePath, TranslateStrikeText(value));
    }
  }

  private string _sizePath = "@sz";

  public float Size {
    get => GetXmlNodeInt(_sizePath) / 100;
    set {
      CreateTopNode();
      SetXmlNodeString(_sizePath, ((int)(value * 100)).ToString());
    }
  }

  private string _colorPath = "a:solidFill/a:srgbClr/@val";

  public Color Color {
    get {
      string col = GetXmlNodeString(_colorPath);
      if (col == "") {
        return Color.Empty;
      }
      return Color.FromArgb(int.Parse(col, NumberStyles.AllowHexSpecifier));
    }
    set {
      CreateTopNode();
      SetXmlNodeString(_colorPath, value.ToArgb().ToString("X").Substring(2, 6));
    }
  }

  private eUnderLineType TranslateUnderline(string text) {
    switch (text) {
      case "sng":
        return eUnderLineType.Single;
      case "dbl":
        return eUnderLineType.Double;
      case "":
        return eUnderLineType.None;
      default:
        return (eUnderLineType)Enum.Parse(typeof(eUnderLineType), text);
    }
  }

  private string TranslateUnderlineText(eUnderLineType value) {
    switch (value) {
      case eUnderLineType.Single:
        return "sng";
      case eUnderLineType.Double:
        return "dbl";
      default:
        string ret = value.ToString();
        return ret.Substring(0, 1).ToLower(CultureInfo.InvariantCulture)
            + ret.Substring(1, ret.Length - 1);
    }
  }

  private eStrikeType TranslateStrike(string text) {
    switch (text) {
      case "dblStrike":
        return eStrikeType.Double;
      case "sngStrike":
        return eStrikeType.Single;
      default:
        return eStrikeType.No;
    }
  }

  private string TranslateStrikeText(eStrikeType value) {
    switch (value) {
      case eStrikeType.Single:
        return "sngStrike";
      case eStrikeType.Double:
        return "dblStrike";
      default:
        return "noStrike";
    }
  }

  /// <summary>
  /// Set the font style from a font object
  /// </summary>
  /// <param name="font"></param>
  public void SetFromFont(Font font) {
    LatinFont = font.Name;
    ComplexFont = font.Name;
    Size = font.Size;
    if (font.Bold) {
      Bold = font.Bold;
    }
    if (font.Italic) {
      Italic = font.Italic;
    }
    if (font.Underline) {
      UnderLine = eUnderLineType.Single;
    }
    if (font.Strikeout) {
      Strike = eStrikeType.Single;
    }
  }
}
