using UnityEngine;

namespace Shooter.Gameplay
{
    /// <summary>
    /// Взрыв: при появлении наносит урон по площади. Игроку и разрушаемым блокам урон
    /// тем больше, чем ближе они к центру; блоки дополнительно получают толчок.
    /// </summary>
    public class Explosion : MonoBehaviour
    {
        [Header("Радиус и урон")]
        [Tooltip("Радиус поражения")]
        public float Radius = 5;
        [Tooltip("Урон игроку в центре взрыва")]
        public float m_PlayerDamageNear = 40;
        [Tooltip("Урон игроку на краю радиуса")]
        public float m_PlayerDamageFar = 5;
        [Tooltip("Урон блоку в центре взрыва")]
        public float m_BlockDamageNear = 10;
        [Tooltip("Урон блоку на краю радиуса")]
        public float m_BlockDamageFar = 1;

        void Start()
        {
            Collider[] colls = Physics.OverlapSphere(transform.position, Radius);
            foreach (Collider col in colls)
            {
                if (col.gameObject.tag == "Player")
                {
                    // t = 0 в центре, 1 на краю радиуса — урон ослабевает к краю.
                    float t = Vector3.Distance(col.bounds.center, transform.position) / Radius;
                    PlayerChar p = col.gameObject.GetComponent<PlayerChar>();
                    Vector3 dir = p.transform.position + new Vector3(0, 2, 0) - transform.position;
                    p.m_DamageControl.ApplyDamage(Mathf.Lerp(m_PlayerDamageNear, m_PlayerDamageFar, t), dir, 4);
                }
                else if (col.gameObject.tag == "Block")
                {
                    Rigidbody rb = col.gameObject.GetComponent<Rigidbody>();
                    if (rb != null)
                        rb.AddForceAtPosition(col.gameObject.transform.position - transform.forward, transform.position);

                    DamageControl d = col.gameObject.GetComponent<DamageControl>();
                    if (d != null)
                    {
                        float t = Vector3.Distance(col.bounds.center, transform.position) / Radius;
                        d.ApplyDamage(Mathf.Lerp(m_BlockDamageNear, m_BlockDamageFar, t), transform.forward, 1);
                    }
                }
            }
        }
    }
}
