using Dapper;
using System.Collections.Generic;
using System.Data;
using System.Threading.Tasks;
using Znyc.Recruitment.Admin.Commons.IDbContext;
using Znyc.Recruitment.Admin.Commons.Repositories;
using Znyc.Recruitment.Admin.Security.Dtos;
using Znyc.Recruitment.Admin.Security.Entitys;
using Znyc.Recruitment.Admin.Security.IRepositories;

namespace Znyc.Recruitment.Admin.Security.Repositories
{
    /// <summary>
    ///     应用仓储实现
    /// </summary>
    public class AdminUserRepository : BaseRepository<AdminUserEntity, long>, IAdminUserRepository
    {
        public AdminUserRepository()
        {
        }

        public AdminUserRepository(IDbContextCore context) : base(context)
        {
        }

        /// <summary>
        ///     根据用户账号查询用户信息
        /// </summary>
        /// <param name="userName"></param>
        /// <returns></returns>
        public async Task<AdminUserEntity> GetByUserName(string userName)
        {
            string sql = @"SELECT * FROM sys_adminuser t WHERE t.Account = @UserName";
            return await DapperConn.QueryFirstOrDefaultAsync<AdminUserEntity>(sql, new { UserName = userName });
        }

        /// <summary>
        ///     根据用户手机号码查询用户信息
        /// </summary>
        /// <param name="mobilephone">手机号码</param>
        /// <returns></returns>
        public async Task<AdminUserEntity> GetUserByMobilePhone(string mobilephone)
        {
            string sql = @"SELECT * FROM sys_adminuser t WHERE t.MobilePhone = @MobilePhone";
            return await DapperConn.QueryFirstOrDefaultAsync<AdminUserEntity>(sql, new { MobilePhone = mobilephone });
        }

        /// <summary>
        ///     根据Email、Account、手机号查询用户信息
        /// </summary>
        /// <param name="account">登录账号</param>
        /// <returns></returns>
        public async Task<AdminUserEntity> GetUserByLogin(string account)
        {
            string sql =
                @"SELECT * FROM sys_adminuser t WHERE (t.Account = @Account  or t.MobilePhone = @Account)";
            return await DapperConn.QueryFirstOrDefaultAsync<AdminUserEntity>(sql, new { Account = account });
        }

        /// <summary>
        ///     根据微信UnionId查询用户信息
        /// </summary>
        /// <param name="unionId">UnionId值</param>
        /// <returns></returns>
        public AdminUserEntity GetUserByUnionId(string unionId)
        {
            string sql = string.Format("select * from sys_adminuser where UnionId = '{0}'", unionId);
            return DapperConn.QueryFirstOrDefault<AdminUserEntity>(sql);
        }

        /// <summary>
        ///     根据第三方OpenId查询用户信息
        /// </summary>
        /// <param name="openIdType">第三方类型</param>
        /// <param name="openId">OpenId值</param>
        /// <returns></returns>
        public AdminUserEntity GetUserByOpenId(string openIdType, string openId)
        {
            string sql = string.Format(
                "select * from sys_adminuser as u join sys_adminuserOpenIds as o on u.Id = o.UserId and  o.OpenIdType = '{0}' and o.OpenId = '{1}'",
                openIdType, openId);
            return DapperConn.QueryFirstOrDefault<AdminUserEntity>(sql);
        }

        /// <summary>
        ///     根据userId查询用户信息
        /// </summary>
        /// <param name="openIdType">第三方类型</param>
        /// <param name="userId">userId</param>
        /// <returns></returns>
        public UserOpenIdsEntity GetUserOpenIdByuserId(string openIdType, long userId)
        {
            string sql = string.Format("select * from sys_adminuserOpenIds  where OpenIdType = '{0}' and UserId = '{1}'",
                openIdType, userId);
            return DapperConn.QueryFirstOrDefault<UserOpenIdsEntity>(sql);
        }

        /// <summary>
        ///     更新用户信息,第三方平台
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="userLogOnEntity"></param>
        /// <param name="trans"></param>
        public bool UpdateUserByOpenId(AdminUserEntity entity, AdminUserLogOnEntity userLogOnEntity,
            UserOpenIdsEntity userOpenIds,
            IDbTransaction trans = null)
        {
            DbContext.GetDbSet<AdminUserEntity>().Add(entity);
            DbContext.GetDbSet<UserOpenIdsEntity>().Add(userOpenIds);
            return DbContext.SaveChanges() > 0;
        }

        /// <summary>
        ///     分页得到所有用户用于关注
        /// </summary>
        /// <param name="currentpage"></param>
        /// <param name="pagesize"></param>
        /// <param name="userid"></param>
        /// <returns></returns>
        public IEnumerable<UserAllListFocusOutPutDto> GetUserAllListFocusByPage(string currentpage,
            string pagesize, long userId)
        {
            string sqlRecord = "";
            string sql = "";

            long countNotIn = (long.Parse(currentpage) - 1) * long.Parse(pagesize);

            sqlRecord = @"select * from sys_adminuser where UserName <> '游客' and  ismember=1 ";

            sql = @"SELECT TOP " + pagesize +
                  @"
case when t2.Id is null then 'n'
else 'y' end as IfFocus ,
IsNull(t3.totalFocus,0) as TotalFocus,
t1.*
from
(select ISNULL(tin2.VipGrade,0) as VipGrade,
ISNULL(tin2.IsAuthentication,0) as IsAuthentication,
ISNULL(tin2.AuthenticationType,0) as AuthenticationType,
tin1.* from sys_adminuser tin1
left join sys_adminuserExtend tin2 on tin1.Id=tin2.UserId
where UserName <> '游客' and  ismember=1) t1
left join
(select * from sys_adminuserFocus where CreatedUserId='" + userId + @"') t2
on t1.id=t2.focususerid
left join
(select  top 100 percent focusUserID,count(*) as totalFocus from sys_adminuserFocus group by focusUserID order by totalfocus desc) t3
on t1.Id=t3.focusUserID

where t1.Id not in
(
select top " + countNotIn + @"
tt1.Id
from
(select ISNULL(tin2.VipGrade,0) as VipGrade,
ISNULL(tin2.IsAuthentication,0) as IsAuthentication,
ISNULL(tin2.AuthenticationType,0) as AuthenticationType,
tin1.* from sys_adminuser tin1
left join sys_adminuserExtend tin2 on tin1.Id=tin2.UserId
where UserName <> '游客' and  ismember=1) tt1
left join
(select * from sys_adminuserFocus where CreatedUserId='" + userId + @"') tt2
on tt1.id=tt2.focususerid
left join
(select  top 100 percent focusUserID,count(*) as totalFocus from sys_adminuserFocus group by focusUserID order by totalfocus desc) tt3
on tt1.Id=tt3.focusUserID

order by tt3.totalFocus desc
)

order by t3.totalFocus desc";

            List<UserAllListFocusOutPutDto> list = new List<UserAllListFocusOutPutDto>();

            IEnumerable<UserAllListFocusOutPutDto> infoOutputDto = DapperConn.Query<UserAllListFocusOutPutDto>(sql);

            //得到总记录数
            List<UserAllListFocusOutPutDto> recordCountList = DapperConn.Query<UserAllListFocusOutPutDto>(sqlRecord).AsList();

            list = infoOutputDto.AsList();
            for (int i = 0; i < list.Count; i++)
            {
                list[i].RecordCount = recordCountList.Count;
            }

            return list;
        }
    }
}