using System.Security.Claims;
using System.Threading.Tasks;
using GxPress.Api.Tools;
using GxPress.Auth;
using GxPress.Common.Page;
using GxPress.Entity;
using GxPress.EnumConst;
using GxPress.Repository.Interface;
using GxPress.Request.Admin;
using GxPress.Result.Admin;
using GxPress.Service.Interface.Role;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;

namespace GxPress.Api.AdminControllers
{
    /// <summary>
    /// 管理员
    /// </summary>
    [Route("api/admin/admin")]
    [ApiController]
    [Authorize(Roles = Roles.Admin)]
    public class AdminController : ControllerBase
    {
        private readonly JwtOptions _jwtOptions;
        private readonly ILogger<AdminController> _logger;
        private readonly IAdminRepository _adminRepository;

        private readonly IRoleService roleService;
        private readonly IHttpContextAccessor httpContextAccessor;
        public AdminController(IOptions<JwtOptions> jwtOptions, ILogger<AdminController> logger, IAdminRepository adminRepository, IRoleService roleService, IHttpContextAccessor httpContextAccessor)
        {
            _jwtOptions = jwtOptions.Value;
            _logger = logger;
            _adminRepository = adminRepository;
            this.roleService = roleService;
            this.httpContextAccessor=httpContextAccessor;
        }

        /// <summary>
        /// 登录
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPost("signin")]
        [AllowAnonymous]
        public async Task<AdminSignInResult> SignIn(AdminSignInRequest request)
        {
            request.Ip = httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString();
            var result = await _adminRepository.SignInAsync(request);
            //获取菜单
            result.MenuInResult = await roleService.GetMenusAllAsync(result.RoleId);
            var claims = new[]
            {
                new Claim(ClaimTypes.NameIdentifier,result.AdminId.ToString()),
                new Claim(ClaimTypes.Role,AccountTypeConst.Admin.ToString()),
                 new Claim(ClaimTypes.Actor,result.Name)
                };
            result.Token = TokenHelper.BuildToken(_jwtOptions, claims);
            _logger.LogInformation("admin token:{token}", result.Token);
            return result;
        }

        /// <summary>
        /// 注册
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPost("signup")]
        public async Task<int> SignUp([FromBody] AdminSignUpRequest request)
        {
            return await _adminRepository.SignUpAsync(request);
        }

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpDelete("{id}")]
        public async Task<bool> Delete(int id)
        {
            return await _adminRepository.DeleteAsync(id);
        }

        /// <summary>
        /// 详情
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpGet("{id}")]
        public async Task<AdminDetailResult> Get(int id)
        {
            return await _adminRepository.GetDetailAsync(id);
        }

        /// <summary>
        /// 修改
        /// </summary>
        /// <param name="id"></param>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPut("{id}")]
        public async Task<bool> Update(int id, [FromBody] Admin request)
        {
            return await _adminRepository.UpdateAsync(id, request);
        }
       
        /// <summary>
        /// 分页列表
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPost("page")]
        public async Task<PagedList<AdminPageResult>> GetPagedList([FromBody] AdminPageSearchRequest request)
        {
            var result = await _adminRepository.GetPagedList(request);
            foreach (var item in result.Items)
            {
                //获取菜单
                item.MenuInResult = await roleService.GetMenusAllAsync(item.RoleId);
            }
            return result;
        }

        /// <summary>
        /// 修改密码
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPut("updatepassword")]
        public async Task<bool> UpdatePassWord([FromBody] AdminUpdatePassWordRequest request)
        {
            return await _adminRepository.UpdatePassWord(request);
        }
        /// <summary>
        /// 修改密码
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPut("admin-update-password")]
        public async Task<bool> AdminUpdatePassWord([FromBody] AdminUpdatePassWordRequest request)
        {
            return await _adminRepository.AdminUpdatePassWord(request);
        }
    }
}