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

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

  internal ExcelVmlDrawingComment(XmlNode topNode, ExcelRangeBase range, XmlNamespaceManager ns)
      : base(topNode, ns) {
    Range = range;
  }

  internal ExcelRangeBase Range { get; set; }

  /// <summary>
  /// Address in the worksheet
  /// </summary>
  public string Address => Range.Address;

  private const string _verticalAlignmentPath = "x:ClientData/x:TextVAlign";

  /// <summary>
  /// Vertical alignment for text
  /// </summary>
  public eTextAlignVerticalVml VerticalAlignment {
    get {
      switch (GetXmlNodeString(_verticalAlignmentPath)) {
        case "Center":
          return eTextAlignVerticalVml.Center;
        case "Bottom":
          return eTextAlignVerticalVml.Bottom;
        default:
          return eTextAlignVerticalVml.Top;
      }
    }
    set {
      switch (value) {
        case eTextAlignVerticalVml.Center:
          SetXmlNodeString(_verticalAlignmentPath, "Center");
          break;
        case eTextAlignVerticalVml.Bottom:
          SetXmlNodeString(_verticalAlignmentPath, "Bottom");
          break;
        default:
          DeleteNode(_verticalAlignmentPath);
          break;
      }
    }
  }

  private const string _horizontalAlignmentPath = "x:ClientData/x:TextHAlign";

  /// <summary>
  /// Horizontal alignment for text
  /// </summary>
  public eTextAlignHorizontalVml HorizontalAlignment {
    get {
      switch (GetXmlNodeString(_horizontalAlignmentPath)) {
        case "Center":
          return eTextAlignHorizontalVml.Center;
        case "Right":
          return eTextAlignHorizontalVml.Right;
        default:
          return eTextAlignHorizontalVml.Left;
      }
    }
    set {
      switch (value) {
        case eTextAlignHorizontalVml.Center:
          SetXmlNodeString(_horizontalAlignmentPath, "Center");
          break;
        case eTextAlignHorizontalVml.Right:
          SetXmlNodeString(_horizontalAlignmentPath, "Right");
          break;
        default:
          DeleteNode(_horizontalAlignmentPath);
          break;
      }
    }
  }

  private const string _visiblePath = "x:ClientData/x:Visible";

  /// <summary>
  /// If the drawing object is visible.
  /// </summary>
  public bool Visible {
    get => (TopNode.SelectSingleNode(_visiblePath, NameSpaceManager) != null);
    set {
      if (value) {
        CreateNode(_visiblePath);
        Style = SetStyle(Style, "visibility", "visible");
      } else {
        DeleteNode(_visiblePath);
        Style = SetStyle(Style, "visibility", "hidden");
      }
    }
  }

  private const string _textboxStylePath = "v:textbox/@style";

  /// <summary>
  /// Autofits the drawingobject
  /// </summary>
  public bool AutoFit {
    get {
      GetStyle(GetXmlNodeString(_textboxStylePath), "mso-fit-shape-to-text", out var value);
      return value == "t";
    }
    set =>
      SetXmlNodeString(
          _textboxStylePath,
          SetStyle(GetXmlNodeString(_textboxStylePath), "mso-fit-shape-to-text", value ? "t" : ""));
  }

  private const string _lockedPath = "x:ClientData/x:Locked";

  /// <summary>
  /// If the object is locked when the sheet is protected
  /// </summary>
  public bool Locked {
    get => GetXmlNodeBool(_lockedPath, false);
    set => SetXmlNodeBool(_lockedPath, value, false);
  }

  private const string _lockTextPath = "x:ClientData/x:LockText";

  /// <summary>
  /// Specifies that the object's text is locked
  /// </summary>
  public bool LockText {
    get => GetXmlNodeBool(_lockTextPath, false);
    set => SetXmlNodeBool(_lockTextPath, value, false);
  }

  private ExcelVmlDrawingPosition _from;

  /// <summary>
  /// From position. For comments only when Visible=true.
  /// </summary>
  public ExcelVmlDrawingPosition From {
    get {
      if (_from == null) {
        _from = new(
            NameSpaceManager,
            TopNode.SelectSingleNode("x:ClientData", NameSpaceManager),
            0);
      }
      return _from;
    }
  }

  private ExcelVmlDrawingPosition _to;

  /// <summary>
  /// To position. For comments only when Visible=true.
  /// </summary>
  public ExcelVmlDrawingPosition To {
    get {
      if (_to == null) {
        _to = new(NameSpaceManager, TopNode.SelectSingleNode("x:ClientData", NameSpaceManager), 4);
      }
      return _to;
    }
  }

  private const string _stylePath = "@style";

  internal string Style {
    get => GetXmlNodeString(_stylePath);
    set => SetXmlNodeString(_stylePath, value);
  }

  ulong IRangeId.RangeID {
    get => ExcelCellBase.GetCellId(Range.Worksheet.SheetID, Range.Start.Row, Range.Start.Column);
    set {}
  }
}
