/*******************************************************************************
 * 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		Added this class		        2010-01-24
 * Jan Källman		License changed GPL-->LGPL 2011-12-27
 *******************************************************************************/

using System;

namespace AppsheetEpplus;

/// <summary>
/// HyperlinkClass
/// </summary>
public class ExcelHyperLink : Uri {
  /// <summary>
  /// A new hyperlink with the specified URI
  /// </summary>
  /// <param name="uriString">The URI</param>
  public ExcelHyperLink(string uriString)
      : base(uriString) {
    OriginalUri = this;
  }

  /// <summary>
  /// A new hyperlink with the specified URI. This syntax is obsolete
  /// </summary>
  /// <param name="uriString">The URI</param>
  /// <param name="dontEscape"></param>
  [Obsolete(
      "base constructor 'System.Uri.Uri(string, bool)' is obsolete: 'The constructor has been deprecated. Please use new ExcelHyperLink(string). The dontEscape parameter is deprecated and is always false.")]
  public ExcelHyperLink(string uriString, bool dontEscape)
      : base(uriString, dontEscape) {
    OriginalUri = this;
  }

  /// <summary>
  /// A new hyperlink with the specified URI and kind
  /// </summary>
  /// <param name="uriString">The URI</param>
  /// <param name="uriKind">Kind (absolute/relative or indeterminate)</param>
  public ExcelHyperLink(string uriString, UriKind uriKind)
      : base(uriString, uriKind) {
    OriginalUri = this;
  }

  /// <summary>
  /// Sheet internal reference
  /// </summary>
  /// <param name="referenceAddress">Address</param>
  /// <param name="display">Displayed text</param>
  public ExcelHyperLink(string referenceAddress, string display)
      : base(
          "xl://internal") //URI is not used on internal links so put a dummy uri here.
  {
    _referenceAddress = referenceAddress;
    _display = display;
  }

  private string _referenceAddress;

  /// <summary>
  /// The Excel address for internal links.
  /// </summary>
  public string ReferenceAddress {
    get => _referenceAddress;
    set => _referenceAddress = value;
  }

  private string _display = "";

  /// <summary>
  /// Displayed text
  /// </summary>
  public string Display {
    get => _display;
    set => _display = value;
  }

  /// <summary>
  /// Tooltip
  /// </summary>
  public string ToolTip { get; set; }

  private int _colSpann;

  /// <summary>
  /// If the hyperlink spans multiple columns
  /// </summary>
  public int ColSpann {
    get => _colSpann;
    set => _colSpann = value;
  }

  private int _rowSpann;

  /// <summary>
  /// If the hyperlink spans multiple rows
  /// </summary>
  public int RowSpann {
    get => _rowSpann;
    set => _rowSpann = value;
  }

  /// <summary>
  /// Used to handle non absolute URI's.
  /// Is used if IsAblsoluteUri is true. The base URI will have a dummy value of xl://nonAbsolute.
  /// </summary>
  public Uri OriginalUri { get; internal set; }

  internal string RId { get; set; }
}
