using System;
using UnityEngine;
using Random = UnityEngine.Random;

namespace JLGames.RocketDriver.Actions.Animatorx
{
    public class AnimWeightState : StateMachineBehaviour
    {
        [Serializable]
        public struct WeightState
        {
            public string State;
            public uint Weight;
        }

        [SerializeField] private WeightState[] m_States;

        public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
        {
            if (null == m_States || m_States.Length == 0) return;
            if (m_States.Length == 1 && !string.IsNullOrEmpty(m_States[0].State))
            {
                animator.PlayState(m_States[0].State);
                return;
            }

            var r = Random.Range(0, StatWeight());
            var index = FindStateIndex(r);
            if (!string.IsNullOrEmpty(m_States[index].State))
            {
                animator.PlayState(m_States[index].State);
            }
        }

        private int StatWeight()
        {
            if (m_States == null || m_States.Length == 0) return 0;
            var rs = 0;
            for (var index = 0; index < m_States.Length; index++)
            {
                if (string.IsNullOrEmpty(m_States[index].State) || m_States[index].Weight == 0) continue;
                rs += (int)m_States[index].Weight;
            }

            return rs;
        }

        private int FindStateIndex(int randomWeight)
        {
            for (var index = m_States.Length - 1; index >= 0; index--)
            {
                if (string.IsNullOrEmpty(m_States[index].State) || m_States[index].Weight == 0) continue;
                randomWeight -= (int)m_States[index].Weight;
                if (randomWeight <= 0) return index;
            }

            return 0;
        }
    }
}