using UnityEngine;

namespace Shooter.Gameplay
{
    /// <summary>
    /// Точка появления врагов: когда попадает в кадр, разом создаёт <see cref="m_SpawnCount"/>
    /// врагов, расставляя их кольцом. Раскладку по кольцу пересчитывает <see cref="OnValidate"/>
    /// в редакторе (и показывает гизмо).
    /// </summary>
    public class EnemySpawnPoint : MonoBehaviour
    {
        public GameObject m_EnemyPrefab;
        [Tooltip("Сколько врагов создать")]
        public int m_SpawnCount;
        [Tooltip("Поворот всего кольца врагов, градусы")]
        public float m_PositionsAngle = 0;
        [Tooltip("Насколько враги проходят вперёд после появления")]
        public float m_StartWalkDistance = 10;
        [Tooltip("Появляться автоматически при входе в кадр")]
        public bool m_AutoSpawn = true;

        [HideInInspector] public bool m_Spawned = false;

        Vector3[] m_Points;

        void Start()
        {
            m_Spawned = false;
        }

        void Update()
        {
            if (!m_Spawned && m_AutoSpawn &&
                CameraControl.m_Current.m_CameraTopPosition.z > transform.position.z &&
                transform.position.z >= CameraControl.m_Current.m_CameraBottomPosition.z)
            {
                SpawnEnemy();
                m_Spawned = true;
            }
        }

        public void SpawnEnemy()
        {
            for (int i = 0; i < m_SpawnCount; i++)
            {
                GameObject obj = Instantiate(m_EnemyPrefab);
                obj.transform.position = transform.position + transform.rotation * m_Points[i];
                obj.transform.forward = transform.forward;

                Enemy e = obj.GetComponent<Enemy>();
                e.m_StartWalkDistance = m_StartWalkDistance;
            }
        }

        // Пересчёт раскладки врагов по кольцу (вызывается редактором).
        void OnValidate()
        {
            if (m_SpawnCount <= 0)
                return;

            m_Points = new Vector3[m_SpawnCount];
            if (m_SpawnCount == 1)
            {
                m_Points[0] = Vector3.zero;
            }
            else
            {
                float dAngle = 360f / m_SpawnCount;
                float lenght = Mathf.Clamp(2f + .3f * (m_SpawnCount - 2), .6f, 7);
                for (int i = 0; i < m_SpawnCount; i++)
                    m_Points[i] = Helper.RotatedLenght(i * dAngle + m_PositionsAngle, lenght);
            }
        }

        void OnDrawGizmos()
        {
            if (m_SpawnCount <= 0)
                return;

            Gizmos.DrawLine(transform.position, transform.position + 2 * transform.forward);
            for (int i = 0; i < m_SpawnCount; i++)
            {
                Gizmos.color = Color.red;
                Vector3 p = transform.position + transform.rotation * m_Points[i];
                Gizmos.DrawWireSphere(p, .5f);
                Gizmos.DrawLine(p, p + m_StartWalkDistance * transform.forward);
            }
        }
    }
}
