using System.Collections;
using System.Collections.Generic;
using Thousandto.Core.Support;
using UnityEngine;

namespace Thousandto.Code.Logic
{
    /// <summary>
    /// 状态system基类
    /// </summary>
    public class BaseStateSystem : IStateSystem
    {
        #region//私有变量
        private StateMachine _fsm = null;
        #endregion

        #region//属性
        public StateMachine Fsm
        {
            get
            {
                return _fsm;
            }
        }
        #endregion
        #region//私有函数
        private void CreateStateMachine()
        {
            _fsm = new StateMachine(this);
        }
        #endregion
        #region//实现接口
        public void Initialize()
        {
            CreateStateMachine();
            OnInitialize();
        }

        public void UnInitialize()
        {
            OnUnInitialize();
        }

        public IGameState GetCurState()
        {
            if (_fsm != null)
                return _fsm.GetCurState();
            return null;
        }

        public IGameState GetNextState()
        {
            if (_fsm != null)
                return _fsm.GetNextState();
            return null;
        }

        public IGameState GetPrevState()
        {
            if (_fsm != null)
                return _fsm.GetPrevState();
            return null;
        }

        public IGameState GetStateById(int id)
        {
            return OnGetStateById(id);
        }


        public bool IsCurState(int stateID)
        {
            if (_fsm != null)
            {
               return _fsm.IsState(stateID);
            }
            return false;
        }

        public void ChangeState(int stateId, object arg = null)
        {
            OnChangeState(stateId, arg);
        }

        public void HandlerMessage(object msg)
        {
            OnHandlerMessage(msg);
        }

        public void Update(float dt)
        {
            OnUpdate(dt);
        }
        #endregion

        #region//子类继承
        protected virtual void OnInitialize() { }
        protected virtual void OnUnInitialize() { }
        protected virtual IGameState OnGetStateById(int id) { return null; }
        protected virtual void OnChangeState(int stateId, object arg) { }
        protected virtual void OnHandlerMessage(object msg) { }
        protected virtual void OnUpdate(float dt) { }
        #endregion
    }
}