
using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;

namespace IoT3D.Framework
{
    public static class IoTUtility
    {
        static string httpVersion;
        static string domain;
        static string httpPort;
        static string token;
        static bool Inited = false;
        static string ipAdress;
        static SSOData ssoData;

        public static string IpAdress { get => ipAdress; }
        public static string HttpVersion { get => httpVersion; }
        public static string Domain { get => domain; }
        public static string HttpPort { get => httpPort; }
        public static string Token { get => token; }

        //ޱ߿ /ganwei-iotcenter-equip-lists/#/equipListsIot
        //б߿ /#/Index/jumpIframe/ganwei-iotcenter-equip-lists/equipListsIot
        public static string GetSSOURL(string url)
        {
            if (!Inited)
            {
                Debug.LogError("SSOʼδɣ");
                return null;
            }
            return $"{HttpVersion}://{Domain}:{HttpPort}/ganwei-iotcenter-login/#/ssoLogin?{new InternalSSOModel { Token = Token, TimeStamp = (long)DateTime.Now.Subtract(new System.DateTime(1970, 1, 1)).TotalSeconds }.ToString()}&url={url}";
            //return $"{HttpVersion}://{Domain}:{HttpPort}/#/jumpIframeLogin/ganwei-iotcenter-login/ssoLogin?{new InternalSSOModel { Token = Token, TimeStamp = (long)DateTime.Now.Subtract(new System.DateTime(1970, 1, 1)).TotalSeconds }.ToString()}&url={UrlEncode(url)}";
        }
        static string UrlEncode(string str)
        {
            StringBuilder sb = new();
            byte[] byStr = System.Text.Encoding.UTF8.GetBytes(str); //ĬSystem.Text.Encoding.Default.GetBytes(str)
            for (int i = 0; i < byStr.Length; i++)
            {
                sb.Append(@"%" + Convert.ToString(byStr[i], 16));
            }
            return (sb.ToString());
        }
        public static void InitSSO(string _token)
        {
            ipAdress = PlayerPrefs.GetString("WebAdress");
            if (string.IsNullOrEmpty(ipAdress))
            {
                Debug.LogWarning("WebַδûǷ");
                return;
            }
            string[] urls = ipAdress.Split(':');
            if (urls.Length == 0)
            {
                Debug.LogWarning("WebַǷ");
                return;
            }

            httpVersion = urls[0];
            domain = urls[1].Substring(2);
            httpPort = urls[2];
            token = _token;
            Inited = true;
        }

        public static void SetWebSSO(SSOData data)
        {
            ssoData = data;
        }
        public static void SetIoTRequestHeader(this UnityWebRequest unityWebRequest)
        {
            if (ssoData != null)
            {
                unityWebRequest.SetRequestHeader("Authorization", "Bearer " + ssoData.accessToken);
            }
        }
        public static void SetRequestHeader(this UnityWebRequest unityWebRequest)
        {
            if (ssoData != null)
            {
                unityWebRequest.SetRequestHeader("Authorization", "Bearer " + ssoData.accessToken);
                unityWebRequest.SetRequestHeader("Xsrf-Token", ssoData.accessToken);
            }
        }
        public static string BuildSha512(string pwd)
        {
            byte[] buffer = Encoding.UTF8.GetBytes(pwd);
            SHA512CryptoServiceProvider SHA512 = new SHA512CryptoServiceProvider();
            byte[] h5 = SHA512.ComputeHash(buffer);
            string result = BitConverter.ToString(h5).Replace("-", string.Empty);
            return result.ToLower();
        }
    }
    public class InternalSSOModel
    {
        private string nonce;
        public InternalSSOModel()
        {
            nonce = Guid.NewGuid().ToString("N");
        }
        /// <summary>
        /// ƾ
        /// </summary>
        public string Token { get; set; }
        /// <summary>
        /// ʱ
        /// </summary>
        public long TimeStamp { get; set; }
        /// <summary>
        /// id
        /// </summary>
        public string ConnectId { get; set; }

        /// <summary>
        /// αֵ
        /// </summary>
        public string Nonce
        {
            get
            {
                return nonce;
            }
        }
        /// <summary>
        /// ǩ
        /// </summary>
        public string Sign
        {
            get
            {
                var sortDictionary = new SortedDictionary<string, object>
                {
                    { nameof(Token), Token },
                    { nameof(TimeStamp), TimeStamp },
                    { nameof(Nonce), Nonce }
                };
                var parameters = string.Join("&", sortDictionary.Select(d => $"{d.Key}={d.Value}"));
                return SHA512Encrypt(parameters);
            }
        }

        public override string ToString()
        {
            return $"token={Token}&timestamp={TimeStamp}&nonce={Nonce}&sign={Sign}";
        }
        /// <summary>
        /// SHA512
        /// </summary>
        public string SHA512Encrypt(string str)
        {
            byte[] bytValue = Encoding.UTF8.GetBytes(str);
            try
            {
                using (SHA512 sha512 = SHA512.Create())
                {
                    byte[] retVal = sha512.ComputeHash(bytValue);
                    StringBuilder sb = new StringBuilder();
                    foreach (byte b in retVal)
                    {
                        sb.AppendFormat("{0:x2}", b);
                    }
                    return sb.ToString();
                }
            }
            catch (Exception ex)
            {
                return null;
            }
        }
    }
    [System.Serializable]
    public class ResponsesData
    {
        public SSOData data;
        public int code;
        public string message;
        public bool succeeded;
    }

    [System.Serializable]
    public class SSOData
    {
        public int code;
        public string roleName;
        public bool isSingleSignOn;
        public string userName;
        public string IotToken;
        public string xsrfToken;
        public string accessToken;
    }
}

