using IoT3D.Framework;
using IoT3D.Framework.DataModel;
using IoT3D.Framework.Unity;
using IoTCenter3D.UnityRpc;
using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

public class Login : MonoBehaviour
{
    RPCComponent rpc;
    public InputField server,user,password;
    public string WebAdress = "http://127.0.0.1:44381";
    // Start is called before the first frame update
    void Start()
    {
        //ȡRPC
        rpc = FindObjectOfType<RPCComponent>();
        //ĵ¼¼
        rpc.AddConcentListener(OnLoginCallback);
        //IoTCenter Web¼ַǷWebAPI
        //Ȩõһ https://127.0.0.1:44380  http://127.0.0.1:44381 ûЧ֤ʹhttpȻȨʧܡ
        PlayerPrefs.SetString("WebAdress", WebAdress);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    /// <summary>
    /// ¼IoTCenter
    /// </summary>
    public void OnLogin()
    {
        if (string.IsNullOrEmpty(server.text) || string.IsNullOrEmpty(user.text)||string.IsNullOrEmpty(password.text))
        {
            Debug.LogError("");
            return;
        }
        rpc.Login(server.text,user.text, IoTUtility.BuildSha512(password.text));
    }    
    /// <summary>
    /// ¼ص
    /// </summary>
    /// <param name="userTaken"></param>
    private void OnLoginCallback(UserTaken userTaken)
    {
        if(userTaken.succeeded)
        {
            Debug.LogError("¼ɹ");
           // gameObject.SetActive(false);
            OnRpcTest();
            return;
        }
        Debug.LogError("¼ʧܣ");
    }

    /// <summary>
    /// ӿʾ
    /// </summary>
    async void OnRpcTest()
    {
        //ȡWebAPIӿ
        // StartCoroutine(GetWebRequest("/IoT/api/v3/Auth/userinfo"));
        await Task.Delay(2000);
        //ȡ
        string sql = "select *from equip";
        List<EquipDataModel> equipTables = await RPCModule.Rpc.GetAsyncSQLData<List<EquipDataModel>>(sql);
        Debug.Log($"ȡ:{JsonConvert.SerializeObject(equipTables)}");

        //ȡ豸
        EquipBaseData equipData =  RPCModule.GetEquipDataItem(1);
        Debug.Log($"ȡ豸ݣ{JsonConvert.SerializeObject(equipData)}");

        //ȡң
        YcItemData ycItemData = RPCModule.GetYcItem(3,1);
        Debug.Log($"ȡңݣ{JsonConvert.SerializeObject(ycItemData)}");

        //ȡң
        YxItemData yxItemData = RPCModule.GetYxItem(3, 1);
        Debug.Log($"ȡңݣ{JsonConvert.SerializeObject(yxItemData)}");

        //ȡʷ

        List<DateTime> dateTimes = new List<DateTime> { DateTime.Now, DateTime.Now.AddDays(-1) };
        List<myCurveData> myCurves = await RPCModule.Rpc.GetDataFromCurveAsync(dateTimes, 3, 1);
        Debug.Log($"ȡʷݣ{JsonConvert.SerializeObject(myCurves)}");

        // ·豸
        //·޲
        //RPCModule.Rpc.SetParam(3,1);
        //·в
       // RPCModule.Rpc.SetParam(3,1,"0");

        // ƽ̨Ϣ
        RPCModule.Rpc.AddReceiveChanged(OnMessageReceive);

        //ȡƽ̨ʵʱϢ
        List<RealTimeEventItem> realTimeEvents = await RPCModule.Rpc.GetRealTimeEventListAsync();
        Debug.Log($"ȡƽ̨ʵʱϢ{JsonConvert.SerializeObject(realTimeEvents)}");
    }

    void OnMessageReceive(string message)
    {
        Debug.Log(message);
    }
    IEnumerator GetWebRequest(string url)
    {
        UnityWebRequest webRequest = UnityWebRequest.Get($"{WebAdress}{url}");
        webRequest.SetIoTRequestHeader();
        yield return webRequest.SendWebRequest();
        if(webRequest.result == UnityWebRequest.Result.Success)
        {
            Debug.Log(webRequest.downloadHandler.text);
        }
        else
        {
            Debug.LogWarning($"error{webRequest.error}");
        }
    }
   
}
public class EquipDataModel
{
    /// <summary>
    /// վ
    /// </summary>
    public string sta_n { get; set; }
    /// <summary>
    /// 豸
    /// </summary>
    public string equip_no { get; set; }

    /// <summary>
    /// 豸
    /// </summary>
    public string equip_nm { get; set; }

    /// <summary>
    /// ͨЭ
    /// </summary>
    public string equip_detail { get; set; }

    /// <summary>
    /// 
    /// </summary>
    public string proc_advice { get; set; }

}