using System.Collections;
using UnityEngine;

namespace Shooter.Gameplay
{
    /// <summary>
    /// Подбираемый предмет: через короткую задержку после появления реагирует на
    /// приближение игрока — летит к нему и применяет эффект через
    /// <see cref="PlayerChar.HandlePickup"/>. Тип и количество задаются в инспекторе.
    /// </summary>
    public class Pickup : MonoBehaviour
    {
        public GameObject m_ScoreParticle;

        [Space]
        [Tooltip("Тип предмета: Cash, Gem, Health, Key, Weapon_Pistol/Shotgun, WeaponPower, Power_Grenade")]
        public string m_ItemType = "Cash";
        public int m_ItemCount = 1;
        [Tooltip("Дистанция, с которой предмет притягивается к игроку")]
        public float m_PickRange = 5f;

        public bool m_CanPick = false;

        [HideInInspector] public PlayerChar m_TouchedPlayer;
        bool picked = false;

        void Start()
        {
            m_CanPick = false;
            Invoke(nameof(AllowPick), .5f);
        }

        void Update()
        {
            if (!picked && m_CanPick &&
                Vector3.Distance(transform.position, PlayerChar.m_Current.transform.position) <= m_PickRange)
            {
                m_TouchedPlayer = PlayerChar.m_Current;
                picked = true;

                Collider physCollider = GetComponent<Collider>();
                if (physCollider != null)
                    physCollider.enabled = false;

                StartCoroutine(Co_HandlePick());
            }
        }

        public virtual void HandlePickup()
        {
            m_TouchedPlayer.HandlePickup(m_ItemType, m_ItemCount);
        }

        /// <summary>Предмет летит к игроку, применяет эффект и исчезает.</summary>
        IEnumerator Co_HandlePick()
        {
            Vector3 startPos = transform.position;
            float lerp = 0;
            while (lerp <= 1)
            {
                transform.position = Vector3.Lerp(startPos, m_TouchedPlayer.transform.position + new Vector3(0, 1, 0), lerp);
                lerp += 10 * Time.deltaTime;
                yield return null;
            }
            transform.position = m_TouchedPlayer.transform.position + new Vector3(0, 1, 0);
            HandlePickup();

            GameObject obj = Instantiate(m_ScoreParticle);
            obj.transform.position = transform.position;
            Destroy(obj, 1);

            Destroy(gameObject);
        }

        private void AllowPick()
        {
            m_CanPick = true;
        }
    }
}
