using LitJson;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.Android;
using uPLibrary.Networking.M2Mqtt.Messages;
using static QTTManager;

public class MQTTClient : MonoSingleton<MQTTClient>
{
    public string OnlineType = "online/";

    string password = null;// 需要根据服务器设置

    public static byte[] bytes;
   // public static byt ta;
    QTTManager qt;
    // Start is called before the first frame update
    void Start()
    {
        // 请求文件读取和写入权限
        if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead) ||
            !Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite))
        {
            Permission.RequestUserPermission(Permission.ExternalStorageRead);
            Permission.RequestUserPermission(Permission.ExternalStorageWrite);
        }
        bytes = (Resources.Load("emqxsl-ca") as TextAsset).bytes;
        
        Debug.Log(" DGJ  ===> emqxsl-ca.bytes "+ bytes.Length);
    }
    Queue<MqttMsgPublishEventArgs> rlist = new Queue<MqttMsgPublishEventArgs>();
    private void OnReceived(MqttMsgPublishEventArgs obj)
    {
        rlist.Enqueue(obj);


    }

    private void OnConnecting()
    {
        Debug.Log("MQtt  连接中");
    }

    private void onSucceed()
    {
        Subscribe();
    }



    private void onFaild()
    {
        Debug.Log("MQtt  连接失败");
    }

    // Update is called once per frame
    void Update()
    {
        if (rlist.Count > 0)
        {
            for (int i = 0; i < rlist.Count; i++)
            {
                OnUnityReceived(rlist.Dequeue());
            }
        }
    }
    //MQTT接收到的数据
    public void OnUnityReceived(MqttMsgPublishEventArgs obj)
    {
        string msg = Encoding.UTF8.GetString(obj.Message);
        Debug.Log("uid => " + obj.Topic + ":\n" + msg);
        try
        {
            JsonData data = JsonMapper.ToObject(msg);
            Debug.Log(" DGJ === > " + data["type"].ToString());
            switch (data["type"].ToString())
            {
                case "CamPos":
                    Debug.Log("DGJ   ===>  CamPos");
                    // 根据 uid  同步Player 位置  如果没有就创建
                    MultiPlayerManager.Instance.ReceivedCamPos(obj.Topic, data);
                    break;
                case "ActiveSp":

                    // 同步对应景点的开关
                    MultiPlayerManager.Instance.ReceivedActiveSp( data);

                    break;
                case "ActiveVideo":

                    // 同步播放器的对应状态
                    MultiPlayerManager.Instance.ReceivedActiveVideo(data);
                    break;

                default:
                    break;
            }

        }
        catch
        {
            return;
        }

    }

    private void OnDestroy()
    {
        DisConnect();
    }

    public string auth;

    public string topicPrefix;

    public string clientIdPrefix;

    public void setData(JsonData data)
    {
        //MQTTClinet  连接
        MQTTClient.Instance.SetUserName(data["auth"].ToString());
        MQTTClient.Instance.SetFront(data["topicPrefix"].ToString());
        clientIdPrefix = data["clientIdPrefix"].ToString();
    }

    public void PublicPosScene(string sid,string pos)
    {
        ;
        if (qt != null && qt.IsConnect())
        {
        //    Debug.Log("发送===》"+ "10001/realtime/project/" + sid+"_"+ pos);
            publish("10001/realtime/project/" + sid,Encoding.UTF8.GetBytes(pos));
        }
    }


    public void SubscribeScene(string sid)
    {

        Debug.Log(" DGJ   =====> 订阅 " + topicPrefix + sid);
        Debug.Log(" DGJ   =====> 订阅 " + topicPrefix + OnlineType + sid);
        ushort s = qt.Subscribe(
                        new string[]
                        {
                              topicPrefix+sid,
                              topicPrefix+OnlineType+sid
                        },
                        new byte[]
                        {

                                MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE,
                                MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE

                        });
    }


    public void SetUserName(string username)
    {
        if (auth != null)
            this.auth = username;
    }

    public void SetFront(string front)
    {
        if (topicPrefix != null)
            this.topicPrefix = front;
    }
    public string id;
    public string rid;
    //连接
    public void Connect()
    {
      
        Debug.Log("DGJ ===> MQTT ");
        if (DeviceType.type == "Phone")
        {
            id = UserInfo.Instance.Account + "_Phone";
            rid = clientIdPrefix+UserInfo.Instance.Account + "_Glasses";

        }
        else
        {
            id = UserInfo.Instance.Account + "_Glasses";
            rid = clientIdPrefix + UserInfo.Instance.Account + "_Phone";
        }
        DisConnect();
       
        Debug.Log("mqtturl=====》" + HttpAction.Instance.mqtturl+"_"+ HttpAction.Instance.officeport+ (Resources.Load("emqxsl-ca") as TextAsset).bytes.Length);
        qt = new QTTManager(topicPrefix+id, auth, password, HttpAction.Instance.mqtturl, HttpAction.Instance.officeport);
        qt.Connect();
        StartCoroutine(Reconnection());
        qt.ConnectionFailed -= onFaild;
        qt.ConnectionSucceeded -= onSucceed;
        qt.OnConnecting -= OnConnecting;
        qt.OnReceived -= OnReceived;
        qt.OnClose -= OnClose;
        qt.ConnectionFailed += onFaild;
        qt.ConnectionSucceeded += onSucceed;
        qt.OnConnecting += OnConnecting;
        qt.OnReceived += OnReceived;
        qt.OnClose += OnClose;
    }

    private void OnClose(EventArgs obj)
    {
        Debug.Log("断开连接");

        
    }

    private IEnumerator Reconnection()
    {
        while (true)
        {
            yield return new WaitForSeconds(5);
            if(qt!=null&&!qt.IsConnect())
            {
                Debug.Log(" DGJ ===>  Reconnection ");
                Connect();
            }         
        }
    }



    //断开连接
    public void DisConnect()
    {
        if (qt != null && qt.IsConnect())
            qt.DisConnect();

    }
    //订阅
    public void Subscribe()
    {
        Debug.Log(" DGJ   =====> Subscribe "+ id);
        ushort s = qt.Subscribe(
                        new string[]
                        {
                              topicPrefix+id

                        },
                        new byte[]
                        {
                                
                                MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE

                        });

        Debug.Log(" DGJ   =====> Subscribe2");
     
    }

    public void StartSendCameraPos()
    {
        StartCoroutine(sendCameraPos());
    }

    //眼镜端像手机端发送实时位置
    IEnumerator sendCameraPos()
    {
        Debug.Log("DGJ  =====>  sendCameraPos" + qt.IsConnect());
        while (true)
        {
            if(qt!=null&& qt.IsConnect())
            {
                JsonData json = new JsonData();
                json["type"] = "CamPos";
                //  json["x"] = OpenXRCamera.Instance.head.position.x;
                //json["y"] = OpenXRCamera.Instance.head.position.y;
                //json["z"] = OpenXRCamera.Instance.head.position.z;
                json["x"] = GameManager.Instance.Player.transform.localPosition.x;
                json["y"] = GameManager.Instance.Player.transform.localPosition.y;
                json["z"] = GameManager.Instance.Player.transform.localPosition.z;
                json["Sid"] = "sid";//选择的场景id
                publish(rid,Encoding.UTF8.GetBytes(json.ToJson()));
            }
           
            yield return new WaitForSeconds(0.1f);
        }
    }
    //眼镜发送触发的景点
    public void sendActiveSp(string spid,bool isOpen)
    {
        JsonData json = new JsonData();
        json["type"] = "ActiveSp";
        json["Sid"] = "sid";//选择的场景id
        json["spid"] = spid;//景点id
        json["isOpen"] = isOpen;//是否打开
        publish(rid,Encoding.UTF8.GetBytes(json.ToJson()));
        Debug.Log("MQtt  发送manage");
    }


    //眼镜发送触发的视频
    public void sendActiveVideo(string spid,string videoId, bool isplay,float jindu)
    {
        JsonData json = new JsonData();
        json["type"] = "ActiveVideo";
        json["Sid"] = "sid";//选择的场景id
        json["spid"] = spid;//景点id
        json["videoId"] = videoId;//视频id
        json["isplay"] = isplay;//是否播放
        json["jindu"] = jindu;//视频进度
        publish(rid,Encoding.UTF8.GetBytes(json.ToJson()));
        Debug.Log("MQtt  发送manage");
    }


    void publish(string str,byte[] bs)
    {
        if(qt!=null&& qt.IsConnect())
        {
           // Debug.Log(id + "  DGJ  publish =====>  " + front+rid + "   " + bs.Length);
            qt.Publish(str, bs, MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false);
        }
        else
        {
            Debug.LogError(" MQTT  未连接 ");
        }
     
    }
}