using System;
using System.Collections.Generic;
using System.Globalization;

namespace ScrewTurn.Wiki.PluginFramework {

	/// <summary>
	/// Represents a Navigation Path.
	/// </summary>
	public class NavigationPath {

		/// <summary>
		/// The namespace of the Navigation Path (<c>null</c> for the root).
		/// </summary>
		protected string nspace;
		/// <summary>
		/// The Name of the Navigation Path.
		/// </summary>
		protected string name;
		/// <summary>
		/// The names of the Pages in the Navigation Path.
		/// </summary>
		protected string[] pages;
		/// <summary>
		/// The Provider that handles the Navigation Path.
		/// </summary>
		protected IPagesStorageProviderV30 provider;

		/// <summary>
		/// Initializes a new instance of the <b>NavigationPath</b> class.
		/// </summary>
		/// <param name="fullName">The Full Name of the Navigation Path.</param>
		/// <param name="provider">The Provider</param>
		public NavigationPath(string fullName, IPagesStorageProviderV30 provider) {
			NameTools.ExpandFullName(fullName, out nspace, out name);
			this.provider = provider;
			pages = new string[0];
		}

		/// <summary>
		/// Gets or sets the full name of the Navigation Path, such as 'Namespace.Path' or 'Path'.
		/// </summary>
		public string FullName {
			get { return NameTools.GetFullName(nspace, name); }
			set { NameTools.ExpandFullName(value, out nspace, out name); }
		}

		/// <summary>
		/// Gets or sets the Pages of the Path.
		/// </summary>
		public string[] Pages {
			get { return pages; }
			set { pages = value; }
		}

		/// <summary>
		/// Gets the Provider.
		/// </summary>
		public IPagesStorageProviderV30 Provider {
			get { return provider; }
		}

	}

	/// <summary>
	/// Compares two <see cref="T:NavigationPaths" /> objects, using FullName as the comparison parameter.
	/// </summary>
	public class NavigationPathComparer : IComparer<NavigationPath> {

		/// <summary>
		/// Compares two Navigation Paths's FullName.
		/// </summary>
		/// <param name="x">The first object.</param>
		/// <param name="y">The second object.</param>
		/// <returns>The result of the comparison (1, 0 or -1).</returns>
		public int Compare(NavigationPath x, NavigationPath y) {
			return StringComparer.OrdinalIgnoreCase.Compare(x.FullName, y.FullName);
		}

	}

}