// WS-POS version 1.3 参照実装
// 
// 実装 version 0.6 

using System.Collections.Generic;

namespace WSPOSInitiative.Common
{
    /// <summary>
    /// セッションマネージャのインターフェース
    /// </summary>
    public interface ISessionManager 
    {
        /// <summary>
        /// セッションコンテキストの取得
        /// Retrieving session context
        /// </summary>
        /// <param name="sessionID">セッションID | session ID</param>
        /// <returns>セッションIDに関連付けられたセッションコンテキスト | Session context associated with the session ID</returns>
        ISessionContext GetSessionContext(string sessionID);

        /// <summary>
        /// セッションコンテキストの設定
        /// Setting the session context
        /// </summary>
        /// <param name="sessionID">セッションID | Session ID</param>
        /// <param name="context">セッションIDに関連付けるセッションコンテキスト | Session context associated with a session ID </param>
        void SetSessionContext(string sessionID, ISessionContext context);

        /// <summary>
        /// セッションコンテキストの削除
        /// Delete the session context
        /// </summary>
        /// <param name="sessionID">削除するセッションコンテキストが関連付けられたセッションID | Session ID for delete.</param>
        void RemoveSessionContext(string sessionID);

        /// <summary>
        /// セッションIDがすでに管理下に存在するか否かを返す
        /// Returns whether a session ID already exists under the control
        /// </summary>
        /// <param name="sessionID">セッションID | Session ID</param>
        /// <returns>セッションIDがすでに管理下に存在するか否か | Session ID already exists under control or not</returns>
        bool IsExistSession(string sessionID);

        /// <summary>
        /// セッションIDが受け入れ可能か否かを返す
        /// Returns whether the session ID is acceptable
        /// </summary>
        /// <param name="sessionID">セッションID | Session ID</param>
        /// <returns>セッションIDが受け入れ可能か否か | The session ID is acceptable or not </returns>
        bool IsValidSessionID(string sessionID);

        /// <summary>
        /// セッションコンテキストを追加する 
        /// Add a session context
        /// </summary>
        /// <param name="sessionID">セッションID | Session ID</param>
        /// <param name="context">セッションIDに関連付けるセッションコンテキスト | Session context associated with a session ID</param>
        void AddSession(string sessionID, ISessionContext context);

        /// <summary>
        /// タイムアウトに達したセッションコンテキストを削除する
        /// Delete the session context that the timeout is reached
        /// </summary>
        /// <param name="all">true時にはすべてのコンテキストを削除 | If true is specified as this, all the contexts will be deleted. </param>
        /// <returns>削除したセッションコンテキストの列挙 | Enumeration of session context deleted</returns>
        IEnumerable<ISessionContext> RemoveTimeoutSessionContext(bool all);

        /// <summary>
        /// 管理している全セッションのIDを返す
        /// Returns all session ID
        /// </summary>
        /// <returns>全セッションコンテキストの列挙 | Enumeration of all the session ID</returns>
        ICollection<string> GetAllSessionIDs();
    }
}
