using AdamSync;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

[Serializable]
public class FormationInfo
{
    public int groupIndex;
    public List<UnmannedAerialVehicleManage> uavms = new List<UnmannedAerialVehicleManage>();
}

/// <summary>
/// 编队控制脚本
/// </summary>
public class FormationManager : MonoSingleton<FormationManager>
{
    public Button startFormationBtn;
    public Button submitFormationBtn;
    public Button cancelFormationBtn;
    public Dropdown ungroup;
    public bool isStartFormation;
    public List<FormationInfo> formationInfos = new List<FormationInfo>();
    public FormationInfo formationInfo;
    public List<UnmannedAerialVehicleManage> allUavms = new List<UnmannedAerialVehicleManage>();
    public List<string> formationIDs = new List<string>();
    void Awake()
    {
        SyncCreateRoom.send2roomRequset += OnReciveMsg;
    }
    // Start is called before the first frame update
    void Start()
    {
        startFormationBtn.onClick.AddListener(OnStartFormation);
        submitFormationBtn.onClick.AddListener(OnSubmit);
        cancelFormationBtn.onClick.AddListener(OnCancel);
        ungroup.onValueChanged.AddListener((a) =>
        {
            string info = ungroup.options[a].text;
            int groupId = int.Parse(info.Replace("组", string.Empty));
            UngroupByGroupID(groupId);
            ungroup.options.Remove(ungroup.options[a]);
        });
        CheckBtns(0);
    }

    private void CheckBtns(int index)
    {
        startFormationBtn.gameObject.SetActive(index == 0);
        submitFormationBtn.gameObject.SetActive(index == 1);
        cancelFormationBtn.gameObject.SetActive(index == 1);
        if (formationInfos.Count > 0)
        {
            if (index == 1)
                ungroup.gameObject.SetActive(false);
            else
                ungroup.gameObject.SetActive(true);
        }
        else
        {
            ungroup.gameObject.SetActive(index == 2);
        }
    }

    // Update is called once per frame
    void Update()
    {
        if (isStartFormation)
        {
            if (Input.GetKey(KeyCode.LeftControl) && Input.GetMouseButtonDown(0))
            {
                if (EventSystem.current.IsPointerOverGameObject()) return;
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit hitInfo;
                if (Physics.Raycast(ray, out hitInfo, 1000))
                {
                    if (hitInfo.collider.gameObject.tag == "WRJ")
                    {
                        UnmannedAerialVehicleManage uavmTemp = hitInfo.collider.gameObject.GetComponent<UnmannedAerialVehicleManage>();
                        if (uavmTemp != null && !uavmTemp.isGroup)
                        {
                            if (!formationIDs.Contains(uavmTemp.equipmentCommon.deviceID))
                            {
                                formationIDs.Add(uavmTemp.equipmentCommon.deviceID);
                            }
                        }
                    }

                }
            }
        }
    }

    /// <summary>
    /// 解组
    /// </summary>
    private void OnUngroupDropdown()
    {
        ungroup.ClearOptions();
        List<Dropdown.OptionData> listTemp = new List<Dropdown.OptionData>();
        if (formationInfos.Count > 0)
        {
            for (int i = 0; i < formationInfos.Count; i++)
            {
                int index = i;
                Dropdown.OptionData optionData = new Dropdown.OptionData();
                optionData.text = $"组{formationInfos[index].groupIndex}";
                listTemp.Add(optionData);
            }
        }
        ungroup.AddOptions(listTemp);
    }
    /// <summary>
    /// 通过 dropdown 按钮 解组
    /// </summary>
    /// <param name="groupID"></param>
    private void UngroupByGroupID(int groupID)
    {
        List<UnmannedAerialVehicleManage> uavms = GroupUAVM(groupID);
        if (uavms.Count == 0) return;
        for (int i = 0; i < uavms.Count; i++)
        {
            int index = i;
            uavms[index].groupId = -1;
            uavms[index].isGroup = false;
            uavms[index].SetGroupTipsAndDatabaseInfo(-1);
            uavms[index].positions.Clear();
        }
        RemoveGroupWRJByID(groupID);
    }

    /// <summary>
    /// 设置组中得无人机所有航线
    /// </summary>
    public void SetUAVMGroupAirRoute(int uavmGroupID, Vector3 pos, DistanceMeasurement _airRoute)
    {
        List<UnmannedAerialVehicleManage> uavms = GroupUAVM(uavmGroupID);
        if (uavms.Count == 0) return;
        for (int j = 0; j < uavms.Count; j++)
        {
            if (!uavms[j].airRoute)
            {
                uavms[j].airRoute = _airRoute.gameObject;
                uavms[j].SetStartPos(_airRoute.PosPrefab);
            }
            uavms[j].positions.Enqueue(pos);
        }
    }
    /// <summary>
    /// 清除组内所有无人机得航线
    /// </summary>
    /// <param name="uavmGroupID"></param>
    public void RemoveUAMGroupAirRoute(int uavmGroupID)
    {
        List<UnmannedAerialVehicleManage> uavms = GroupUAVM(uavmGroupID);
        if (uavms.Count == 0) return;
        for (int j = 0; j < uavms.Count; j++)
        {
            uavms[j].positions.Clear();
        }
    }
    /// <summary>
    /// 设置组 航线设置
    /// </summary>
    public void SetGroupAttackByGroupID(int uavmGroupID, bool isOpen)
    {
        List<UnmannedAerialVehicleManage> uavms = GroupUAVM(uavmGroupID);
        if (uavms.Count == 0) return;
        for (int j = 0; j < uavms.Count; j++)
        {
            int index = j;
            if (isOpen)
            {
                uavms[index].RouteSettings();
                if (uavms[index].airRoute)
                    uavms[index].airRoute.transform.localScale = Vector3.one;
            }
            else
            {
                uavms[index].TurnOffCourseSettings();
                if (uavms[index].airRoute)
                    uavms[index].airRoute.transform.localScale = Vector3.zero;
            }
        }
    }

    /// <summary>
    /// 切换无人机状态
    /// </summary>
    /// <param name="uavmGroupID"></param>
    /// <param name="patternCut"></param>
    public void SetGroupUAVMState(int uavmGroupID, int patternCut)
    {
        List<UnmannedAerialVehicleManage> uavms = GroupUAVM(uavmGroupID);
        if (uavms.Count == 0) return;
        for (int j = 0; j < uavms.Count; j++)
        {
            uavms[j].modeSwitch(patternCut);
        }
    }
    /// <summary>
    /// 移除指定无人机
    /// </summary>
    /// <param name="uavm"></param>
    public void RemoveAppointWRJ(UnmannedAerialVehicleManage uavm)
    {
        List<UnmannedAerialVehicleManage> uavms = GroupUAVM(uavm.groupId);
        if (uavms.Count == 0) return;
        if (uavms.Contains(uavm))
            uavms.Remove(uavm);
        if (allUavms.Contains(uavm))
            allUavms.Remove(uavm);
        for (int j = 0; j < formationInfos.Count; j++)
        {
            if (formationInfos[j].uavms.Count == 0)
                formationInfos.Remove(formationInfos[j]);
        }
    }
    /// <summary>
    /// 通过ID 移除 无人机组
    /// </summary>
    /// <param name="groupID"></param>

    public void RemoveGroupWRJByID(int groupID)
    {
        for (int j = 0; j < formationInfos.Count; j++)
        {
            int index = j;
            if (formationInfos[index].groupIndex == groupID)
                formationInfos.Remove(formationInfos[index]);
        }
    }

    private List<UnmannedAerialVehicleManage> GroupUAVM(int uavmGroupID)
    {
        if (formationInfos.Count == 0) return null;
        List<UnmannedAerialVehicleManage> uavms = new List<UnmannedAerialVehicleManage>();
        for (int i = 0; i < formationInfos.Count; i++)
        {
            int indexI = i;
            if (formationInfos[indexI].groupIndex == uavmGroupID)
            {
                uavms = formationInfos[indexI].uavms;
            }
        }
        return uavms;
    }




    public void OnStartFormation()
    {
        isStartFormation = true;
        CheckBtns(1);
    }

    public void OnSubmit()
    {
        isStartFormation = false;

        string infoTemp = "";
        for (int i = 0; i < formationIDs.Count; i++)
        {
            infoTemp += formationIDs[i] + ",";
        }
        string id = CheckMissingNum().ToString();
        SendGroupToOther(id, infoTemp);
        formationIDs.Clear();
        CheckBtns(0);
        OnUngroupDropdown();
    }

    /// <summary>
    /// 检测ID数组中少哪些数组
    /// </summary>
    private int CheckMissingNum()
    {
        List<int> groupIDs = new List<int>();
        List<int> missingNum = new List<int>();
        for (int i = 0; i < formationInfos.Count; i++)
        {
            if (!groupIDs.Contains(formationInfos[i].groupIndex))
                groupIDs.Add(formationInfos[i].groupIndex);
        }
        if (groupIDs.Count > 0)
        {
            missingNum = FindMissingNumbers(groupIDs);
            if (missingNum.Count > 0)
                return missingNum[0];
            else
                return formationInfos.Count;
        }
        else
            return formationInfos.Count;
    }
    /// <summary>
    /// 计算int数组中缺少的数字
    /// </summary>
    /// <param name="numbers"></param>
    /// <returns></returns>
    private List<int> FindMissingNumbers(List<int> numbers)
    {
        List<int> missingNumbers = new List<int>();
        int[] temp = numbers.ToArray();
        Array.Sort(temp); // 对数组进行排序

        if (temp[0] != 0)
        {
            for (int i = 0; i < temp[0]; i++)
            {
                missingNumbers.Add(i);
            }
        }

        for (int i = 0; i < temp.Length - 1; i++)
        {
            if (temp[i + 1] - temp[i] > 1)
            {
                for (int j = temp[i] + 1; j < temp[i + 1]; j++)
                {
                    missingNumbers.Add(j);
                }
            }
        }
        return missingNumbers;
    }
    private char[] separators = { ',' }; // 设置分隔符为逗号
    public void OnReciveMsg(string reciveInfo)
    {
        Debug.Log($"<color=blue>{reciveInfo}</color>");
        List<UnmannedAerialVehicleManage> uavms = GetAllWRJ();

        var result = reciveInfo.Split(separators) // 对字符串进行切割操作
                           .Where(s => !String.IsNullOrWhiteSpace(s) && s != "") // 移除空白或者只包含空格的元素
                           .ToList();
        if (result.Count > 3)
        {
            if (result[0] == "group")
            {
                formationInfo = new FormationInfo();
                formationInfo.groupIndex = int.Parse(result[1]);
                for (int i = 2; i < result.Count; i++)
                {
                    for (int j = 0; j < uavms.Count; j++)
                    {
                        if (uavms[j].equipmentCommon.deviceID == result[i])
                        {
                            uavms[j].groupId = int.Parse(result[1]);
                            uavms[j].isGroup = true;
                            uavms[j].SetGroupTipsAndDatabaseInfo(int.Parse(result[1]));
                            formationInfo.uavms.Add(uavms[j]);
                        }
                    }
                }
                if (!formationInfos.Contains(formationInfo))
                    formationInfos.Add(formationInfo);
            }
        }

    }

    private void SetGroupInfo()
    {

    }
    /// <summary>
    /// 打组发送给别人
    /// </summary>
    private void SendGroupToOther(string groupIndex, string info)
    {
        string msg = $"send2room group,{groupIndex},{info}";
        _ = SyncCreateRoom.SendMessageAsync(msg);
        string localMsg = $"group,{groupIndex},{info}";
        OnReciveMsg(localMsg);
    }

    public void OnCancel()
    {
        formationInfo = null;
        CheckBtns(0);
    }

    public int wrjCount = 0;

    public List<UnmannedAerialVehicleManage> GetAllWRJ()
    {
        List<EquipmentCommon> equipList = DeviceManager.Instance.devices;
        List<UnmannedAerialVehicleManage> allUavmsTemp = new List<UnmannedAerialVehicleManage>();
        for (int i = 0; i < equipList.Count; i++)
        {
            int index = i;
            if (equipList[index] != null && equipList[index].gameObject.layer == 11 && equipList[index].GetComponent<UnmannedAerialVehicleManage>())
            {
                if (!allUavmsTemp.Contains(equipList[index].GetComponent<UnmannedAerialVehicleManage>()))
                {
                    allUavmsTemp.Add(equipList[index].GetComponent<UnmannedAerialVehicleManage>());
                }
            }
        }
        return allUavmsTemp;
    }

    /// <summary>
    /// 退出或者 掉线之后重新进入场景中, 动态添加已经生成得数据
    /// </summary>
    public void WhenSpawn()
    {
        allUavms = GetAllWRJ();

        foreach (var uam in allUavms)
        {
            if (uam.groupId != -1)
            {
                FormationInfo existingCategory = formationInfos.Find(tt => tt.groupIndex == uam.groupId);
                if (existingCategory != null)
                {
                    if (!existingCategory.uavms.Contains(uam))
                        existingCategory.uavms.Add(uam);
                }
                else
                {
                    FormationInfo newCategory = new FormationInfo { groupIndex = uam.groupId };
                    if (!newCategory.uavms.Contains(uam))
                        newCategory.uavms.Add(uam);
                    if (!formationInfos.Contains(newCategory))
                        formationInfos.Add(newCategory);
                }
            }
        }
        OnUngroupDropdown();
        CheckBtns(0);
    }

    private void OnDisable()
    {
        Debug.Log("OnDisable FormationManager");
        SyncCreateRoom.send2roomRequset -= OnReciveMsg;
    }


}