using Admin.Core.Model;
using Admin.Core.Common.Resource;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Admin.Core.Common;
using System.Linq;
using AutoMapper;
using Microsoft.AspNetCore.Http;
using System.IO;
using Admin.Core.IService.ISys;
using Admin.Core.Model.Sys;

namespace Admin.Core.Api
{
    /// <summary>
    /// SysUserController
    /// </summary>
	[Route("api/[controller]/[action]")]
    [ApiController]
    [Authorize(Permissions.Name)]
    public class SysUserController : BaseApiUserController
    {

        /// <summary>
        /// _sysUserService
        /// </summary>
        private readonly ISysUserRoleService _sysUserRoleService;
        private readonly ISysRoleService _sysRoleService;
        private readonly ISysPostService _sysPostService;
        private readonly ISysUserPostService _sysUserPostService;
        private readonly ISysDeptService _sysDeptService;
        private readonly IMapper _mapper;
        /// <summary>
        /// 构造方法
        /// </summary>
        /// <param name="sysUserService"></param>
        /// <param name="sysUserRoleService"></param>
        /// <param name="sysRoleService"></param>
        /// <param name="sysPostService"></param>
        /// <param name="sysUserPostService"></param>
        /// <param name="sysDeptService"></param>
        /// <param name="mapper"></param>
        public SysUserController(ISysUserService sysUserService, ISysUserRoleService sysUserRoleService, ISysRoleService sysRoleService, ISysPostService sysPostService,
            ISysUserPostService sysUserPostService, ISysDeptService sysDeptService, IMapper mapper) : base(sysUserService)
        {
            _sysUserService = sysUserService;
            _sysUserRoleService = sysUserRoleService;
            _sysRoleService = sysRoleService;
            _sysPostService = sysPostService;
            _sysUserPostService = sysUserPostService;
            _sysDeptService = sysDeptService;
            _mapper = mapper;
        }

        /// <summary>
        /// 分页查询
        /// </summary>
        /// <param name="pageQuery"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<MessageModel<PageModel<UserModel>>> GetByPage([FromBody] PageQuery<UserQuery> pageQuery)
        {
            if (!pageQuery.Query.IsNotEmptyOrNull())
            {
                pageQuery.Query = new UserQuery();
            }
            var model = await _sysUserService.SelectUserList(pageQuery);
            return SuccessPage(model);
        }

        /// <summary>
        /// 获取所有用户
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task<MessageModel<List<SysUser>>> GetAllUser(string roleKey = "")
        {
            return Success(await _sysUserRoleService.GetAllUser(roleKey));
        }

        /// <summary>
        /// 根据ID查询
        /// </summary>
        /// <param name="id">主键</param>
        /// <returns></returns>
        [HttpGet]
        public async Task<MessageModel<UserView>> GetByID(int id)
        {
            return Success(await _sysUserService.GetByID(id));
        }

        /// <summary>
        /// 新增一条数据
        /// </summary>
        /// <param name="request">SysUser</param>
        /// <returns></returns>
        [HttpPost]
        public async Task<MessageModel<int>> Add([FromBody] UserView request)
        {
            MessageModel<int> data = new MessageModel<int>();

            var exist = await _sysUserService.CheckLoginNameUnique(request.SysUser.LoginName);
            if (exist)
            {
                data.success = false;
                data.msg = "账号已存在!";
                return data;
            }

            request.SysUser.CreateBy = CurrentUser.LoginName;
            request.SysUser.UpdateBy = CurrentUser.LoginName;

            data.data = await _sysUserService.InsertUser(request);
            if (data.data > 0)
            {
                data.success = true;
                data.msg = Resource_SysBase.OprateSuccess;
            }
            else
            {
                data.success = false;
                data.msg = Resource_SysBase.OprateFail;
            }
            return data;
        }

        /// <summary>
        /// 更新一条数据
        /// </summary>
        /// <param name="request">SysUser</param>
        /// <returns></returns>
        [HttpPost]
        public async Task<MessageModel<bool>> Update([FromBody] UserView request)
        {
            var data = new MessageModel<bool>();
            if (UserView.IsAdmin(request.SysUser.UserID))
            {
                data.success = false;
                data.msg = Resource_SysBase.OprateAdmin;
                return data;
            }

            request.SysUser.UpdateBy = CurrentUser.LoginName;
            data.data = await _sysUserService.UpdateUser(request);

            if (data.data)
            {
                data.success = true;
                data.msg = Resource_SysBase.OprateSuccess;
            }
            else
            {
                data.success = false;
                data.msg = Resource_SysBase.OprateFail;
            }

            return data;
        }

        /// <summary>
        /// 删除数据
        /// </summary>
        /// <param name="ids">主键</param>
        /// <returns></returns>
        [HttpPost]
        public async Task<MessageModel<bool>> Del(List<int> ids)
        {
            var data = new MessageModel<bool>();

            foreach (var userId in ids)
            {
                if (UserView.IsAdmin(userId))
                {
                    data.success = false;
                    data.msg = Resource_SysBase.OprateAdmin;
                    return data;
                }
            }

            data.data = await _sysUserService.DeleteUserByIds(ids.ToArray(), CurrentUser.LoginName);

            if (data.data)
            {
                data.success = true;
                data.msg = Resource_SysBase.OprateSuccess;
            }
            else
            {
                data.success = false;
                data.msg = Resource_SysBase.OprateFail;
            }

            return data;
        }

        /// <summary>
        /// 修改用户状态
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<MessageModel<bool>> ChangeStatus(SysUser user)
        {
            var data = new MessageModel<bool>();
            if (UserView.IsAdmin(user.UserID))
            {
                data.success = false;
                data.msg = Resource_SysBase.OprateAdmin;
                return data;
            }

            user.UpdateBy = CurrentUser.LoginName;
            data.data = await _sysUserService.UpdateUserStatus(user);

            if (data.data)
            {
                data.success = true;
                data.msg = Resource_SysBase.OprateSuccess;
            }
            else
            {
                data.success = false;
                data.msg = Resource_SysBase.OprateFail;
            }

            return data;
        }

        /// <summary>
        /// 用户数据导出
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<MessageModel<string>> Export(SysUser user)
        {
            Expression<Func<SysUser, bool>> whereExpression = a => true;
            var list = await _sysUserService.QueryAsync(whereExpression);
            return Success<string>(ExcelHelper.ExportToList(list, "用户数据"));
        }

        /// <summary>
        /// 用户数据导入
        /// </summary>
        /// <param name="file"></param>
        /// <param name="updateSupport"></param>
        /// <returns></returns>
        [HttpPost]
        public MessageModel<bool> ImportData(string file, bool updateSupport)
        {

            return Success(true);
        }

        /// <summary>
        /// 用户数据导入模板
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public MessageModel<string> ImportTemplate()
        {
            return Success<string>(string.Empty);
        }

        /// <summary>
        /// 根据用户编号获取详细信息
        /// </summary>
        /// <param name="userId"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<MessageModel<UserView>> GetInfo(int userId)
        {
            return Success(await _sysUserService.GetInfo(userId));
        }

        /// <summary>
        /// 重置密码
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<MessageModel<string>> ResetPwd(SysUser user)
        {
            var data = new MessageModel<string>();

            user.UpdateBy = CurrentUser.LoginName;
            data.success = await _sysUserService.ResetPwd(user);

            if (data.success)
            {
                data.msg = Resource_SysBase.OprateSuccess;
            }
            else
            {
                data.msg = Resource_SysBase.OprateFail;
            }
            return data;
        }

        /// <summary>
        /// 根据用户编号获取授权角色
        /// </summary>
        /// <param name="userId"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<MessageModel<UserView>> AuthRole(int userId)
        {
            return Success(await _sysUserService.AuthRole(userId));
        }

        /// <summary>
        /// 查询用户已分配角色列表
        /// </summary>
        /// <param name="userId"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<MessageModel<UserView>> AllocatedList(int userId)
        {
            return Success(await _sysUserService.AllocatedList(userId));
        }

        /// <summary>
        /// 查询用户未分配角色列表
        /// </summary>
        /// <param name="userId"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<MessageModel<UserView>> UnallocatedList(int userId)
        {
            return Success(await _sysUserService.UnallocatedList(userId));
        }

        /// <summary>
        /// 用户授权角色
        /// </summary>
        /// <param name="view"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<MessageModel<bool>> InsertAuthRole(UserRoleView view)
        {
            return Success(await _sysUserService.InsertUserAuth(view.UserID, view.RoleIds.ToArray()));
        }

        /// <summary>
        /// 个人信息
        /// </summary>
        [HttpGet]
        public async Task<MessageModel<UserView>> Profile()
        {
            return Success(await _sysUserService.GetInfo(CurrentUser.UserID));
        }

        /// <summary>
        /// 修改用户基础信息
        /// </summary>
        [HttpPost]
        public async Task<MessageModel<bool>> UpdateProfile(SysUser user)
        {
            user.UpdateBy = CurrentUser.LoginName;
            return Success(await _sysUserService.UpdateUserProfile(user));
        }

        /// <summary>
        /// 重置密码
        /// </summary>
        [HttpPost]
        public async Task<MessageModel<bool>> UpdatePwd(string oldPassword, string newPassword)
        {
            MessageModel<bool> model = new MessageModel<bool>();
            var user = await _sysUserService.QueryByIdAsync(CurrentUser.UserID);
            if (MD5Helper.MD5Encrypt32(oldPassword) == user.Password)
            {
                user.Password = MD5Helper.MD5Encrypt32(newPassword);
                user.UpdateBy = CurrentUser.LoginName;
                user.UpdateTime = DateTime.Now;
                model.success = await _sysUserService.UpdateAsync(user);
            }
            else
            {
                model.success = false;
                model.msg = Resource_SysBase.OprateFail;
            }
            return model;
        }

        /// <summary>
        /// 头像上传
        /// </summary>
        [HttpPost]
        public async Task<MessageModel<string>> Avatar()
        {
            MessageModel<string> model = new MessageModel<string>();
            //获取Form提交的文件
            var files = Request.Form.Files;
            if (files.Count == 0)
            {
                model.success = false;
                model.msg = "文件不存在!";
                return model;
            }
            model = await FileHelper.FileSaveByBlob(files);
            if (model.success)
            {
                var user = await _sysUserService.QueryByIdAsync(CurrentUser.UserID);
                user.Avatar = model.data;
                user.UpdateBy = CurrentUser.LoginName;
                user.UpdateTime = DateTime.Now;
                await _sysUserService.UpdateAsync(user);

            }

            return model;
        }

    }
}