using System;
using System.Collections.Generic;
using UnityEngine;

namespace NBC
{
    public abstract class FsmBaseState<TOwnerClass>
    {
        protected TOwnerClass _owner;
        protected Fsm<TOwnerClass> Root;

        public FsmTransmit Params = new FsmTransmit();

        public abstract uint StateId { get; }

        public uint PrevState { get; set; }

        public uint NextState { get; set; }

        protected float EnterTime { get; set; }

        public void Init(TOwnerClass owner, Fsm<TOwnerClass> fsm)
        {
            _owner = owner;
            Root = fsm;
        }

        public virtual void Transition(FsmBaseState<TOwnerClass> source)
        {
            Enter();
        }

        public void Enter()
        {
            EnterTime = Time.time;
            onEnter();
        }

        protected virtual void onEnter()
        {
        }

        public void Exit()
        {
            onExit();
        }

        protected virtual void onExit()
        {
        }

        public uint Update()
        {
            return onUpdate();
        }

        protected virtual uint onUpdate()
        {
            return 0;
        }

        public uint FixedUpdate()
        {
            return onFixedUpdate();
        }

        protected virtual uint onFixedUpdate()
        {
            return 0;
        }

        public void PreUpdate()
        {
            OnPreUpdate();
        }

        protected virtual void OnPreUpdate()
        {
        }

        public uint LateUpdate()
        {
            return OnLateUpdate();
        }

        protected virtual uint OnLateUpdate()
        {
            return 0;
        }
    }
}