/*******************************************************************************
 * 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.Xml;

namespace OfficeOpenXml.Style.XmlAccess;

/// <summary>
/// Xml access class for border top level
/// </summary>
public sealed class ExcelBorderXml : StyleXmlHelper {
  internal ExcelBorderXml(XmlNamespaceManager nameSpaceManager)
      : base(nameSpaceManager) {}

  internal ExcelBorderXml(XmlNamespaceManager nsm, XmlNode topNode)
      : base(nsm, topNode) {
    _left = new(nsm, topNode.SelectSingleNode(_leftPath, nsm));
    _right = new(nsm, topNode.SelectSingleNode(_rightPath, nsm));
    _top = new(nsm, topNode.SelectSingleNode(_topPath, nsm));
    _bottom = new(nsm, topNode.SelectSingleNode(_bottomPath, nsm));
    _diagonal = new(nsm, topNode.SelectSingleNode(_diagonalPath, nsm));
    _diagonalUp = GetBoolValue(topNode, _diagonalUpPath);
    _diagonalDown = GetBoolValue(topNode, _diagonalDownPath);
  }

  internal override string Id =>
    Left.Id + Right.Id + Top.Id + Bottom.Id + Diagonal.Id + DiagonalUp + DiagonalDown;

  private const string _leftPath = "d:left";
  private ExcelBorderItemXml _left;

  /// <summary>
  /// Left border style properties
  /// </summary>
  public ExcelBorderItemXml Left {
    get => _left;
    internal set => _left = value;
  }

  private const string _rightPath = "d:right";
  private ExcelBorderItemXml _right;

  /// <summary>
  /// Right border style properties
  /// </summary>
  public ExcelBorderItemXml Right {
    get => _right;
    internal set => _right = value;
  }

  private const string _topPath = "d:top";
  private ExcelBorderItemXml _top;

  /// <summary>
  /// Top border style properties
  /// </summary>
  public ExcelBorderItemXml Top {
    get => _top;
    internal set => _top = value;
  }

  private const string _bottomPath = "d:bottom";
  private ExcelBorderItemXml _bottom;

  /// <summary>
  /// Bottom border style properties
  /// </summary>
  public ExcelBorderItemXml Bottom {
    get => _bottom;
    internal set => _bottom = value;
  }

  private const string _diagonalPath = "d:diagonal";
  private ExcelBorderItemXml _diagonal;

  /// <summary>
  /// Diagonal border style properties
  /// </summary>
  public ExcelBorderItemXml Diagonal {
    get => _diagonal;
    internal set => _diagonal = value;
  }

  private const string _diagonalUpPath = "@diagonalUp";
  private bool _diagonalUp;

  /// <summary>
  /// Diagonal up border
  /// </summary>
  public bool DiagonalUp {
    get => _diagonalUp;
    internal set => _diagonalUp = value;
  }

  private const string _diagonalDownPath = "@diagonalDown";
  private bool _diagonalDown;

  /// <summary>
  /// Diagonal down border
  /// </summary>
  public bool DiagonalDown {
    get => _diagonalDown;
    internal set => _diagonalDown = value;
  }

  internal ExcelBorderXml Copy() {
    ExcelBorderXml newBorder = new ExcelBorderXml(NameSpaceManager);
    newBorder.Bottom = _bottom.Copy();
    newBorder.Diagonal = _diagonal.Copy();
    newBorder.Left = _left.Copy();
    newBorder.Right = _right.Copy();
    newBorder.Top = _top.Copy();
    newBorder.DiagonalUp = _diagonalUp;
    newBorder.DiagonalDown = _diagonalDown;

    return newBorder;
  }

  internal override XmlNode CreateXmlNode(XmlNode topNode) {
    TopNode = topNode;
    CreateNode(_leftPath);
    topNode.AppendChild(_left.CreateXmlNode(TopNode.SelectSingleNode(_leftPath, NameSpaceManager)));
    CreateNode(_rightPath);
    topNode.AppendChild(
        _right.CreateXmlNode(TopNode.SelectSingleNode(_rightPath, NameSpaceManager)));
    CreateNode(_topPath);
    topNode.AppendChild(_top.CreateXmlNode(TopNode.SelectSingleNode(_topPath, NameSpaceManager)));
    CreateNode(_bottomPath);
    topNode.AppendChild(
        _bottom.CreateXmlNode(TopNode.SelectSingleNode(_bottomPath, NameSpaceManager)));
    CreateNode(_diagonalPath);
    topNode.AppendChild(
        _diagonal.CreateXmlNode(TopNode.SelectSingleNode(_diagonalPath, NameSpaceManager)));
    if (_diagonalUp) {
      SetXmlNodeString(_diagonalUpPath, "1");
    }
    if (_diagonalDown) {
      SetXmlNodeString(_diagonalDownPath, "1");
    }
    return topNode;
  }
}
