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
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}");
            }
        }
    }
}
}