using UnityEngine;

namespace Shooter.Gameplay
{
    /// <summary>
    /// Дробовик игрока. Переопределяет стрельбу базового класса
    /// <see cref="Weapon_Base"/>: бьёт «снопом» дробин. В усиленном режиме
    /// (<see cref="Weapon_Base.m_PowerLevel"/> == 1) дробин вдвое больше, разлёт шире
    /// и темп выше.
    /// </summary>
    public class PWeapon_Shotgun : Weapon_Base
    {
        [Header("Дробовик: обычный режим")]
        [Tooltip("Задержка между выстрелами, сек")]
        public float FireDelayNormal = .4f;
        [Tooltip("Сколько дробин в выстреле")]
        public int PelletsNormal = 3;
        [Tooltip("Угол самой левой дробины относительно ствола, градусы")]
        public float SpreadStartNormal = -6f;
        [Tooltip("Шаг угла между соседними дробинами, градусы")]
        public float SpreadStepNormal = 6f;

        [Header("Дробовик: усиленный режим")]
        [Tooltip("Задержка между выстрелами, сек")]
        public float FireDelayPowered = .3f;
        [Tooltip("Сколько дробин в выстреле")]
        public int PelletsPowered = 6;
        [Tooltip("Угол самой левой дробины относительно ствола, градусы")]
        public float SpreadStartPowered = -30f;
        [Tooltip("Шаг угла между соседними дробинами, градусы")]
        public float SpreadStepPowered = 10f;

        void Update()
        {
            // Усиление ускоряет стрельбу.
            FireDelay = (m_PowerLevel == 1) ? FireDelayPowered : FireDelayNormal;

            FireDelayTimer = Mathf.Max(0, FireDelayTimer - Time.deltaTime);
            RecoilTimer = Mathf.Max(0, RecoilTimer - 10 * Time.deltaTime); // своя, более резкая отдача

            if (Input_FireHold && FireDelayTimer == 0)
            {
                FireWeapon();
                FireDelayTimer = FireDelay;
                RecoilTimer = 1f; // запускаем импульс отдачи
            }
        }

        public override void FireWeapon()
        {
            if (m_PowerLevel == 0)
                FireSpread(PelletsNormal, SpreadStartNormal, SpreadStepNormal);
            else
                // Примечание: усиленный сноп несимметричен (−30°…+20°) — историческая
                // особенность игры. Сохранено как было; при желании выровнять — поставить
                // SpreadStartPowered = -25.
                FireSpread(PelletsPowered, SpreadStartPowered, SpreadStepPowered);

            SpawnMuzzleEffect();
        }

        /// <summary>
        /// Пускает count дробин веером: первая под углом startDeg, каждая следующая
        /// повёрнута ещё на stepDeg.
        /// </summary>
        void FireSpread(int count, float startDeg, float stepDeg)
        {
            for (int i = 0; i < count; i++)
                SpawnPellet(startDeg + i * stepDeg);
        }

        /// <summary>Создаёт одну дробину, повёрнутую на angleDeg от направления ствола.</summary>
        void SpawnPellet(float angleDeg)
        {
            GameObject pellet = Instantiate(BulletPrefab);
            pellet.transform.position = m_FirePoint.position;
            pellet.transform.forward = Quaternion.Euler(0, angleDeg, 0) * m_FirePoint.forward;

            Projectile_Base proj = pellet.GetComponent<Projectile_Base>();
            proj.Creator = m_Owner;
            proj.Speed = ProjectileSpeed;
            proj.Damage = Damage;
            proj.m_Range = Range;

            Destroy(pellet, BulletLifetime);
        }

        /// <summary>Создаёт вспышку выстрела на точке <see cref="Weapon_Base.m_ParticlePoint"/>.</summary>
        void SpawnMuzzleEffect()
        {
            GameObject effect = Instantiate(EffectPrefab);
            effect.transform.SetParent(m_ParticlePoint);
            effect.transform.localPosition = Vector3.zero;
            effect.transform.forward = m_ParticlePoint.forward;
            Destroy(effect, EffectLifetime);
        }
    }
}
