﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using Arugula.Animation;

namespace Arugula.Prototypical
{
    public class PointPop : MonoBehaviour
    {
        Vector3 originalScale;

        public Vector3 punchAmount;
        public float punchDuration = 0.5f;
        public Vector3 floatOffset;
        public float floatDuration = 2;
        public bool countUp = true;
        public float countUpDuration = 0.75f;

        public bool lookAtCamera;
        public bool autoDestroy = true;

        [Header("Normal")]
        public Color textNormal = Color.white;
        [EnumFlag]
        public FontStyles styleNormal = FontStyles.Normal;
        [Header("Heal")]
        public Color textHeal = Color.green;
        [EnumFlag]
        public FontStyles styleHeal = FontStyles.Normal;
        [Header("Critical")]
        public Color textCritical = Color.yellow;
        [EnumFlag]
        public FontStyles styleCritical = FontStyles.Normal;

        public enum Type
        {
            Normal, Heal, Critical
        }

        TextMeshPro tmp;

        // Start is called before the first frame update
        void Awake()
        {
            tmp = GetComponent<TextMeshPro>();
            originalScale = transform.localScale;
            transform.localScale = Vector3.zero;
        }

        private void Update()
        {
            if (lookAtCamera)
                //transform.rotation = Quaternion.LookRotation((transform.position - Camera.main.transform.position).GetHeading());
                transform.rotation = Camera.main.transform.rotation;
        }

        public void ShowNumber(int val, Type type)
        {
            tmp.text = val.ToString();

            transform.localScale = Vector3.zero;
            transform.ScaleTo(originalScale, new Tween.Options(duration: 0.5f, easing: Easing.easeOutElastic));

            switch (type)
            {
                case Type.Normal:
                    tmp.color = textNormal;
                    tmp.fontStyle = styleNormal;
                    FloatAndDisappear();
                    break;
                case Type.Critical:
                    tmp.color = textCritical;
                    tmp.fontStyle = styleCritical;
                    Punch();
                    break;
                case Type.Heal:
                    tmp.color = textHeal;
                    tmp.fontStyle = styleHeal;
                    FloatAndDisappear();
                    break;
            }

            if (countUp)
                CountUp(val);
        }

        void CountUp(int val)
        {
            FloatTween t = new FloatTween(0, val, new Tween.Options(duration: countUpDuration, easing: Easing.easeOutQuadratic), this);
            t.OnUpdatedValue += (x) => { tmp.text = Mathf.CeilToInt(x).ToString(); };
            Tweener.Enqueue(t);
        }

        void Punch()
        {
            //transform.PunchPosition(punchAmount, punchDuration, Easing.easeOutSine).OnFinished += (x) =>
            transform.PunchPosition(punchAmount, new Tween.Options(punchDuration, easing: Easing.easeOutSine)).OnFinished += (x) =>
            {
                FloatAndDisappear();
            };
        }

        void FloatAndDisappear(float delay = 0)
        {
            transform.MoveTo(transform.position + (transform.rotation * floatOffset), new Tween.Options(floatDuration, Easing.easeOutSine, delay)).OnFinished += (x) =>
            {
                if(transform != null)
                {
                    transform.ScaleTo(Vector3.zero, new Tween.Options(0.5f, Easing.easeInBack)).OnFinished += (y) =>
                    {
                        if (autoDestroy)
                            Destroy(gameObject);
                    };
                }
            };
        }
    }
}
