using System;
using System.Collections;
using UnityEditor;
using UnityEngine;

[System.Serializable]
//ɲ
public class MyEnemyWave
{
    //nɶӦĲζ
    public float delay;
    public GameObject enemy;
}
[System.Serializable]
//ƶ࣬¾ǳ趨İٷֱȺٶȣָͣɻƶ
public class MoveControl
{
    //ǷҪֹƶ
    public bool isStay = false;
    //ƶλ
    public float moveStep;
    //ƶӦٷֱȺͣʱ
    public float stayTime;
    //ͣʱɺı䵱ǰٶ
    public float percentSpeedChange;
    //Ƿʹƽٶ
    public bool isAverageSpeed;
}

public class MyWaveController : MonoBehaviour
{
    //Ŀǰϰĩβs
    //õϰxxx_arrayxxxArray

    //ɲ
    public MyEnemyWave[] enemyWaves;
    //лƶ
    public MoveControl[] moveControls;

    //Ƿƶ
    public bool curveRotate = true;
    //ߺǷͻ
    public bool curveLoop = false;

    //屴߰ĸ,inspectorʹhandlerֱӵ
    public Vector3[] points;
    //
    public int lineStep = 100;
    //Ϊ˱ڵԷй켣ʹõĲʾǰڵĽ׶
    [SerializeField]
    public int showStep = 0;

    //ɻٶĬֵ
    public float percentSpeed = 1f;
    //ɻǷƶĬֵ
    public bool isAverageSpeed = false;

    public Vector3 GetPoint(float t)
    {
        return transform.TransformPoint(Bezier.GetPoint(points, t));
    }


    private void Start()
    {
        //ʹЭɲζ
        for (int i = 0; i < enemyWaves.Length; i++)
        {
            StartCoroutine(CreateEnemyGroup(enemyWaves[i].delay, enemyWaves[i].enemy));
        }
    }
    //ɲεЭ
    IEnumerator CreateEnemyGroup(float delay, GameObject enemy)
    {
        if (delay != 0)
        {
            yield return new WaitForSeconds(delay);
        }
        //ɵлҽӦݸл˺л벨ζѹζɵллƶ
        GameObject newEnemy;
        newEnemy = Instantiate(enemy, enemy.transform.position, enemy.transform.rotation);//======ʹõInstantiateҪҪǶأҾûҪҲöô======
        MyEnemyController enemyComponent = newEnemy.GetComponent<MyEnemyController>();

        //лߵĸ㣬ҽתΪ괫л
        enemyComponent.movePoints = new Vector3[points.Length];
        for (int i = 0; i < points.Length; i++)
        {
            enemyComponent.movePoints[i] = transform.TransformPoint(points[i]);
        }



        //ضлѭʱøֹ״̬
        enemyComponent.moveControlStayOriginal = new bool[moveControls.Length];

        //л
        //עߵƶǵлģұߵԼģȻmoveControls
        //¸waveMoveCtrlsenemyMoveCtrls
        enemyComponent.moveControls = new MoveControl[moveControls.Length];
        //ô鷳Ϊǵַͣnewһȥͬһ
        //Լٶֵͺ͵ַ
        for (int i = 0; i < moveControls.Length; i++)
        {
            enemyComponent.moveControls[i] = new MoveControl();
            enemyComponent.moveControls[i].isStay = moveControls[i].isStay;
            enemyComponent.moveControls[i].moveStep = moveControls[i].moveStep;
            enemyComponent.moveControls[i].stayTime = moveControls[i].stayTime;
            enemyComponent.moveControls[i].percentSpeedChange = moveControls[i].percentSpeedChange;
            enemyComponent.moveControls[i].isAverageSpeed = moveControls[i].isAverageSpeed;
            enemyComponent.moveControlStayOriginal[i] = moveControls[i].isStay;
        }
        //ߣѭ
        enemyComponent.curveRotate = curveRotate;
        enemyComponent.curveLoop = curveLoop;
        //linestepǷƶ
        enemyComponent.lineStep = lineStep;
        enemyComponent.isAverageSpeed = isAverageSpeed;
}

    private void OnDrawGizmos()
    {
        //ݻȻƱߣʵǻ˺ܶࣨlineStepֱ
        Vector3 lineStart = GetPoint(0f);
        for (int i = 1; i <= lineStep; i++)
        {
            Vector3 lineEnd = GetPoint(i / (float)lineStep);
            Gizmos.color = Color.white;
            Gizmos.DrawLine(lineStart, lineEnd);
            lineStart = lineEnd;
        }
        Gizmos.color = Color.red;
        Gizmos.DrawWireCube(GetPoint(showStep / (float)lineStep), new Vector3(0.4f, 0.4f, 0.4f));
    }


}

//߽ͣ
//һ01ıtnn-1߶ΣȻÿ߶ڱtµĵλãȡĿ1ôǰ˳߶ΣȡЩ߶ڱtµĵλ
//Ȼt01ƶ


//̬Ķ壬ڼ
public static class Bezier
{
    //GetPoint
    //ǻȡһϵеݱ߼λڱtĵ
    public static Vector3 GetPoint(Vector3[] points, float t)
    {
        //һ飬ƴʹUnityԴĲֵ㷨ӵһ㿪ʼμ֮Ĳֵ
        //һֹܹĵĿͼ1ظ˹ֱֻ̣ʣһ㣬õԭʼɵıڱtµĵλ
        //Ȼ󷵻
        Vector3[] newPoints;
        int pointsNumber = points.Length;
        newPoints = new Vector3[pointsNumber];
        //Ҫarray.copyĻʹ˵ַbug
        Array.Copy(points, newPoints, pointsNumber);
        while (pointsNumber > 1)
        {
            for (int i = 0; i < pointsNumber - 1; i++)
            {
                newPoints[i] = Vector3.Lerp(newPoints[i], newPoints[i + 1], t);
            }
            pointsNumber -= 1;
        }
        return newPoints[0];
    }

    //ڱ༭ʾ
    [CustomEditor(typeof(MyWaveController))]
    public class MyWaveControllerInspector : Editor
    {

        private MyWaveController curve;
        private Transform handleTransform;
        private Quaternion handleRotation;

        private void OnSceneGUI()
        {
            curve = target as MyWaveController;
            handleTransform = curve.transform;
            //ݱ༭еêʾ״̬xyzֱʾ
            handleRotation = Tools.pivotRotation == PivotRotation.Local ? handleTransform.rotation : Quaternion.identity;

            //ͨƶxyzֱڵλ
            for (int i = 0; i < curve.points.Length; i++)
            {
                ShowPoint(i);
            }
        }

    //ͨƶxyzֱڵλ
    private Vector3 ShowPoint(int index)
        {
            Vector3 point = handleTransform.TransformPoint(curve.points[index]);
            EditorGUI.BeginChangeCheck();
            point = Handles.DoPositionHandle(point, handleRotation);
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(curve, "Move Point");
                EditorUtility.SetDirty(curve);
                curve.points[index] = handleTransform.InverseTransformPoint(point);
            }
            return point;
        }
    }

    

}


