using System.Collections.Generic;
using UnityEngine;
using AdamThinkDevicesData;
using AdamSync;
using Newtonsoft.Json;
using static InterfaceManager;
using System.Collections;
using UnityEngine.Events;

/// <summary>
/// 设备
/// </summary>
public class EquipmentCommon : MonoBehaviour
{
    public EquipmentCommon equipmentCommon;
    /// <summary>
    /// 场景所在方
    /// </summary>
    public SelectedSide selectedSide = SelectedSide.Other;

    public string equipmentType = "";

    /// <summary>
    /// 设备唯一ID
    /// </summary>
    public string deviceID;
    /// <summary>
    /// 是否是本人创建的设备
    /// </summary>
    public bool isPlayer
    {
        get { return _isPlayer; }
        set
        {
            if (_isPlayer != value)
            {
                ISPlayer = value;
                _isPlayer = value;
                OnActivationIsPlayer?.Invoke(_isPlayer);
            }
        }
    }
    public bool ISPlayer;
    public event System.Action<bool> OnActivationIsPlayer;
    private bool _isPlayer = false;


    // 布尔值变化时触发的事件
    public event System.Action<bool> OnActivationChanged;


    private bool _isStartRehearsing = false;
    // 属性绑定布尔值,并在值变化时触发事件
    public bool isStartRehearsing
    {
        get { return _isStartRehearsing; }
        set
        {
            if (_isStartRehearsing != value)
            {
                _isStartRehearsing = value;
                OnActivationChanged?.Invoke(_isStartRehearsing);
            }
        }
    }
    /// <summary>
    /// 爆炸预制体
    /// </summary>
    public GameObject explodePrefab;

    public UnityAction<string> onDeviceDelete;

    void Awake()
    {
        equipmentCommon = GetComponent<EquipmentCommon>();
        DeviceManager.Instance.devices.Add(this);
        // 订阅布尔值变化事件
        OnActivationChanged += OnActivationChangedHandler;
        //
        OnActivationIsPlayer += OnActivationChangedIsPlayer;
    }
    void Start()
    {
        _isStartRehearsing = GlobalFlag.isStartRehearsing;
    }


    void OnActivationChangedIsPlayer(bool newValue)
    {
        if (newValue && equipmentType == "蜂群无人机")
        {

        }
    }
    /// <summary>
    /// 导条 暂停开始控制
    /// </summary>
    /// <param name="newValue"></param>
    void OnActivationChangedHandler(bool newValue)
    {
        switch (equipmentType)
        {
            case "激光火控平台":
                LaserFireControlPlatformManger laserFireControlPlatformManger = GetComponent<LaserFireControlPlatformManger>();
                laserFireControlPlatformManger.isStartRehearsing = isStartRehearsing;
                break;
            case "探测雷达":
                RadarManger radarManger = GetComponent<RadarManger>();
                radarManger.isStartRehearsing = isStartRehearsing;
                break;
            case "地面无线电干扰":
                TerrestrialRadioInterferenceManger terrestrialRadioInterferenceManger = GetComponent<TerrestrialRadioInterferenceManger>();
                terrestrialRadioInterferenceManger.isStartRehearsing = isStartRehearsing;
                break;
            case "蜂群无人机":
                UnmannedAerialVehicleManage unmannedAerialVehicleManage = GetComponent<UnmannedAerialVehicleManage>();
                unmannedAerialVehicleManage.isStartRehearsing = isStartRehearsing;
                break;
            case "频谱探测":
                Spectrumdetection spectrumdetection = GetComponent<Spectrumdetection>();
                spectrumdetection.isStartRehearsing = isStartRehearsing;
                break;
            case "微波武器":
                Microwaveweapon microwaveweapon = GetComponent<Microwaveweapon>();
                microwaveweapon.isStartRehearsing = isStartRehearsing;
                break;
            default:
                break;
        }
    }

    /// <summary>
    /// 物体生成时接受数据
    /// </summary>
    /// <param name="weaponitemone"></param>
    public void FillInTheData(List<List_paraItem> weaponitemone)
    {
        //向其他的单位发送创建信息
        if (isPlayer && equipmentCommon)//但是是由我自主创建的时候发送一次 且只发送一次
        {
            Dictionary<string, string> replaceInfoDic = new Dictionary<string, string>();
            string paraListJson = JsonConvert.SerializeObject(weaponitemone);
            replaceInfoDic.Add("PracticeId", GlobalFlag.roomID);
            replaceInfoDic.Add("PracticeSubjectId", GlobalFlag.practiceSubjectID);
            replaceInfoDic.Add("device_name", equipmentCommon.equipmentType);
            replaceInfoDic.Add("para_list", paraListJson);
            replaceInfoDic.Add("r1", $"{transform.position.x},{transform.position.y},{transform.position.z},{transform.eulerAngles.x},{transform.eulerAngles.y},{transform.eulerAngles.z}");
            if (gameObject.GetComponent<UnmannedAerialVehicleManage>())
                replaceInfoDic.Add("r2", ((int)gameObject.GetComponent<UnmannedAerialVehicleManage>().wrjModel).ToString());
            replaceInfoDic.Add("r3", GlobalFlag.currentUser.user_id);
            StartCoroutine(AsyncWebReq.PostData2(Url_AddDeviceAndGetDeviceId, replaceInfoDic, ResultsInfo =>
            {
                ReturnDeviceID returnID = JsonConvert.DeserializeObject<ReturnDeviceID>(ResultsInfo);
                deviceID = returnID.data;
                string msg = $"send2room {equipmentCommon.equipmentType},{transform.position.ToString().Replace(" ", "").Replace("(", "").Replace(")", "")},{transform.eulerAngles.ToString().Replace(" ", "").Replace("(", "").Replace(")", "") + "," + deviceID}";
                _ = SyncCreateRoom.SendMessageAsync(msg);
                UploadLog(deviceID);
            }));
        }

        //填入数据
        switch (equipmentType)
        {
            case "激光火控平台":
                LaserFireControlPlatformManger laserFireControlPlatformManger = GetComponent<LaserFireControlPlatformManger>();
                laserFireControlPlatformManger.FillInTheData(weaponitemone);
                //laserFireControlPlatformManger.isStartRehearsing = isStartRehearsing;
                break;
            case "探测雷达":
                RadarManger radarManger = GetComponent<RadarManger>();
                radarManger.FillInTheData(weaponitemone);
                radarManger.isStartRehearsing = isStartRehearsing;
                break;
            case "地面无线电干扰":
                TerrestrialRadioInterferenceManger terrestrialRadioInterferenceManger = GetComponent<TerrestrialRadioInterferenceManger>();
                terrestrialRadioInterferenceManger.FillInTheData(weaponitemone);
                terrestrialRadioInterferenceManger.isStartRehearsing = isStartRehearsing;

                break;
            case "蜂群无人机":
                UnmannedAerialVehicleManage unmannedAerialVehicleManage = GetComponent<UnmannedAerialVehicleManage>();
                unmannedAerialVehicleManage.MatrixFormation(30, 1);
                unmannedAerialVehicleManage.FillInTheData(weaponitemone);
                unmannedAerialVehicleManage.isStartRehearsing = isStartRehearsing;
                DroneViewDisplay.Instance.CreateUI(unmannedAerialVehicleManage, false);

                break;
            case "频谱探测":
                Spectrumdetection spectrumdetection = GetComponent<Spectrumdetection>();
                spectrumdetection.FillInTheData(weaponitemone);
                spectrumdetection.isStartRehearsing = isStartRehearsing;
                break;
            case "微波武器":
                Microwaveweapon microwaveweapon = GetComponent<Microwaveweapon>();
                microwaveweapon.FillInTheData(weaponitemone);
                microwaveweapon.isStartRehearsing = isStartRehearsing;
                break;
            default:
                break;
        }

    }

    /// <summary>
    ///上传日志
    /// </summary>
    /// <param name="deviceID"></param>
    public void UploadLog(string deviceID)
    {
        string currentTime = System.DateTime.Now.ToString();
        List<UploadLogMain> uploadLogMains = new List<UploadLogMain>();
        UploadLogMain uploadLogMain = new UploadLogMain();
        uploadLogMain.PracticeId = GlobalFlag.practiceSubjectID;
        uploadLogMain.ThinkId = GlobalFlag.currentThinkId;
        string log = currentTime + "  " + equipmentType + "(" + deviceID + ")" + "生成 ";
        uploadLogMain.log = log;
        uploadLogMains.Add(uploadLogMain);
        string uploadLogMainJson = JsonConvert.SerializeObject(uploadLogMains);
        WWWForm wWWForm = new WWWForm();
        wWWForm.AddField("data", uploadLogMainJson);
        //Debug.Log(uploadLogMainJson);
        StartCoroutine(PostString(Url_Addpracticelog, wWWForm, data =>
        {
            //Debug.Log(data);
        }));
    }


    /// <summary>
    /// 已有路径
    /// </summary>
    public Queue<Vector3> positions = new Queue<Vector3>();
    private void Update()
    {
        StartMoveObjectAlongPath();
    }

    public bool isMove = true;
    /// <summary>
    /// 按规划路径开始移动
    /// </summary>
    public void StartMoveObjectAlongPath()
    {
        if (isMove && positions.Count > 0)
        {
            isMove = false;
            Vector3 _positions = positions.Dequeue();
            UnmannedAerialVehicleManage unmannedAerialVehicleManage = GetComponent<UnmannedAerialVehicleManage>();
            if (unmannedAerialVehicleManage)
                StartCoroutine(unmannedAerialVehicleManage.MoveObjectAlongPath(_positions, true)); // 启动协程,按规划的路线移动物体
        }
    }




    /// <summary>
    /// 设备交互同步消息接收
    /// </summary>
    /// <param name="data"></param>
    public void ReceivingPositionAngle(string[] data)
    {
        switch (data[0])
        {
            case "DronePosition"://无人机位置信息传递
                Vector3 pos = new Vector3(float.Parse(data[2]), float.Parse(data[3]), float.Parse(data[4]));
                positions.Enqueue(pos);
                break;
            case "Lasing"://激光发射位置传递
                LaserFireControlPlatformManger laserFireControlPlatformManger = GetComponent<LaserFireControlPlatformManger>();
                if (laserFireControlPlatformManger)
                    laserFireControlPlatformManger.NonSelfGeneratedEmissionLaser(data);
                break;
            case "Micow"://微波武器发射位置
                Microwaveweapon microwaveweapon = GetComponent<Microwaveweapon>();
                if (microwaveweapon)
                {
                    microwaveweapon.Microwavetransmission(data);
                }
                break;
            case "SingleDronePosition"://无人机攻击目标锁定
                Debug.Log("接受...:" + data[0] + "," + data[1] + "," + data[2] + "," + data[3] + "," + data[4]);
                UnmannedAerialVehicleManage unmannedAerialVehicleManage = GetComponent<UnmannedAerialVehicleManage>();
                if (unmannedAerialVehicleManage && unmannedAerialVehicleManage.wrjModel == WRJModel.自杀式无人机)
                {
                    for (int i = 0; i < unmannedAerialVehicleManage.unmannedAerialVehicles.Count; i++)
                    {
                        if (unmannedAerialVehicleManage.unmannedAerialVehicles[i])
                        {
                            Vector3 Pos = new Vector3(float.Parse(data[2]), float.Parse(data[3]), float.Parse(data[4]));
                            unmannedAerialVehicleManage.unmannedAerialVehicles[i].AttAck(Pos);
                        }
                    }
                }
                break;
            case "WRJExpel"://驱离无人机
                UnmannedAerialVehicleManage unmannedAerialVehicleManageExpel = GetComponent<UnmannedAerialVehicleManage>();
                if (unmannedAerialVehicleManageExpel)
                {
                    unmannedAerialVehicleManageExpel.CheckSatellitePositioningFrequency(data[2]);
                }
                break;
            case "DroneWasDestroyed"://单个无人机被销毁
                UnmannedAerialVehicleManage _unmannedAerialVehicleManage = GetComponent<UnmannedAerialVehicleManage>();
                if (_unmannedAerialVehicleManage)
                {
                    UnmannedAerialVehicle unmannedAerialVehicle = _unmannedAerialVehicleManage.unmannedAerialVehicles.Find(x => x.serialNumber == data[2]);
                    if (unmannedAerialVehicle)
                    {
                        unmannedAerialVehicle.AddBao(false);
                    }
                }
                break;
            case "WRJDitch"://
                UnmannedAerialVehicleManage _unmannedAerialVehicleManageDitch = GetComponent<UnmannedAerialVehicleManage>();
                if (_unmannedAerialVehicleManageDitch)
                {
                    UnmannedAerialVehicle unmannedAerialVehicle = _unmannedAerialVehicleManageDitch.unmannedAerialVehicles.Find(x => x.serialNumber == data[2]);
                    if (unmannedAerialVehicle)
                    {
                        unmannedAerialVehicle.CheckSatellitePositioningFrequency(data[3]);
                    }
                }
                break;
            case "Planedata":
                UnmannedAerialVehicleManage unmannedAerialVehicleManage1 = GetComponent<UnmannedAerialVehicleManage>();
                if (unmannedAerialVehicleManage1)
                {
                    UnmannedAerialVehicle unmannedAerialVehicle = unmannedAerialVehicleManage1.unmannedAerialVehicles.Find(x => x.serialNumber == data[2]);
                    if (unmannedAerialVehicle)
                    {
                        StartCoroutine(UnmannedAerialVehicleAddBao(unmannedAerialVehicle));
                    }
                }
                break;
            case "SetToBeDestroyed"://设备被销毁
                onDeviceDelete?.Invoke(deviceID);
                DroneViewDisplay.Instance.DistroyUI(deviceID);
                GameObject Bao = Instantiate(explodePrefab, transform);
                Bao.transform.localPosition = Vector3.zero;
                Bao.transform.SetParent(null);
                Bao.SetActive(true);
                Destroy(transform.gameObject);
                break;
            case "SetToBeDestroyedTwo"://设备被收回
                onDeviceDelete?.Invoke(deviceID);
                Destroy(transform.gameObject);
                break;
            default:
                break;
        }
    }

    IEnumerator UnmannedAerialVehicleAddBao(UnmannedAerialVehicle unmannedAerialVehicle)
    {
        yield return new WaitForSeconds(0.6f);
        unmannedAerialVehicle.AddBao(false);
    }

    private void OnDestroy()
    {
        // 订阅布尔值变化事件
        OnActivationChanged -= OnActivationChangedHandler;
        //
        OnActivationIsPlayer -= OnActivationChangedIsPlayer;
    }
}

public enum SelectedSide
{
    Rad,
    Blue,
    Director,
    Other
}