using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Cysharp.Threading.Tasks;
using DefaultNamespace;
using DG.Tweening;
using Newtonsoft.Json;
using UnityEngine;

public class MqttManager : MonoSingleton<MqttManager>
{
    /// <summary>
    /// 所有设备的请求头
    /// </summary>
    public List<Allequipment> devices = new List<Allequipment>();
    /// <summary>
    /// 换电池装置
    /// </summary>
    public List<Qcbd> qcbdequipments = new List<Qcbd>();
    /// <summary>
    /// 查询提升机
    /// </summary>
    public List<Elvequipment> elvequipments = new List<Elvequipment>();
    /// <summary>
    /// 拆码垛机
    /// </summary>
    public List<Dpmequipment> dpmequipments = new List<Dpmequipment>();
    /// <summary>
    /// 输送机设备
    /// </summary>
    public List<Convoyorequipment> convoyorequipments = new List<Convoyorequipment>();
    /// <summary>
    /// 输入机设备
    /// </summary>
    public List<Convoyorequipment> exportations = new List<Convoyorequipment>();
    /// <summary>
    /// 小车设备
    /// </summary>
    public List<Carequipment> carequipments = new List<Carequipment>();
    /// <summary>
    /// 查询式落地机
    /// </summary>
    public List<Feequipment> feequipments = new List<Feequipment>();
    /// <summary>
    /// 查训加去盖信息
    /// </summary>
    public List<Cmequipment> cmequipments = new List<Cmequipment>();
    /// <summary>
    /// 消息队列
    /// </summary>
    public ConcurrentQueue<string> messageQueue = new ConcurrentQueue<string>();
    /// <summary>
    /// 第一层箱子
    /// </summary>
    public List<GameObject> firstbox = new List<GameObject>();
    /// <summary>
    /// 第二层箱子
    /// </summary>
    public List<GameObject> secondbox = new List<GameObject>();
    /// <summary>
    /// 小车位移的速度
    /// </summary>
    public float speed = 5f;
    [Obsolete]
    private void Awake()
    {
        //启动MQTT连接
        Application.ExternalCall("OpenHtmlMQTT");


        ProcessQueue().Forget();
    }
    private void Start()
    {

    }
    /// <summary>
    /// 接受MQTT消息
    /// </summary>
    /// <param name="message"></param>
    public void Message(string message)
    {
        // Debug.Log($"接收到的MQTT消息---->{message}");
        messageQueue.Enqueue(message); // 将消息存入队列

    }
    private async UniTaskVoid ProcessQueue()
    {
        while (true)
        {
            if (messageQueue.TryDequeue(out string message))
            {
                // 处理消息
                Debug.Log($"剩余:{messageQueue.Count}条数据,取数据-----> {message}");
                //await UniTask.Delay(10);
                Allequipment str = JsonConvert.DeserializeObject<Allequipment>(message);
                //Debug.Log("获取到了数据");
                //Debug.Log(str.device + " " + str.message);
                devices.Add(str);
                string data = str.device.Substring(0, 2);
                switch (data)
                {
                    case "qc":
                        Qcbd qcbd = JsonConvert.DeserializeObject<Qcbd>(str.message);
                        qcbdequipments.Add(qcbd);

                        break;
                    case "el":
                        Elvequipment elvequipment = JsonConvert.DeserializeObject<Elvequipment>(str.message);
                        elvequipments.Add(elvequipment);

                        break;
                    case "dp":
                        Dpmequipment dpmequipment = JsonConvert.DeserializeObject<Dpmequipment>(str.message);
                        dpmequipments.Add(dpmequipment);

                        break;
                    case "co":
                        Convoyorequipment convoyorequipment = JsonConvert.DeserializeObject<Convoyorequipment>(str.message);
                        string con = convoyorequipment.Id.Substring(0, 2);
                        //Debug.Log(con);
                        if (con == "54")
                        {
                            convoyorequipments.Add(convoyorequipment);
                        }
                        else
                        {
                            exportations.Add(convoyorequipment);
                        }
                        break;
                    case "ca":
                        Carequipment carequipment = JsonConvert.DeserializeObject<Carequipment>(str.message);
                        string carname = str.device;
                        GameObject cargame = GameObject.Find(carname);
                        Carpoint(cargame, carequipment);
                        break;
                    case "fe":
                        Feequipment feequipment = JsonConvert.DeserializeObject<Feequipment>(str.message);
                        feequipments.Add(feequipment);
                        break;
                    case "cm":
                        Cmequipment cmequipment = JsonConvert.DeserializeObject<Cmequipment>(str.message);
                        cmequipments.Add(cmequipment);
                        break;
                    default:
                        break;
                }
                await UniTask.Delay(10);
            }
            else
            {
                Debug.Log("等待数据");
                await UniTask.Delay(1000);
            }
        }
    }
    public void Carpoint(GameObject car, Carequipment carequipment)
    {
        Debug.Log(carequipment.id);
        if (car)
        {
            Carinformation carbox = car.GetComponent<Carinformation>();
            carbox.BoxCode = carequipment.CarState_BoxCode;
            string point = carequipment.CarState_Car_Column + "-" + carequipment.CarState_Car_Row + "-" + carequipment.CarState_Car_Layer;

            GameObject displacement = GameObject.Find(point);
            //car.transform.DOMove(displacement.transform.position, Vector3.Distance(car.transform.position, displacement.transform.position) / speed).SetEase(Ease.InOutQuad);
            Designateddisplacement(car, displacement.transform.position, speed);
            if (carequipment.CarState_CarPlt == "上升")
            {
                BoxCollider cars = car.GetComponent<BoxCollider>();
                cars.enabled = true;
            }
            else if (carequipment.CarState_CarPlt == "下降")
            {
                //BoxCollider cars = car.GetComponent<BoxCollider>();
                //cars.enabled = true;
                GameObject box = car.transform.GetChild(0).gameObject;
                float dis = box.transform.position.y - 0.3f;
                box.transform.DOMoveY(dis, 0.2f).SetEase(Ease.OutQuad);
                car.transform.SetParent(null);
            }
            else
            {
                BoxCollider cars = car.GetComponent<BoxCollider>();
                cars.enabled = false;
            }
        }
    }
    /// <summary>
    /// 需要位移的地方
    /// </summary>
    /// <param name="car">小车</param>
    /// <param name="dis">位移到指定位置</param>
    /// <param name="speed">位移的速度</param>
    public void Designateddisplacement(GameObject car, Vector3 dis, float speed)
    {
        float times = Vector3.Distance(car.transform.position, dis) / speed;
        car.transform.DOMove(dis, times).SetEase(Ease.InOutQuad);
    }
}