using UnityEngine;

namespace Shooter.Gameplay
{
    /// <summary>
    /// Движение врага к заданной точке (прямым сдвигом transform, без физики). По пути
    /// может разворачиваться по направлению хода и проигрывать анимацию шага. Целью
    /// управляют корутины конкретных врагов через <see cref="SetMoveTargetPosition"/>.
    /// </summary>
    public class EnemyMovement : MonoBehaviour
    {
        [Tooltip("Скорость движения")]
        public float m_MovementSpeed = 20;
        public Animator m_Animator;

        [HideInInspector] public Vector3 m_MovementDirection;
        [HideInInspector] public Vector3 m_MovementTargetPosition;
        [HideInInspector] public bool m_MovementEnable = true;
        [HideInInspector] public bool m_ReachedTargetPosition = false;
        [HideInInspector] public bool m_FaceMoveDirection = true;
        [HideInInspector] public bool m_UsePhysics = true;

        void Update()
        {
            // Идём к цели, пока не дошли (нулевая цель = «цели нет»).
            if (!m_ReachedTargetPosition && m_MovementTargetPosition != Vector3.zero)
            {
                m_MovementDirection = m_MovementTargetPosition - transform.position;
                m_MovementDirection.y = 0;

                if (m_MovementDirection.magnitude <= .5f)
                {
                    m_MovementTargetPosition = Vector3.zero;
                    m_MovementDirection = Vector3.zero;
                    m_ReachedTargetPosition = true;
                }

                m_MovementDirection.Normalize();
                if (m_FaceMoveDirection && m_MovementDirection != Vector3.zero)
                    transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(m_MovementDirection), 10 * Time.deltaTime);
            }

            // Двигаемся и обновляем параметр анимации шага.
            if (m_MovementDirection != Vector3.zero)
            {
                transform.position += Time.deltaTime * m_MovementSpeed * m_MovementDirection;
                if (m_Animator != null)
                    m_Animator.SetFloat("WalkSpeed", 1);
            }
            else if (m_Animator != null)
            {
                m_Animator.SetFloat("WalkSpeed", 0);
            }
        }

        public void SetMoveTargetPosition(Vector3 position)
        {
            m_ReachedTargetPosition = false;
            m_MovementTargetPosition = position;
        }
    }
}
