/*******************************************************************************
 * 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		        2010-06-01
 * Jan Källman		License changed GPL-->LGPL 2011-12-16
 *******************************************************************************/

using System.Collections.Immutable;
using System.Xml;

namespace OfficeOpenXml.Drawing.Vml;

/// <summary>
/// Horizontal Alingment
/// </summary>
public enum eTextAlignHorizontalVml {
  Left,
  Center,
  Right,
}

/// <summary>
/// Vertical Alingment
/// </summary>
public enum eTextAlignVerticalVml {
  Top,
  Center,
  Bottom,
}

/// <summary>
/// Linestyle
/// </summary>
public enum eLineStyleVml {
  Solid,
  Round,
  Square,
  Dash,
  DashDot,
  LongDash,
  LongDashDot,
  LongDashDotDot,
}

/// <summary>
/// Drawing object used for comments
/// </summary>
public class ExcelVmlDrawingBase : XmlHelper {
  protected override ImmutableArray<string> SchemaNodeOrder { get; } = [
    "fill",
    "stroke",
    "shadow",
    "path",
    "textbox",
    "ClientData",
    "MoveWithCells",
    "SizeWithCells",
    "Anchor",
    "Locked",
    "AutoFill",
    "LockText",
    "TextHAlign",
    "TextVAlign",
    "Row",
    "Column",
    "Visible",
  ];

  internal ExcelVmlDrawingBase(XmlNode topNode, XmlNamespaceManager ns)
      : base(ns, topNode) {}

  public string Id {
    get => GetXmlNodeString("@id");
    set => SetXmlNodeString("@id", value);
  }

  /// <summary>
  /// Alternative text to be displayed instead of a graphic.
  /// </summary>
  public string AlternativeText {
    get => GetXmlNodeString("@alt");
    set => SetXmlNodeString("@alt", value);
  }

  protected bool GetStyle(string style, string key, out string value) {
    string[] styles = style.Split(';');
    foreach (string s in styles) {
      if (s.IndexOf(':') > 0) {
        string[] split = s.Split(':');
        if (split[0] == key) {
          value = split[1];
          return true;
        }
      } else if (s == key) {
        value = "";
        return true;
      }
    }
    value = "";
    return false;
  }

  protected string SetStyle(string style, string key, string value) {
    string[] styles = style.Split(';');
    string newStyle = "";
    bool changed = false;
    foreach (string s in styles) {
      string[] split = s.Split(':');
      if (split[0].Trim() == key) {
        if (value.Trim()
            != "") //If blank remove the item
        {
          newStyle += key + ':' + value;
        }
        changed = true;
      } else {
        newStyle += s;
      }
      newStyle += ';';
    }
    if (!changed) {
      newStyle += key + ':' + value;
    } else {
      newStyle = style.Substring(0, style.Length - 1);
    }
    return newStyle;
  }
}
