using DH.RBAC.Model.Sys;
using DH.RBAC.Logic.Base;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DH.RBAC.Utility.Other;


namespace DH.RBAC.Logic.Sys
{
    public class SysUserLogOnLogic : BaseLogic
    {

        /// <summary>
        /// 根据用户Id得到登录账号信息
        /// </summary>
        /// <param name="userId"></param>
        /// <returns></returns>
        public SysUserLogOn GetByAccount(string userId)
        {
            using (var db = GetInstance())
            {
                return db.Queryable<SysUserLogOn>().Where(it => it.UserId == userId).First();
            }
        }

        /// <summary>
        /// 更新用户登录账号信息
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public int UpdateLogin(SysUserLogOn model)
        {
            using (var db = GetInstance())
            {
                model.IsOnLine = "1";
                model.LastVisitTime = DateTime.Now;
                model.PrevVisitTime = model.LastVisitTime;
                model.LoginCount += 1;
                model.ModifyTime = DateTime.Now;
                model.ModifyUserId = model.UserId;
                return db.Updateable<SysUserLogOn>(model).UpdateColumns(it => new
                {
                    it.IsOnLine,
                    it.PrevVisitTime,
                    it.LastVisitTime,
                    it.LoginCount,
                    it.ModifyTime,
                    it.ModifyUserId
                }).ExecuteCommand();
            }
        }

        /// <summary>
        /// 修改密码
        /// </summary>
        /// <param name="userLoginEntity"></param>
        /// <returns></returns>
        public int ModifyPwd(SysUserLogOn userLoginEntity)
        {
            using (var db = GetInstance())
            {
                userLoginEntity.ChangePwdTime = DateTime.Now;
                userLoginEntity.ModifyUserId = userLoginEntity.UserId;
                userLoginEntity.ModifyTime = DateTime.Now;

                return db.Updateable<SysUserLogOn>(userLoginEntity).UpdateColumns(it => new
                {
                    it.Password,
                    it.ChangePwdTime,
                    it.ModifyUserId,
                    it.ModifyTime
                }).ExecuteCommand();
            }
        }

        /// <summary>
        /// 删除用户登录信息
        /// </summary>
        /// <param name="userIds"></param>
        /// <returns></returns>
        public int Delete(List<string> userIds)
        {
            using (var db = GetInstance())
            {
                List<SysUserLogOn> list = db.Queryable<SysUserLogOn>().Where(it => userIds.Contains(it.UserId)).ToList();
                list.ForEach(it => { it.DeleteFlag = "Y"; });
                return db.Updateable<SysUserLogOn>(list).ExecuteCommand();
            }
        }

        /// <summary>
        /// 新增用户登录账号
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public int Insert(SysUserLogOn model)
        {
            using (var db = GetInstance())
            {
                model.Id = UUID.StrSnowId;
                model.SecretKey = model.Id.DESEncrypt().Substring(0, 8);
                model.Password = model.Password.MD5Encrypt().DESEncrypt(model.SecretKey).MD5Encrypt();
                model.LoginCount = 0;
                model.IsOnLine = "0";
                model.EnableFlag = "Y";
                model.DeleteFlag = "N";
                model.CreateTime = DateTime.Now;
                model.ModifyTime = DateTime.Now;
                model.ModifyUserId = model.UserId;
                model.CreateUserId = model.UserId;
                return db.Insertable<SysUserLogOn>(model).ExecuteCommand();
            }
        }

        /// <summary>
        /// 更新用户登录账号信息
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public int UpdateInfo(SysUserLogOn model)
        {
            using (var db = GetInstance())
            {
                model.ModifyTime = DateTime.Now;
                model.ModifyUserId = model.UserId;

                return db.Updateable<SysUserLogOn>(model).UpdateColumns(it => new
                {
                    it.AllowMultiUserOnline,
                    it.Question,
                    it.AnswerQuestion,
                    it.CheckIPAddress,
                    it.Language,
                    it.Theme,
                    it.ModifyUserId,
                    it.ModifyTime
                }).ExecuteCommand();
            }
        }

        public int UpdateTheme(SysUserLogOn model)
        {
            using (var db = GetInstance())
            {
                model.ModifyTime = DateTime.Now;
                model.ModifyUserId = model.UserId;
                return db.Updateable<SysUserLogOn>(model).UpdateColumns(it => new
                {
                    it.Theme,
                    it.ModifyUserId,
                    it.ModifyTime
                }).ExecuteCommand();
            }
        }

        public int UpdatePassword(SysUserLogOn model)
        {
            using (var db = GetInstance())
            {
                model.ModifyTime = DateTime.Now;
                model.ModifyUserId = model.UserId;
                return db.Updateable<SysUserLogOn>(model).UpdateColumns(it => new
                {
                    it.Password,
                    it.ModifyUserId,
                    it.ModifyTime
                }).ExecuteCommand();
            }
        }
    }
}