using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using Models;
using SERVER;
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Newtonsoft.Json;
using SERVER.LIB;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using COMMON;
using System.Linq;

namespace WebUI.Controllers
{
    [AllowAnonymous]
    public class LoginController : Controller
    {
        protected readonly IHttpContextAccessor _httpContextAccessor;
      


        public LoginController(IHttpContextAccessor httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;

        }

        [HttpPost]
        public IActionResult LSH_TEST(string REURL = "")
        {
            Random random = new Random();
            ViewBag.ReURL = REURL;
            return View();
        }


        [HttpGet]
        public IActionResult Index(string REURL = "")
        {
            ViewBag.ReURL = REURL;
            return View();
        }



        [HttpPost]
        public IActionResult Logon(string userName, string pwd)
        {
            if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(pwd))
            {
                //内网地址就 传空值
                string ipaddress = _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString();
                string UserAgent = _httpContextAccessor.HttpContext.Request.Headers["User-Agent"];

                var res = SYNC_DATA.SYNC_GetUserinfo(ipaddress, UserAgent, userName, pwd);
                if (res.Status == 200)
                {
                    string keys = res.Data.Userinfo.Uid;
                    //+ DateTime.Now.ToString("yyyyMMddhmmssfff") + UtilsSharp.RandomHelper.NumberAndLetters(5);

                    if (ConfigEntity.Instance.IsMore == false && XC_Redis.Redis.IsExists(keys))
                    {
                        return Json(new ReturnData<string> { IsSuccess = false, Result = "已经在其他地方登录~" });
                    }

                    var claims = new[]
                    {
                        new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}") ,
                        new Claim (JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(DateTime.Now.AddMinutes(30)).ToUnixTimeSeconds()}"),
                        new Claim(ClaimTypes.Name,keys)
                    };

                    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(JwtConst.Instance.SecurityKey));
                    var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
                    var token = new JwtSecurityToken(
                        issuer: JwtConst.Instance.Domain,
                        audience: JwtConst.Instance.Domain,
                        claims: claims,
                        expires: DateTime.Now.AddMinutes(20),
                        signingCredentials: creds);
                    var RES = new ReturnData<string> { IsSuccess = true };
                    string toke = new JwtSecurityTokenHandler().WriteToken(token);
                    HttpContext.Response.Cookies.Append("CurrentUser", toke);
                   // 权限信息  同一用户 不用地点登录 共享 最后登录会更新该数据
                    XC_Redis.Redis.SetKey(keys, res.Data, 20);

                    int[] rom = {
                        new Random(int.Parse(UtilsSharp.RandomHelper.Number(4))).Next(0, toke.Length),
                        new Random(int.Parse(UtilsSharp.RandomHelper.Number(4))).Next(0, toke.Length),
                        new Random(int.Parse(UtilsSharp.RandomHelper.Number(4))).Next(0, toke.Length),
                        new Random(int.Parse(UtilsSharp.RandomHelper.Number(4))).Next(0, toke.Length),
                    };

                    // 当前会话用户的 标识   同账号不同地点登录区别使用  用户名 加 token 后7未
                    XC_Redis.Redis.SetKey(keys + toke.Substring(toke.Length-8) + "_rom", rom, 20);

                    foreach (var item in rom)
                    {
                        keys += toke[item];
                    }
                    return Json(RES);
                }
                else
                {
                    return Json(new ReturnData<string> { IsSuccess = false, Result = null });
                }
            }
            else
            {
                return Json(new ReturnData<string> { IsSuccess = false, Result = null });
            }
        }

       
    }
}
