using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 单个无人机蜂群控制
/// </summary>
public class UnmannedAerialVehicleManage : MonoBehaviour
{
    
    /// <summary>
    /// 状态
    /// </summary>
    public Pattern pattern = Pattern.待机;
    /// <summary>
    /// 是否正在预演
    /// </summary>
    public bool isStartRehearsing = false;

    /// <summary>
    /// 测试用
    /// </summary>
    public string msg;
    /// <summary>
    /// 测试接受数据
    /// </summary>
    private List<Weaponitem> weaponitems;

    private Weaponitemone weaponitemones;
   
    /// <summary>
    /// 无人机预制体
    /// </summary>
    public GameObject UAVPrefab;
    /// <summary>
    /// 编队无人机数量
    /// </summary>
    public int totalObjects = 30; // 总共的物体数量
    /// <summary>
    /// 所有子物体无人机
    /// </summary>
    public List<UnmannedAerialVehicle> unmannedAerialVehicles = new List<UnmannedAerialVehicle>();

    /// <summary>
    /// 线预制体
    /// </summary>
    public GameObject LinePrefab;
    /// <summary>
    /// 航线
    /// </summary>
    public GameObject airRoute;
    #region  无人机数据
    /// <summary>
    /// 续航时间
    /// </summary>
    public string batteryLife;
    /// <summary>
    /// 抗风等级
    /// </summary>
    public string classificationWindResistance;
    /// <summary>
    /// 最大飞行速度
    /// </summary>
    public string maximumFlyingSpeed;
    /// <summary>
    /// RCS
    /// </summary>
    public string RCS;
    /// <summary>
    /// 卫星定位频点
    /// </summary>
    public string satellitePositioningFrequency;
    /// <summary>
    /// 数据链通信频点
    /// </summary>
    public string dataLinkCommunicationFrequency;
    /// <summary>
    /// 电子侦察能力
    /// </summary>
    public string electronicReconnaissanceCapability;
    /// <summary>
    /// 光学侦察能力
    /// </summary>
    public string opticalReconnaissanceCapability;

    #endregion
    // Start is called before the first frame update
    void Start()
    {
        //Weaponitem weaponitem;
        //weaponitem = Newtonsoft.Json.JsonConvert.DeserializeObject<Weaponitem>(msg);
        //weaponitems.Add(weaponitem);
        weaponitemones= Newtonsoft.Json.JsonConvert.DeserializeObject<Weaponitemone>(msg);
        FillInTheData(weaponitemones);//测试写入
        Formation(1);//默认阵型
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.V))
        {
           
        }
    }

    /// <summary>
    /// 模式切换
    /// </summary>
    public void modeSwitch(int patternCut)
    {
        switch (patternCut) {
            case 0://待机
                pattern = Pattern.待机;
                break;
            case 1:
                pattern = Pattern.警戒;
                break;
            case 2:
                pattern = Pattern.攻击;
                ObjectPlanner objectPlanner = airRoute.GetComponent<ObjectPlanner>();
                if (objectPlanner)
                {
                    objectPlanner.StartMoveObjectAlongPath();
                }
                break;
            default:
                break;
        }

    }

    #region 数据写入
    /// <summary>
    /// 数据写入
    /// </summary>
    /// <param name="weaponitemone"></param>
    public void FillInTheData(Weaponitemone weaponitemone)
    {
        for(int i=0;i< weaponitemone.data.Count; i++)
        {
            switch (weaponitemone.data[i].para_name) {
                case "续航时间:":
                    batteryLife = weaponitemone.data[i].para_value;
                    break;
                case "抗风等级:":
                    classificationWindResistance = weaponitemone.data[i].para_value;
                    break;
                case "最大飞行速度:":
                    maximumFlyingSpeed = weaponitemone.data[i].para_value;
                    break;
                case "RCS:":
                    RCS = weaponitemone.data[i].para_value;
                    break;
                case "卫星定位频点:":
                    satellitePositioningFrequency = weaponitemone.data[i].para_value;
                    break;
                case "数据链通信频点:":
                    dataLinkCommunicationFrequency = weaponitemone.data[i].para_value;
                    break;
                case "电子侦察能力:":
                    electronicReconnaissanceCapability = weaponitemone.data[i].para_value;
                    break;
                case "光学侦察能力:":
                    opticalReconnaissanceCapability = weaponitemone.data[i].para_value;
                    break;
                default:
                    break;
            }
            if(i== (weaponitemone.data.Count - 1))
            {
                StartCoroutine(WeaponitemoneDataAddition());
            }
        }
    }

    /// <summary>
    /// 单个无人机数据写入
    /// </summary>
    /// <returns></returns>
    IEnumerator WeaponitemoneDataAddition()
    {
        yield return new WaitForSeconds(0.1f);
        for(int i=0;i< unmannedAerialVehicles.Count; i++)
        {
            unmannedAerialVehicles[i].batteryLife = batteryLife;
            unmannedAerialVehicles[i].classificationWindResistance = classificationWindResistance;
            unmannedAerialVehicles[i].maximumFlyingSpeed = maximumFlyingSpeed;
            unmannedAerialVehicles[i].RCS = RCS;
            unmannedAerialVehicles[i].satellitePositioningFrequency = satellitePositioningFrequency;
            unmannedAerialVehicles[i].dataLinkCommunicationFrequency = dataLinkCommunicationFrequency;
            unmannedAerialVehicles[i].electronicReconnaissanceCapability = electronicReconnaissanceCapability;
            unmannedAerialVehicles[i].opticalReconnaissanceCapability = opticalReconnaissanceCapability;
            unmannedAerialVehicles[i].unmannedAerialVehicleManage = this;
        }
    }
    #endregion

    #region 阵型编队
    /// <summary>
    /// 阵型选择
    /// </summary>
    /// <param name="number"></param>
    public void Formation(int number)
    {
        switch (number) {
            case 1:
                GenerateFormation();
                break;
            case 2:
                MatrixFormation(5);
                break;
            case 3:
                MatrixFormation(30);
                break;
            case 4:
                MatrixFormation(1);
                break;
            default:
                break;
        }

    }

    /// <summary>
    /// 无人机雁式阵型
    /// </summary>
    private void GenerateFormation()
    {
        int count = 1; // 每一排的物体数量
        int currentCount = 0;
        Vector3 startPos = new Vector3();

        for (int i = 0; i < Mathf.Ceil(Mathf.Sqrt(totalObjects)); i++)
        {
            //Debug.Log("剩余。。。:" + (totalObjects - currentCount));
            startPos = new Vector3(-i * 2, 0, -i * 2);
            for (int j = 0; j < count; j++)//每排物体个数
            {

                if (currentCount < totalObjects)
                {
                    Vector3 _vector3 = startPos + new Vector3(j * 2, 0, 0);
                    unmannedAerialVehicles[currentCount].transform.localPosition = _vector3;
                    currentCount++;
                }
                else
                {
                    BoxCollider box = transform.GetComponent<BoxCollider>();
                    if (box)
                    {
                        box.center = new Vector3(0, 0, -i);
                        box.size = new Vector3(2 * count, 1, 2 * (i + 1));
                    }
                }
            }
            count += 2; // 下一排增加两个物体
        }
    }

    /// <summary>
    /// 矩阵阵型
    /// </summary>
    private void MatrixFormation(int rows)
    {
        float offsetX = 2.0f; // 子物体之间的水平间距
        float offsetY = 2.0f; // 子物体之间的垂直间距
        float offsetZ = 2.0f; // 子物体之间的垂直间距
        int currentCount = 0;
        int cols = CanDivideEvenly(totalObjects, rows) ? totalObjects / rows : totalObjects / rows + 1;
        for (int row = 0; row < rows; row++)
        {
            for (int col = 0; col < cols; col++)
            {
                if (currentCount < totalObjects)
                {
                    Vector3 position = new Vector3(col * offsetX, 0, -row * offsetZ);
                    unmannedAerialVehicles[currentCount].transform.localPosition = position;
                    currentCount++;
                }
            }
        }
        BoxCollider box = transform.GetComponent<BoxCollider>();
        if (box)
        {
            Debug.Log("cols..:" + cols);
            Debug.Log("rows..:" + rows);
            box.center = new Vector3(cols-1, 0, -(rows-1));
            box.size = new Vector3(cols*2, 1, 2 * rows);
        }
    }

    bool CanDivideEvenly(int dividend, int divisor)
    {
        return dividend % divisor == 0;
    }
    #endregion

    /// <summary>
    /// 关闭航线设置
    /// </summary>
    public void TurnOffCourseSettings()
    {
        if (airRoute)
        {
            ObjectPlanner objectPlanner = airRoute.GetComponent<ObjectPlanner>();
            if (objectPlanner)
            {
                objectPlanner.isPathCanBePlanned = false;
            }
        }
    }

    /// <summary>
    /// 开启航线设置
    /// </summary>
    public void RouteSettings()
    {
        if (airRoute)
        {
            ObjectPlanner objectPlanner = airRoute.GetComponent<ObjectPlanner>();
            if (objectPlanner)
            {
                objectPlanner.isPathCanBePlanned = true;
                objectPlanner.lineRenderer.SetVertexCount(0);
                Array.Clear(objectPlanner.positions, 0, objectPlanner.positions.Length);
            }
        }
        else
        {
            GameObject _object = Instantiate(LinePrefab);
            airRoute = _object;
            airRoute.transform.position = Vector3.zero;
            ObjectPlanner objectPlanner = airRoute.GetComponent<ObjectPlanner>();
            if (objectPlanner)
            {
                objectPlanner.isPathCanBePlanned = true;
                objectPlanner.SetSelectedObject(transform.gameObject);
            }
        }
    }


    private void OnMouseEnter()
    {
        UnmannedAerialVehicleUI.Instance.unmannedAerialVehicleManage = transform.GetComponent<UnmannedAerialVehicleManage>();
    }
}
public enum Pattern
{
    待机,
    警戒,
    攻击
}