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

/// <summary>
/// Http Request SDK 
/// </summary>
public class HttpTool : MonoSingleton<HttpTool>
{

  //  private string baseUrl = "http://office.ghz-tech.com:3425/guideSystem";
    //private string baseUrl = "http://office.ghz-tech.com:9904/api";
    private string baseUrl = "https://nav21.ghz-tech.com:8843/api/";
    private string token = "";
    Dictionary<string, string> requestHeader = new Dictionary<string, string>();  //  header
    void Awake()
    {
        //http header 的内容
        requestHeader.Add("Content-Type", "application/json");

    }

    public string Token
    {
        get { return token; }
    }

    public string BaseUrl
    {
        get { return baseUrl; }
    }

    public Dictionary<string, string> RequestHeader
    {
        get { return requestHeader; }
    }

    public void Get(string baseUrl, string methodName, Action<string> callback)
    {
        StartCoroutine(GetRequestErnieBot(baseUrl, methodName, callback));
    }
    private IEnumerator GetRequestErnieBot(string baseUrl, string methodName, Action<string> callback)
    {
        string url = baseUrl + methodName;
        Debug.Log(url);
        using(UnityWebRequest webRequest = UnityWebRequest.Get(url))
        {
            webRequest.SetRequestHeader("authorization", token);
            //设置header
            foreach (var v in requestHeader)
            {
                webRequest.SetRequestHeader(v.Key, v.Value);
            }
            yield return webRequest.SendWebRequest();

            if (webRequest.isHttpError || webRequest.isNetworkError)
            {
                Debug.LogError(webRequest.error + "\n" + webRequest.downloadHandler.text);
                if (callback != null)
                {
                    callback(null);
                }
            }
            else
            {
                if (callback != null)
                {

                    callback(webRequest.downloadHandler.text);
                }
            }
        }

    }

    public void Get(string methodName, Action<string> callback)
    {
        StartCoroutine(GetRequest(methodName, callback));
    }
    private IEnumerator GetRequest(string methodName, Action<string> callback)
    {
        //   string url = Application.streamingAssetsPath + methodName;
        string url = baseUrl + methodName;
        Debug.Log(url);
        using (UnityWebRequest webRequest = UnityWebRequest.Get(url))
        {
            webRequest.SetRequestHeader("authorization", token);
            //设置header
            foreach (var v in requestHeader)
            {
                webRequest.SetRequestHeader(v.Key, v.Value);
            }
            yield return webRequest.SendWebRequest();

            if (webRequest.isHttpError || webRequest.isNetworkError)
            {
                Debug.LogError(webRequest.error + "\n" + webRequest.downloadHandler.text);
                if (callback != null)
                {
                    callback(null);
                }
            }
            else
            {
                if (callback != null)
                {

                    callback(webRequest.downloadHandler.text);
                }
            }
        }
    }

    public void PostTest(string methodName, string jsonString, Action<string> CallBack)
    {
        StartCoroutine(PostRequestTest(methodName, jsonString, CallBack));
    }
    private IEnumerator PostRequestTest(string methodName, string jsonString, Action<string> CallBack)
    {
        string url = baseUrl + methodName;
        Debug.Log(url + jsonString);

        using (UnityWebRequest webRequest = new UnityWebRequest(url, "POST"))
        {
            byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonString);
            webRequest.uploadHandler = (UploadHandler)new UploadHandlerRaw(bodyRaw);
            webRequest.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();

            webRequest.SetRequestHeader("authorization", token);
            foreach (var v in requestHeader)
            {
                webRequest.SetRequestHeader(v.Key, v.Value);
                Debug.Log(v.Value + "   " + methodName);
            }
            yield return webRequest.SendWebRequest();

            if (webRequest.isHttpError || webRequest.isNetworkError)
            {
                CallBack?.Invoke("UnityWebRequest Error");
                Debug.LogError(webRequest.error + "\n" + webRequest.downloadHandler.text + "\n" + methodName);
                //GameManager.Instance.text2.text = webRequest.error;
            }
            else
            {
                Debug.Log(webRequest.downloadHandler.text);
                CallBack(webRequest.downloadHandler.text);

            }
        }
    }

    public void PostSnInfo(string methodName, string jsonString, int index, Action<int, string> CallBack)
    {
        StartCoroutine(PostnInfoRequest(methodName, jsonString, index, CallBack));
    }
    public IEnumerator PostnInfoRequest(string methodName, string jsonString, int index, Action<int, string> CallBack)
    {
        string url = baseUrl + methodName;
        Debug.Log(url);

        using (UnityWebRequest webRequest = new UnityWebRequest(url, "POST"))
        {
            byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonString);
            webRequest.uploadHandler = (UploadHandler)new UploadHandlerRaw(bodyRaw);
            webRequest.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();

            webRequest.SetRequestHeader("authorization", token);
            foreach (var v in requestHeader)
            {
                webRequest.SetRequestHeader(v.Key, v.Value);
                Debug.Log(v.Value + "   " + methodName);
            }
            yield return webRequest.SendWebRequest();

            if (webRequest.isHttpError || webRequest.isNetworkError)
            {
                Debug.LogError(webRequest.error + "\n" + webRequest.downloadHandler.text + "\n" + methodName);
                //GameManager.Instance.text2.text = webRequest.error;
            }
            else
            {
                Debug.Log(webRequest.downloadHandler.text);
                CallBack(index, webRequest.downloadHandler.text);

            }
        }
    }

    public IEnumerator PostRequestSpoitDetail(string methodName, string jsonString, Action<string> CallBack)
    {
        string url = baseUrl + methodName;
        Debug.Log(url);

        using (UnityWebRequest webRequest = new UnityWebRequest(url, "POST"))
        {
            byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonString);
            webRequest.uploadHandler = (UploadHandler)new UploadHandlerRaw(bodyRaw);
            webRequest.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();

            webRequest.SetRequestHeader("authorization", token);
            foreach (var v in requestHeader)
            {
                webRequest.SetRequestHeader(v.Key, v.Value);
                Debug.Log(v.Value + "   " + methodName);
            }
            yield return webRequest.SendWebRequest();

            if (webRequest.isHttpError || webRequest.isNetworkError)
            {
                Debug.LogError(webRequest.error + "\n" + webRequest.downloadHandler.text + "\n" + methodName);
                //GameManager.Instance.text2.text = webRequest.error;
            }
            else
            {
                Debug.Log(webRequest.downloadHandler.text);
                CallBack(webRequest.downloadHandler.text);

            }
        }
    }


    public void Post(string methodName, string jsonString, Action<string> CallBack)
    {
        StartCoroutine(PostRequest(methodName, jsonString, CallBack));
    }

    // 
    private IEnumerator PostRequest(string methodName, string jsonString, Action<string> CallBack)
    {
        string url = baseUrl + methodName;
        //Debug.Log(url);

        using (UnityWebRequest webRequest = new UnityWebRequest(url, "POST"))
        {
            byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonString);
            webRequest.uploadHandler = (UploadHandler)new UploadHandlerRaw(bodyRaw);
            webRequest.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();

            webRequest.SetRequestHeader("authorization", token);
            foreach (var v in requestHeader)
            {
                webRequest.SetRequestHeader(v.Key, v.Value);
                //Debug.Log(v.Value + "   " + methodName);
            }
            yield return webRequest.SendWebRequest();

            if (webRequest.isHttpError || webRequest.isNetworkError)
            {
                Debug.LogError(webRequest.error + "\n" + webRequest.downloadHandler.text + "\n" + methodName);
                //GameManager.Instance.text2.text = webRequest.error;
            }
            else
            {
                //Debug.Log(webRequest.downloadHandler.text);
                CallBack(webRequest.downloadHandler.text);

            }
        }
    }

    public void GetAllMaterials(string methodName, string jsonString, Action<String> CallBack)
    {
        StartCoroutine(GetRequest(methodName, jsonString, CallBack));
    }
    private IEnumerator GetRequest(string methodName, string jsonString, Action<String> CallBack)
    {
        string url = baseUrl + methodName;
        Debug.Log(url);
        token = jsonString;
        HeadAddToken(token);
        using (UnityWebRequest webRequest = UnityWebRequest.Get(url))
        {
            webRequest.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
            webRequest.SetRequestHeader("authorization", jsonString);
            foreach (var v in requestHeader)
            {
                Debug.Log(v.Key + "    " + v.Value);
                webRequest.SetRequestHeader(v.Key, v.Value);
            }
            yield return webRequest.SendWebRequest();

            if (webRequest.isHttpError || webRequest.isNetworkError)
            {
                Debug.LogError(webRequest.error + "\n" + webRequest.downloadHandler.text);

            }
            else
            {
                Debug.Log(webRequest.downloadHandler.text);
                CallBack(webRequest.downloadHandler.text);
            }
        }
    }

    /// <summary>
    ///  登录 
    /// </summary>
    /// <param name="methodName"></param>
    /// <param name="jsonString"></param>
    /// <param name="CallBack"></param>
    public void PostLogin(string methodName, string jsonString, Action<string> CallBack)
    {
        StartCoroutine(PostRequestLogin(methodName, jsonString, CallBack));
    }
    private IEnumerator PostRequestLogin(string methodName, string jsonString, Action<string> CallBack)
    {
        string url = baseUrl + methodName;
        Debug.Log(url);

        using (UnityWebRequest webRequest = new UnityWebRequest(url, "POST"))
        {
            byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonString);
            webRequest.uploadHandler = (UploadHandler)new UploadHandlerRaw(bodyRaw);
            webRequest.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();

            foreach (var v in requestHeader)
            {
                webRequest.SetRequestHeader(v.Key, v.Value);
            }
            yield return webRequest.SendWebRequest();

            if (webRequest.isHttpError || webRequest.isNetworkError)
            {
                Debug.LogError(webRequest.error + "\n" + webRequest.downloadHandler.text);
                string error = webRequest.downloadHandler.text;
                JObject jObject = JObject.Parse(error);
                CallBack(jObject["message"].ToString());
            }
            else
            {
                Debug.Log(webRequest.downloadHandler.text);
                var mes = webRequest.downloadHandler.text;

                JObject obj = JObject.Parse(mes);
                if (obj["code"].ToString() == "200")
                {
                    //Debug.Log(obj["data"]["token"].ToString());
                    token = obj["data"]["token"].ToString();
                    Debug.Log(mes);
                }
                CallBack(mes);
            }
        }
    }


    ///// <summary>
    /////  获取本地Sprite
    ///// </summary>
    ///// <param name="mObj"></param>
    ///// <param name="CallBack"></param>
    //public void GetLocalSprite(DownLoadMaterial mObj, Action<DownLoadMaterial, object> CallBack)
    //{
    //    StartCoroutine(GetSpriteRequest(mObj, CallBack));
    //}

    //private IEnumerator GetSpriteRequest(DownLoadMaterial mObj, Action<DownLoadMaterial, object> CallBack)
    //{
    //    UnityWebRequest request = UnityWebRequestTexture.GetTexture(mObj.mObj.localSavePath);
    //    yield return request.SendWebRequest();
    //    if (request.isNetworkError || request.isHttpError)
    //    {
    //        Debug.LogError(request.error);
    //    }
    //    else
    //    {
    //        Texture2D texture = DownloadHandlerTexture.GetContent(request);
    //        Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero);
    //        CallBack(mObj, sprite);
    //        // LoadManager.Instance.DownLoadEnd(mObj, sprite);
    //    }
    //}


    public void HeadAddToken(string token)
    {
        requestHeader.Add("x-token", token);
    }

    public string GetMd5Hash(string strToEncrypt)
    {
        MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
        byte[] bytes = Encoding.ASCII.GetBytes(strToEncrypt);
        byte[] encoded = md5.ComputeHash(bytes);
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 10; i++)
        {
            sb.Append(encoded[i].ToString("x2"));
        }
        string password = sb.ToString();
        password = password.Substring(0, 10);
        return password;

    }
}