using System;

namespace StreamBuddy.PluginInterface.Users
{
    /// <summary>
    /// Defines functions for accessing user data
    /// </summary>
    public interface IUser : DB.IValueStore
    {
        /// <summary>
        /// The nick for the given user.
        /// </summary>
        string Nick { get; }
		/// <summary>
		/// The display name of the given user.
		/// </summary>
		string DisplayName { get; }
        /// <summary>
        /// The users <seealso cref="Nick"/>, with decorations from an eventual <seealso cref="PluginInterface.INickHandler"/>.
        /// </summary>
        string DecoratedName { get; }
        /// <summary>
        /// The users rank.
        /// </summary>
        UserRank Rank { get; set; }
        /// <summary>
        /// The stream the user is a part of.
        /// </summary>
        IStream Stream { get; }

		/// <summary>
		/// When the user last joined the stream.
		/// </summary>
		DateTime LastJoined { get; }

        void RedecorateNick();

        /// <summary>
        /// Convenience function for replying to a user.
        /// </summary>
        /// <param name="Message">The message in the reply</param>
        /// <param name="Objects">Object data for formatting the string.</param>
        void Reply(string Message, params object[] Objects);
        /// <summary>
        /// Times the user out of the stream they're in.
        /// </summary>
        /// <param name="Seconds">The number of seconds to time them out for.</param>
        void Timeout(int Seconds = 600);
        /// <summary>
        /// Bans a user from the stream they're in.
        /// </summary>
        void Ban();
		void Unban();
    }
}
