using UnityEngine;

namespace Shooter.Gameplay
{
    /// <summary>
    /// Базовый снаряд: летит вперёд с заданной скоростью, проверяет попадание
    /// «прочёсыванием» пути (SphereCast) и наносит урон игроку, врагам и разрушаемым
    /// блокам. Самоуничтожается, пролетев дальность <see cref="m_Range"/>.
    /// </summary>
    public class Projectile_Base : MonoBehaviour
    {
        [Header("Характеристики полёта")]
        [Tooltip("Скорость полёта")]
        public float Speed = 100;
        [Tooltip("Урон при попадании")]
        public float Damage = 1;
        [Tooltip("Радиус проверки попадания (толщина луча)")]
        public float m_Radius = 1f;
        [Tooltip("Дальность, после которой снаряд исчезает")]
        public float m_Range = 10;

        [Header("Эффект попадания")]
        public GameObject HitParticlePrefab1;

        [HideInInspector] public GameObject Creator; // кто выпустил — в него снаряд не попадает

        private Vector3 m_StartPosition;

        void Start()
        {
            m_StartPosition = transform.position;
        }

        void Update()
        {
            // Пролетев свою дальность, снаряд исчезает.
            if (Vector3.Distance(m_StartPosition, transform.position) >= m_Range)
            {
                Destroy(gameObject);
                return;
            }

            // Прочёсываем путь за этот кадр лучом толщиной m_Radius.
            RaycastHit[] hits = Physics.SphereCastAll(transform.position, m_Radius, transform.forward, Speed * Time.deltaTime);
            foreach (RaycastHit hit in hits)
            {
                GameObject target = hit.collider.gameObject;

                bool hitPlayer = target.tag == "Player" && target != Creator;
                bool hitBlock = target.tag == "Block";
                bool hitEnemy = target.tag == "Enemy";

                if (hitPlayer || hitBlock || hitEnemy)
                {
                    DamageControl d = target.GetComponent<DamageControl>();
                    if (d != null)
                        d.ApplyDamage(Damage, transform.forward, 1);
                    Destroyed(hit.point);
                }
            }

            transform.position += Speed * Time.deltaTime * transform.forward;
        }

        /// <summary>Уничтожает снаряд и создаёт эффект попадания в точке pos.</summary>
        public virtual void Destroyed(Vector3 pos)
        {
            Destroy(gameObject);
            GameObject obj = Instantiate(HitParticlePrefab1);
            obj.transform.position = pos;
            Destroy(obj, 6);
        }
    }
}
