#ifndef _RIVE_STATE_TRANSITION_HPP_
#define _RIVE_STATE_TRANSITION_HPP_
#include "rive/animation/state_transition_flags.hpp"
#include "rive/generated/animation/state_transition_base.hpp"
#include <stdio.h>
#include <vector>

namespace rive {
    class LayerState;
    class StateMachineLayerImporter;
    class StateTransitionImporter;
    class TransitionCondition;
    class StateInstance;
    class SMIInput;
    class LinearAnimation;
    class LinearAnimationInstance;

    enum class AllowTransition : unsigned char { no, waitingForExit, yes };

    class StateTransition : public StateTransitionBase {
        friend class StateMachineLayerImporter;
        friend class StateTransitionImporter;

    private:
        StateTransitionFlags transitionFlags() const {
            return static_cast<StateTransitionFlags>(flags());
        }
        LayerState* m_StateTo = nullptr;

        std::vector<TransitionCondition*> m_Conditions;
        void addCondition(TransitionCondition* condition);

    public:
        ~StateTransition();
        const LayerState* stateTo() const { return m_StateTo; }

        StatusCode onAddedDirty(CoreContext* context) override;
        StatusCode onAddedClean(CoreContext* context) override;

        /// Whether the transition is marked disabled (usually done in the
        /// editor).
        bool isDisabled() const {
            return (transitionFlags() & StateTransitionFlags::Disabled) ==
                   StateTransitionFlags::Disabled;
        }

        /// Returns AllowTransition::yes when this transition can be taken from
        /// stateFrom with the given inputs.
        AllowTransition
        allowed(StateInstance* stateFrom, SMIInput** inputs, bool ignoreTriggers) const;

        /// Whether the animation is held at exit or if it keeps advancing
        /// during mixing.
        bool pauseOnExit() const {
            return (transitionFlags() & StateTransitionFlags::PauseOnExit) ==
                   StateTransitionFlags::PauseOnExit;
        }

        /// Whether exit time is enabled. All other conditions still apply, the
        /// exit time is effectively an AND with the rest of the conditions.
        bool enableExitTime() const {
            return (transitionFlags() & StateTransitionFlags::EnableExitTime) ==
                   StateTransitionFlags::EnableExitTime;
        }

        StatusCode import(ImportStack& importStack) override;

        size_t conditionCount() const { return m_Conditions.size(); }
        TransitionCondition* condition(size_t index) const {
            if (index < m_Conditions.size()) {
                return m_Conditions[index];
            }
            return nullptr;
        }

        /// The amount of time to mix the outgoing animation onto the incoming
        /// one when changing state. Only applies when going out from an
        /// AnimationState.
        float mixTime(const LayerState* stateFrom) const;

        /// Computes the exit time in seconds of the stateFrom. Set absolute to
        /// true if you want the returned time to be relative to the entire
        /// animation. Set absolute to false if you want it relative to the work
        /// area.
        float exitTimeSeconds(const LayerState* stateFrom, bool absolute = false) const;

        /// Provide the animation instance to use for computing percentage
        /// durations for exit time.
        virtual const LinearAnimationInstance*
        exitTimeAnimationInstance(const StateInstance* from) const;

        /// Provide the animation to use for computing percentage durations for
        /// exit time.
        virtual const LinearAnimation* exitTimeAnimation(const LayerState* from) const;

        /// Retruns true when we need to hold the exit time, also applies the
        /// correct time to the animation instance in the stateFrom, when
        /// applicable (when it's an AnimationState).
        bool applyExitCondition(StateInstance* stateFrom) const;
    };
} // namespace rive

#endif