using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
using NLog;
using backstage.Helpers;
using backstage.Models;
using backstage.Models.Users;
using Newtonsoft.Json.Linq;
using System.Linq;
using TokenVault_management.Models;

namespace backstage.Controllers
{

    public class UserController : Controller
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
        private readonly IConfiguration _config;
        private readonly ICallApi _callApi;

        private static Logger logger = LogManager.GetCurrentClassLogger();
        /// <summary>
        /// 讀取組態用
        /// </summary>

        public UserController(IConfiguration config, ICallApi callApi, IHttpContextAccessor httpContextAccessor)
        {
            _config = config;
            _callApi = callApi;
            _httpContextAccessor = httpContextAccessor;
        }



        [HttpGet]
        public async Task<IActionResult> Login()
        {

            return View();

        }



        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Login(User user, string returnUrl)
        {
            logger.Info("test");
            if (!ModelState.IsValid)
            {
                return View(user);
            }



            //var u = await _UserRepository.Login(user);
            var u = new UserLogin();



            var url = _config["IP"];
            var parameters = new Dictionary<string, string>
              {
                    { "username", user.username },
                    { "pwd", user.pwd },
                    { "reqPermFlag[0]","admin-login"}
              };
            var httpMethod = HttpMethod.Post;
            int maxTry = 2;
            int currentTry = 0;

            while (currentTry < maxTry)
            {
                try
                {
                    var apiResult = await _callApi.CallAPI(url, parameters, httpMethod);

                    if (apiResult.IsSuccess)
                    {
                        // API 呼叫成功,進行相應的處理

                        u = JsonConvert.DeserializeObject<UserLogin>(apiResult.Data.ToString());
                        if (u.r == 0 && !string.IsNullOrEmpty(u.token))
                        {
                            string role = "";
                            if (user.username == "theone")
                            {
                                role = "Admin";
                            }
                            else
                            {

                                #region admin/list
                                url = _config["IP"] + "/admin/list";
                                httpMethod = HttpMethod.Post;
                                var types = new[] { "admin" };
                                var types_data = new { inc = types };
                                role = "Merchant";

                                parameters = new Dictionary<string, string>
                              {
                                    { "token", u.token },
                                    { "types", JsonConvert.SerializeObject(types_data)},

                                };

                                apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
                                var adminResponse = new UserResponse();
                                if (apiResult.IsSuccess)
                                {

                                    adminResponse = JsonConvert.DeserializeObject<UserResponse>(apiResult.Data.ToString());
                                    if (adminResponse.r == 0)
                                    {
                                        var existAdmin = adminResponse.Users.Where(u => u.username == user.username).FirstOrDefault();
                                        if (existAdmin != null)
                                        {
                                            if (existAdmin.enabled == 1)
                                                role = "Admin";
                                        }
                                    }



                                }
                                #endregion
                            }


                            #region 寫入TOKEN
                            int LoginExpireMinute = Convert.ToInt32(_config["LoginExpireMinute"]);
                            string key = _config["TokenKey"];

                            var Cookieoptions = new CookieOptions();
                            ////時間一到就會把Token從Cookie洗掉,如果Expires沒比API的Expires長,則每次Token過期都須重新登入
                            Cookieoptions.Expires = DateTime.Now.AddMinutes(LoginExpireMinute);
                            //Cookieoptions.SameSite = SameSiteMode.Strict;
                            Cookieoptions.HttpOnly = true;

                            var userClaims = new ClaimsIdentity(new[]
                                        {
                           new Claim("username", user.username),
                            new Claim("token", u.token),
                            new Claim(ClaimTypes.Role, role),

                             }, CookieAuthenticationDefaults.AuthenticationScheme);

                            //將 ClaimsIdentity 設定給 ClaimsPrincipal (持有者) 
                            ClaimsPrincipal principal = new ClaimsPrincipal(userClaims);
                            //登入動作

                            try
                            {
                                await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal, new AuthenticationProperties()
                                {
                                    //是否可以被刷新
                                    AllowRefresh = true,
                                    // 設置了一個 1 天 有效期的持久化 cookie
                                    IsPersistent = true, //IsPersistent = false,瀏覽器關閉即刻登出
                                                         //用戶頁面停留太久,逾期時間,在此設定的話會覆蓋Startup.cs裡的逾期設定
                                    ExpiresUtc = DateTime.Now.AddMinutes(LoginExpireMinute),


                                });
                            }
                            catch (Exception ex)
                            {
                                logger.Trace(ex.Message + ex.InnerException?.Message);
                            }
                            #endregion


                            return RedirectToAction("Index", "Home");
                        }
                        else if (u.r == 65796)
                        {

                            currentTry++;
                            parameters["reqPermFlag[0]"] = "merchant-login";
                            continue;
                        }
                        else
                        {


                            TempData["IsSuccess"] = false;
                            TempData["msg"] = u.m;

                            return View(apiResult.Message);
                        }

                    }
                    else
                    {
                        // API 呼叫失敗,進行相應的錯誤處理
                        logger.Debug(apiResult.Message);
                        return BadRequest(apiResult.Message);
                    }
                }
                catch (Exception ex)
                {
                    // 處理 API 呼叫發生的例外狀況
                    logger.Debug(ex.Message);
                    return StatusCode(500, $"API 呼叫發生錯誤:{ex.Message}");
                }
            }



            TempData["IsSuccess"] = false;
            TempData["msg"] = "發生錯誤";
            logger.Debug("login error");
            return View();


        }


        [Authorize]
        [HttpGet]
        public async Task<IActionResult> ListUsers()
        {
            var UserResponse = new UserResponse();



            // 取得使用者的 "token" Claim 值
            string token = User.FindFirstValue("token");
            #region user/list
            var url = _config["IP"] + "/user/list";
            var httpMethod = HttpMethod.Post;
            var types = new[] { "all" };
            var types_data = new { inc = types };
            var parameters = new Dictionary<string, string>
              {
                    { "token", token },
                    { "types", JsonConvert.SerializeObject(types_data)},
                { "email","1"},
                { "phone","1"}
                    //{ "types", "{\"inc\":[\"all\"]}"}

                };

            var apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
            if (apiResult.IsSuccess)
            {
                UserResponse = JsonConvert.DeserializeObject<UserResponse>(apiResult.Data.ToString());

            }
            #endregion

            #region admin/list
            url = _config["IP"] + "/admin/list";
            httpMethod = HttpMethod.Post;
            types = new[] { "admin" };
            types_data = new { inc = types };

            parameters = new Dictionary<string, string>
              {
                    { "token", token },
                    { "types", JsonConvert.SerializeObject(types_data)},
                { "email","1"},
                { "phone","1"}
                    //{ "types", "{\"inc\":[\"all\"]}"}

                };

            apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
            var adminResponse = new UserResponse();
            if (apiResult.IsSuccess)
            {
                adminResponse = JsonConvert.DeserializeObject<UserResponse>(apiResult.Data.ToString());

            }
            #endregion

            if (adminResponse.r == 0)
            {
                if (adminResponse.userCount > 0)
                {
                    foreach (var a in adminResponse.Users)
                    {
                        foreach (var v in UserResponse.Users)
                        {
                            if (v.uid == 1)
                                v.isAdmin = true;
                            if (a.uid == v.uid && a.enabled == 1)
                                v.isAdmin = true;

                        }
                    }
                }
            }
            ViewBag.adminCount = adminResponse.userCount;
            ViewBag.userCount = UserResponse.userCount;
            return View(UserResponse);




        }

        [Authorize]
        [HttpGet("/User/GetUser/{uid}")]
        public async Task<IActionResult> GetUser(int uid)
        {
            var url = _config["IP"] + "/user/get";


            var httpMethod = HttpMethod.Post;
            // 取得使用者的 "token" Claim 值
            string token = User.FindFirstValue("token");

            var types = new string[] { "merchant", "admin", "user" }; // 陣列中的不同 type 值
            var parameters = new Dictionary<string, string>
              {
                    { "token", token },
                { "type","merchant"},
                { "uid",uid.ToString()}

             };



            int maxRetries = types.Length; // 最大重試次數
            int currentRetry = 0; // 目前重試次數

            while (currentRetry < maxRetries)
            {
                var currentIndex = Array.IndexOf(types, parameters["type"]); // 取得當前 type 的索引
                var apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
                if (apiResult.IsSuccess)
                {


                    try
                    {
                        var GetUserResponse = JsonConvert.DeserializeObject<GetUserResponse>(apiResult.Data.ToString());
                        if (GetUserResponse.r == 0)
                        {
                            if (!string.IsNullOrEmpty(GetUserResponse.user.username))
                            {
                                //var user = new User();
                                //user.name = GetUserResponse.user.name;
                                //user.username = GetUserResponse.user.username;
                                if (GetUserResponse.email != null)
                                    GetUserResponse.user.email = GetUserResponse.email;
                                // 使用 JSON 解析工具將 JSON 字串轉換為物件
                                //var jsonObject = JsonConvert.DeserializeObject<Dictionary<string, string>>(apiResult.Data.ToString());

                                GetUserResponse.user.uid = uid;

                                //user.created_date = DateTime.Parse(jsonObject["created_date"]);
                                return View(GetUserResponse.user);
                            }
                        }
                        else
                        {
                            TempData["IsSuccess"] = false;
                            TempData["msg"] = "使用者不存在";
                            return RedirectToAction("ListUsers");
                        }
                    }
                    catch (Exception e)
                    {
                        currentRetry++; // 增加重試次數
                                        // 如果 type 不是最後一個陣列元素,則將 type 更改為下一個值
                        if (currentIndex < types.Length - 1)
                        {
                            parameters["type"] = types[currentIndex + 1];
                        }
                    }
                }
            }



            return View();
        }

        /// <summary>
        /// 修改密碼
        /// </summary>
        /// <returns></returns>
        [Authorize]
        [HttpGet]
        public async Task<IActionResult> ChangePassword(string username, string returnUrl)
        {
            if (User.Identity.IsAuthenticated && User.IsInRole("Admin"))
            {
                // 使用者已驗證並具有 "admin" 角色

                var url = _config["IP"] + "/user/list";
                ViewBag.returnUrl = returnUrl;

                var httpMethod = HttpMethod.Post;
                // 取得使用者的 "token" Claim 值
                string token = User.FindFirstValue("token");

                var types = new[] { "all" };
                var types_data = new { inc = types };
                var parameters = new Dictionary<string, string>
              {
                    { "token", token },
                { "types",JsonConvert.SerializeObject( types_data)}

             };


                var apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
                if (apiResult.IsSuccess)
                {


                    try
                    {
                        var UserResponse = JsonConvert.DeserializeObject<UserResponse>(apiResult.Data.ToString());
                        if (UserResponse.r == 0)
                        {
                            if (UserResponse.userCount > 0)
                            {
                                var existUser = UserResponse.Users.Where(u => u.username == username).FirstOrDefault();
                                if (existUser == null)
                                {
                                    TempData["IsSuccess"] = false;
                                    TempData["msg"] = "使用者不存在";
                                    return Redirect("~" + returnUrl);
                                }
                                else
                                {
                                    return View(existUser);
                                }
                            }
                            TempData["IsSuccess"] = false;
                            TempData["msg"] = "使用者不存在";
                            return Redirect("~" + returnUrl);


                        }
                        else if (UserResponse.r == 65537)
                        {

                        }
                        else
                        {
                            TempData["IsSuccess"] = false;
                            TempData["msg"] = "發生錯誤";
                            return RedirectToAction(returnUrl);
                        }
                    }
                    catch (Exception e)
                    {
                        TempData["IsSuccess"] = false;
                        TempData["msg"] = e.Message;
                        return Redirect("~" + returnUrl);
                    }
                }

                TempData["IsSuccess"] = false;
                TempData["msg"] = "發生錯誤";
                return Redirect("~" + returnUrl);
            }
            else
            {


                ViewBag.returnUrl = returnUrl;
                return View();


            }

        }

        [Authorize]
        [HttpPost]
        public async Task<IActionResult> ChangePassword(User user, string returnUrl)
        {
            var url = _config["IP"] + "/admin/changepassword";

            if (string.IsNullOrEmpty(user.password))
            {
                ModelState.AddModelError("Password", "密碼不能為空");
            }

            var httpMethod = HttpMethod.Post;
            // 取得使用者的 "token" Claim 值
            string token = User.FindFirstValue("token");


            var parameters = new Dictionary<string, string>
              {
                    { "token", token },
                { "newpwd",user.newPassword}

                };
            var apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
            if (apiResult.IsSuccess)
            {
                var userAddResponse = JsonConvert.DeserializeObject<UserAddResponse>(apiResult.Data.ToString());
                if (userAddResponse.r == 0)
                {
                    TempData["IsSuccess"] = true;
                    TempData["msg"] = "更改密碼成功";
                    return RedirectToAction("ListUsers");
                }
                else
                {
                    TempData["IsSuccess"] = false;
                    TempData["msg"] = JsonConvert.SerializeObject(userAddResponse.m);
                    return View(user);
                }


            }



            return View();
        }

        [Authorize(Policy = "AdminOnly")]
        [HttpGet]
        public async Task<IActionResult> CreateUser()
        {
            return View();
        }

        [Authorize(Policy = "AdminOnly")]
        [HttpPost]
        public async Task<IActionResult> CreateUser(User user)
        {
            var url = _config["IP"] + "/user/add";

            if (string.IsNullOrEmpty(user.password))
            {
                ModelState.AddModelError("Password", "密碼不能為空");
            }

            var httpMethod = HttpMethod.Post;
            // 取得使用者的 "token" Claim 值
            string token = User.FindFirstValue("token");


            var parameters = new Dictionary<string, string>
              {
                    { "token", token },
                { "data",JsonConvert.SerializeObject(user)}

                };
            var apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
            if (apiResult.IsSuccess)
            {
                var userAddResponse = JsonConvert.DeserializeObject<UserAddResponse>(apiResult.Data.ToString());
                if (userAddResponse.r == 0)
                {
                    TempData["IsSuccess"] = true;
                    TempData["msg"] = "新增使用者成功";
                    return RedirectToAction("ListUsers");
                }
                else
                {
                    TempData["IsSuccess"] = false;
                    TempData["msg"] = JsonConvert.SerializeObject(userAddResponse.m);
                    return View(user);
                }


            }



            return View();
        }

        /// <summary>
        /// 編輯使用者
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        [Authorize]
        [HttpPost]
        public async Task<IActionResult> GetUser(User user)
        {



            // 取得使用者的 "token" Claim 值
            string token = User.FindFirstValue("token");

            #region user/list
            var url = _config["IP"] + "/user/list";
            var httpMethod = HttpMethod.Post;
            var types = new[] { "all" };
            var types_data = new { inc = types };
            var parameters = new Dictionary<string, string>
              {
                    { "token", token },
                    { "types", JsonConvert.SerializeObject(types_data)},
                { "email","1"},
                { "phone","1"}
                    //{ "types", "{\"inc\":[\"all\"]}"}

                };

            var apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
            if (apiResult.IsSuccess)
            {
                var UserResponse = JsonConvert.DeserializeObject<UserResponse>(apiResult.Data.ToString());

                if (UserResponse.userCount > 0)
                {
                    var existUser = UserResponse.Users.Where(u => u.uid == user.uid).FirstOrDefault();
                    if (existUser == null)
                    {
                        return RedirectToAction("ListUsers");
                    }

                    //檢查name 
                    if (string.IsNullOrEmpty(user.name))
                    {
                        ModelState.AddModelError("name", "name必填");
                    }
                    var existName = UserResponse.Users.Where(u => u.name == user.name).FirstOrDefault();
                    if (existName != null)
                    {
                        if (existName.uid != user.uid)
                            ModelState.AddModelError("name", "name重複");
                    }
                    //檢查username 
                    if (string.IsNullOrEmpty(user.username))
                    {

                        ModelState.AddModelError("username", "username必填");
                    }
                    var existUserName = UserResponse.Users.Where(u => u.username == user.username).FirstOrDefault();
                    if (existUserName != null)
                    {
                        if (existUserName.uid != user.uid)
                            ModelState.AddModelError("username", "username重複");
                    }

                    if (!ModelState.IsValid)
                    {
                        return View(user);
                    }
                    //檢查通過
                    //修改基本資料
                    existUser.name = user.name;
                    existUser.username = user.username;

                    url = _config["IP"] + "/user/mod";


                    parameters = new Dictionary<string, string>
                      {
                            { "token", token },
                            { "data", JsonConvert.SerializeObject(existUser)}
                            //{ "types", "{\"inc\":[\"all\"]}"}

                        };

                    apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
                    if (apiResult.IsSuccess)
                    {
                        TempData["IsSuccess"] = true;
                        TempData["msg"] = "編輯成功";

                        //修改密碼
                        if (!string.IsNullOrEmpty(user.newPassword))
                        {
                            existUser.password = user.newPassword;
                            url = _config["IP"] + "/user/changepassword";

                            parameters = new Dictionary<string, string>
                             {
                                    { "token", token },
                                { "oldpwd",user.password},
                                { "newpwd",user.newPassword}


                                };

                            apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
                            if (apiResult.IsSuccess)
                            {
                                var response = JsonConvert.DeserializeObject<Response>(apiResult.Data.ToString());
                                if (response.r == 0)
                                {
                                    TempData["IsSuccess"] = true;
                                    TempData["msg"] = "編輯成功";

                                }
                                else
                                {
                                    TempData["IsSuccess"] = false;
                                    TempData["msg"] = response.m;
                                    return View();
                                }
                                return RedirectToAction("ListUsers");
                            }
                        }



                        return RedirectToAction("ListUsers");
                    }



                    TempData["IsSuccess"] = false;
                    TempData["msg"] = "user_id不存在";
                    return View(existUser);

                }

            }
            //查無使用者

            TempData["IsSuccess"] = false;
            TempData["msg"] = "查無使用者";
            return RedirectToAction("ListUsers");
            #endregion



        }

        [Authorize]
        [HttpGet]
        public async Task<IActionResult> ListDepartments()
        {
            var DepartmentsResponse = new DepartmentsResponse();
            var url = _config["IP"] + "/merchant/list";
          


            var httpMethod = HttpMethod.Post;
            // 取得使用者的 "token" Claim 值
            string token = User.FindFirstValue("token");


            var parameters = new Dictionary<string, string>
              {
                    { "token", token }

                };

            var apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
            if (apiResult.IsSuccess)
            {
                DepartmentsResponse = JsonConvert.DeserializeObject<DepartmentsResponse>(apiResult.Data.ToString());
                if (DepartmentsResponse.r == 0)
                {
                    return View(DepartmentsResponse);
                }

            }

            return Ok(apiResult.Data.ToString());


        }

        [Authorize(Policy = "AdminOnly")]
        [HttpGet("/User/GetDepartment/{id}")]
        public async Task<IActionResult> GetDepartment(int id)
        {
            var url = _config["IP"] + "/merchant/get";


            var httpMethod = HttpMethod.Post;
            // 取得使用者的 "token" Claim 值
            string token = User.FindFirstValue("token");


            var parameters = new Dictionary<string, string>
              {
                    { "token", token },
                { "merchant_id",id.ToString()}

                };
            var apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
            if (apiResult.IsSuccess)
            {
                var DepartmentsResponse = JsonConvert.DeserializeObject<DepartmentsResponse>(apiResult.Data.ToString());
                if (DepartmentsResponse.r == 0)
                {

                    return View(DepartmentsResponse.merchant);

                }
                else
                {
                    TempData["IsSuccess"] = false;
                    TempData["msg"] = apiResult.Message;
                    return RedirectToAction("ListUsers");
                }


            }



            return View();
        }

        [Authorize(Policy = "AdminOnly")]
        [HttpGet]
        public async Task<IActionResult> CreateDepartment()
        {
            return View();
        }

        [Authorize(Policy = "AdminOnly")]
        [HttpPost]
        public async Task<IActionResult> CreateDepartment(DepartmentForCreate department)
        {
            var url = _config["IP"] + "/merchant/add";

            if (string.IsNullOrEmpty(department.name))
            {
                ModelState.AddModelError("name", "部門名稱不能為空");
            }
            if (string.IsNullOrEmpty(department.phone))
            {
                department.phone = "null";
            }

            var httpMethod = HttpMethod.Post;
            // 取得使用者的 "token" Claim 值
            string token = User.FindFirstValue("token");



            var parameters = new Dictionary<string, string>
              {
                    { "token", token },
                    { "data",JsonConvert.SerializeObject(department)}

                };
            var apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
            if (apiResult.IsSuccess)
            {
                var userAddResponse = JsonConvert.DeserializeObject<UserAddResponse>(apiResult.Data.ToString());
                if (userAddResponse.r == 0)
                {
                    TempData["IsSuccess"] = true;
                    TempData["msg"] = "新增部門成功";
                    return RedirectToAction("ListDepartments");
                }
                else
                {
                    TempData["IsSuccess"] = false;
                    TempData["msg"] = JsonConvert.SerializeObject(userAddResponse.m);
                    return View(department);
                }


            }



            return View();
        }



        /// <summary>
        /// enable做兩件事情,user加入admin,並且enable=true,
        /// disable做一件事情就是enable=false
        /// </summary>
        /// <param name="uid"></param>
        /// <param name="isAdmin"></param>
        /// <returns></returns>
        [Authorize(Policy = "AdminOnly")]
        [HttpPost]
        public async Task<ResultModel> AdminAddAjax(int uid, int isAdmin)
        {
            var result = new ResultModel();

            //// 確認使用者是否已經登入
            //if (!User.Identity.IsAuthenticated)
            //{
            //    result.IsSuccess = false;
            //    result.Message = "未登入";
            //    return result;
            //}

            // 取得使用者的 "token" Claim 值
            string token = User.FindFirstValue("token");

            var url = _config["IP"] + "/admin/add";
            var httpMethod = HttpMethod.Post;
            var userData = new[] {

                new {
                    uid=uid,
                    desc="",
                    roles = new[] { 1 },
                    enabled=1

                }
            };
            //檢查是否在admin/list
            var existAdmin = new User();
            #region admin/list
            url = _config["IP"] + "/admin/list";
            httpMethod = HttpMethod.Post;
            var types = new[] { "admin" };
            var types_data = new { inc = types };

            var parameters = new Dictionary<string, string>
              {
                    { "token", token },
                    { "types", JsonConvert.SerializeObject(types_data)},
                { "email","1"},
                { "phone","1"}
                    //{ "types", "{\"inc\":[\"all\"]}"}

                };

            var apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
            var adminResponse = new UserResponse();
            if (apiResult.IsSuccess)
            {
                adminResponse = JsonConvert.DeserializeObject<UserResponse>(apiResult.Data.ToString());
                existAdmin = adminResponse.Users.Where(u => u.uid == uid).FirstOrDefault();

            }
            #endregion

            //加入admin list
            if (existAdmin == null)
            {
                if (isAdmin == 1)
                {
                    url = _config["IP"] + "/admin/add";
                    parameters = new Dictionary<string, string>
                  {
                        { "token", token},
                      { "user",JsonConvert.SerializeObject( userData)}
                 };

                    apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
                    if (apiResult.IsSuccess)
                    {
                        var Response = JsonConvert.DeserializeObject<Response>(apiResult.Data.ToString());

                        if (Response.r == 0)
                        {
                            result.IsSuccess = true;
                            result.Message = "權限調整成功";
                            return result;

                        }
                        else
                        {

                            result.IsSuccess = false;
                            result.Message = Response.m.ToString();
                            return result;
                        }

                    }
                    else
                    {
                        result.IsSuccess = false;
                        result.Message = apiResult.Message;
                        return result;
                    }
                }
                else
                {
                    result.IsSuccess = false;
                    result.Message = "非admin";
                    return result;
                }
            }
            else
            {
                url = _config["IP"] + "/admin/mod";
                httpMethod = HttpMethod.Post;
                existAdmin.enabled = isAdmin;

                parameters = new Dictionary<string, string>
                {
                    { "token", token },
                    { "data", JsonConvert.SerializeObject(existAdmin)}

                };
                apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
                if (apiResult.IsSuccess)
                {
                    var Response = JsonConvert.DeserializeObject<Response>(apiResult.Data.ToString());

                    if (Response.r == 0)
                    {
                        result.IsSuccess = true;
                        result.Message = "權限調整成功";
                        return result;

                    }
                    else
                    {

                        result.IsSuccess = false;
                        result.Message = Response.m.ToString();
                        return result;
                    }
                }
                else
                {
                    result.IsSuccess = false;
                    result.Message = apiResult.Message;
                    return result;
                }

            }

        }



        [Authorize(Policy = "AdminOnly")]
        [HttpPost]
        public async Task<ResultModel> UserEnableAjax(int uid, int enabled)
        {
            var result = new ResultModel();

            // 取得使用者的 "token" Claim 值
            string token = User.FindFirstValue("token");

            #region user/list
            var url = _config["IP"] + "/user/list";
            var httpMethod = HttpMethod.Post;
            var types = new[] { "all" };
            var types_data = new { inc = types };
            var parameters = new Dictionary<string, string>
              {
                    { "token", token },
                    { "types", JsonConvert.SerializeObject(types_data)},
                { "email","1"},
                { "phone","1"}
                    //{ "types", "{\"inc\":[\"all\"]}"}

                };

            var apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
            if (apiResult.IsSuccess)
            {
                var UserResponse = JsonConvert.DeserializeObject<UserResponse>(apiResult.Data.ToString());

                if (UserResponse.userCount > 0)
                {
                    var existUser = UserResponse.Users.Where(u => u.uid == uid).FirstOrDefault();
                    if (existUser == null)
                    {
                        result.IsSuccess = false;
                        result.Message = "user_id不存在";
                        return result;
                    }


                    //檢查通過
                    url = _config["IP"] + "/user/mod";

                    var data = new
                    {
                        uid = uid,
                        enabled = enabled
                    };

                    parameters = new Dictionary<string, string>
                      {
                            { "token", token },
                            { "data", JsonConvert.SerializeObject(data) }

                        };

                    apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
                    if (apiResult.IsSuccess)
                    {
                        var response = JsonConvert.DeserializeObject<Response>(apiResult.Data.ToString());
                        if (response.r == 0)
                        {
                            result.IsSuccess = true;
                            result.Message = "權限調整成功";
                            return result;
                        }

                    }

                    result.IsSuccess = false;
                    result.Message = "發生錯誤";
                    return result;


                }
                result.IsSuccess = false;
                result.Message = "發生錯誤";
                return result;

            }


            result.IsSuccess = false;
            result.Message = "發生錯誤";
            return result;
            #endregion



        }

        [HttpGet]

        public async Task<IActionResult> Logout()
        {

            await HttpContext.SignOutAsync();
            foreach (var cookieKey in Request.Cookies.Keys)
                HttpContext.Response.Cookies.Delete(cookieKey);
            return RedirectToAction(nameof(Login));

        }

    }
}