using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QMFrameWork.Cache;
using QMFrameWork.ServiceInterface;

namespace QMFrameWork.ServiceLibrary
{
    /// <summary>
    /// Session管理
    /// </summary>
    public class SessionManager
    {
        /// <summary>
        /// 用户登录列表
        /// </summary>
        private static Dictionary<string, CredentialInfo> UserLoginList = new Dictionary<string, CredentialInfo>();

        #region 判断用户是否为重复登录

        /// <summary>
        /// 判断用户是否为重复登录
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="loginc"></param>
        /// <returns></returns>
        public static bool IsRepeatLogin(string userName, CredentialInfo loginc)
        {
            if (UserLoginList.ContainsKey(userName) == true)
            {
                if (UserLoginList[userName].ClientIP != loginc.ClientIP)
                    return false;
            }

            return true;
        }

        #endregion

        #region 添加session

        /// <summary>
        /// 添加session
        /// </summary>
        /// <param name="key">键</param>
        /// <param name="session">session</param>
        public static void Add(string key, ServiceSession session)
        {
            if (UserLoginList.ContainsKey(session.UserCredential.UserName) == true)
            {
                UserLoginList[session.UserCredential.UserName] = session.UserCredential;
            }
            else
            {
                UserLoginList.Add(session.UserCredential.UserName, session.UserCredential);
            }
            new CacheManager().Add(key, session);
        }

        /// <summary>
        /// 添加session
        /// </summary>
        /// <param name="key">键</param>
        /// <param name="session">session</param>
        /// <param name="ts">过期时间</param>
        public static void Add(string key, ServiceSession session, TimeSpan ts)
        {
            if (UserLoginList.ContainsKey(session.UserCredential.UserName) == true)
            {
                UserLoginList[session.UserCredential.UserName] = session.UserCredential;
            }
            else
            {
                UserLoginList.Add(session.UserCredential.UserName, session.UserCredential);
            }
            new CacheManager().Add(key, session, ts);
        }

        #endregion

        #region 判断session是否存在

        /// <summary>
        /// 判断session是否存在
        /// </summary>
        /// <param name="key">键</param>
        /// <returns>true:存在;false:不存在</returns>
        public static bool Exists(string key)
        {
            object session = new CacheManager().Get(key);

            if (session == null)
                return false;
            else
                return true;
        }

        #endregion

        #region 移除session

        /// <summary>
        /// 移除session
        /// </summary>
        /// <param name="key">键</param>
        public static void Remove(string key)
        {
            ServiceSession session = GetSession(key);
            if (UserLoginList.ContainsKey(session.UserLogin.UserName) == true)
                UserLoginList.Remove(session.UserLogin.UserName);

            new CacheManager().Remove(key);
        }

        #endregion

        #region 获取session

        /// <summary>
        /// 获取session
        /// </summary>
        /// <param name="key">键</param>
        /// <returns>session</returns>
        public static ServiceSession GetSession(string key)
        {
            return new CacheManager().Get(key) as ServiceSession;
        }

        #endregion

        #region 清除过期用户登录信息

        /// <summary>
        /// 清除过期用户登录信息
        /// </summary>
        public static void ClearUserList()
        {
            List<CredentialInfo> list = UserLoginList.Values.ToList();
            foreach (CredentialInfo c in list)
            {
                bool isExists = Exists(c.CredentialID);

                if (isExists == false)
                {
                    //对应session已过期
                    UserLoginList.Remove(c.UserName);
                }
            }
        }

        #endregion
    }
}