using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using LitJson;
//Author: SkyAllen Email: 894982165@qq.com Website: www.ytn0.com

namespace MPStudio
{
    public delegate void OnSuccess<T>(T response);
    public delegate void OnError(string error);

    
    [System.Serializable]
    public class TestGetData
    {
        public int keyCount;
        public int state;
    }

    [System.Serializable]
    public class TestPostMinData
    {
        public string message = "math first";
        public bool chiji = true;
        public float addCount = 5f;
    }

    [System.Serializable]
    public class TestPostData
    {
        public int tableIdx = 0;
        public int userId = 13;
        public TestPostMinData data = new TestPostMinData();
    }

    [System.Serializable]
    public class TestPostReceiveData
    {
        public int id = 3;
        public int state = 3;
    }

    namespace MPStudio
    {

        [DisallowMultipleComponent]
        [DefaultExecutionOrder(-1)]
        public class NetManager : MonoBehaviour
        {
            public string testGetUrl = "";
            public string testPostUrl = "";
            public static NetManager Inst { get; private set; }

            void Start()
            {
                if (Inst == null)
                {
                    Inst = this;
                }
                else if (Inst != this)
                {
                    Destroy(gameObject);
                }

                //test();

            }

            void test()
            {

                TestPostData data = new TestPostData();
                Post<TestPostData, TestPostReceiveData>(testPostUrl, data,
                    (obj) => { Debug.Log(obj.state + ":" + obj.id); }, (e) => { Debug.Log("err" + e); });


                Get<TestGetData>(testGetUrl, (obj) => { print(obj.keyCount + ":" + obj.state); },
                    (str) => { print("err" + str); });


            }

            // 发送 GET 请求（返回 JSON 对象）
            public void Get<T>(string url, OnSuccess<T> onSuccess, OnError onError)
            {
                StartCoroutine(GetRequestCoroutine(url, onSuccess, onError));
            }

            // 发送 POST 请求（发送和接收 JSON 对象）
            public void Post<TRequest, TResponse>(string url, TRequest requestData, OnSuccess<TResponse> onSuccess,
                OnError onError)
            {
                StartCoroutine(PostRequestCoroutine(url, requestData, onSuccess, onError));
            }

            // GET 协程
            private IEnumerator GetRequestCoroutine<T>(string url, OnSuccess<T> onSuccess, OnError onError)
            {
                using (UnityWebRequest request = UnityWebRequest.Get(url))
                {
                    yield return request.SendWebRequest();

                    if (request.result == UnityWebRequest.Result.Success)
                    {
                        try
                        {
                            // Debug.Log(request.downloadHandler.text);
                            T response = JsonMapper.ToObject<T>(request.downloadHandler.text);
                            onSuccess?.Invoke(response);
                        }
                        catch (Exception ex)
                        {
                            onError?.Invoke($"JSON Error: {ex.Message}");
                        }
                    }
                    else
                    {
                        onError?.Invoke($"Net Error: {request.error}");
                    }
                }
            }

            // POST 协程
            private IEnumerator PostRequestCoroutine<TRequest, TResponse>(
                string url, TRequest requestData, OnSuccess<TResponse> onSuccess, OnError onError)
            {
                string jsonData = JsonMapper.ToJson(requestData);
                byte[] postData = System.Text.Encoding.UTF8.GetBytes(jsonData);

                using (UnityWebRequest request = new UnityWebRequest(url, "POST"))
                {
                    request.uploadHandler = new UploadHandlerRaw(postData);
                    request.downloadHandler = new DownloadHandlerBuffer();
                    request.SetRequestHeader("Content-Type", "application/json");

                    yield return request.SendWebRequest();

                    if (request.result == UnityWebRequest.Result.Success)
                    {
                        try
                        {
                            TResponse response = JsonMapper.ToObject<TResponse>(request.downloadHandler.text);
                            onSuccess?.Invoke(response);
                        }
                        catch (Exception ex)
                        {
                            onError?.Invoke($"JSON Error: {ex.Message}");
                        }
                    }
                    else
                    {
                        onError?.Invoke($"Net Error: {request.error}");
                    }
                }
            }
        }
    }
}