using System.Collections;
using DG.Tweening;
using UnityEngine;
using UnityEngine.UI;

namespace UNSLOW.EffectPractice.FirstTerm.Gauges
{
    [RequireComponent(typeof(RectTransform))]
    public class HpGauge : MonoBehaviour
    {
        [SerializeField] private Image front;
        [SerializeField] private Image back;
        [SerializeField] private float shakeMagnitude = 1f;

        private float _hp = 1f;
        private RectTransform _rectTransform;

        // ダメージを受ける
        public void TakeDamage(float damage)
        {
            _hp = Mathf.Clamp(_hp - damage, 0f, 1f);
            
            var sequence = DOTween.Sequence();
            sequence.
                Append(front.DOFillAmount(_hp, 0.2f)).
                Join(_rectTransform.DOShakePosition(0.5f, 10f*shakeMagnitude, 20)).
                SetDelay(0.1f).
                Append(back.DOFillAmount(_hp, 0.5f));
        }
        
        // 回復する
        public void Heal(float heal)
        {
            _hp = Mathf.Clamp(_hp + heal, 0f, 1f);
            
            var sequence = DOTween.Sequence();
            sequence.Append(front.DOFillAmount(_hp, 0.5f));
            sequence.Join(back.DOFillAmount(_hp, 0.5f));
        }

        private void Awake()
        {
            _rectTransform = GetComponent<RectTransform>();
        }

#if true
        // 以下はデモ用コード
        private void Start()
        {
            StartCoroutine(Co());
        }

        private IEnumerator Co()
        {
            while (true)
            {
                if(_hp >= 1f || _hp > 0f && Random.value < 0.5f)
                    TakeDamage(Random.Range(0.2f, 1.0f));
                else
                    Heal(Random.Range(0.2f, 1.0f));

                yield return new WaitForSeconds(1.5f);
            }
        }
    }
#endif
}
