using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using RecrownedAthenaeum.Render;

namespace RecrownedAthenaeum.ScreenSystem
{
    /// <summary>
    /// Contracts a transition that the <see cref="ScreenManager"/> can use.
    /// </summary>
    public interface ITransition
    {
        /// <summary>
        /// Called once when the transition is needed.
        /// <param name="dimensions">The dimensions of the screen.</param>
        /// </summary>
        void InitiateTransition(Rectangle dimensions);

        /// <summary>
        /// Called every frame if the state of the screen this transition is placed upon is in the enter transition phase.
        /// </summary>
        /// <param name="delta">The time passed in seconds since the last frame.</param>
        /// <param name="waiting">Whether or not this transition is waiting on something. Usually the <see cref="ContentSystem"/>.</param>
        /// <returns>If this returns true, then it is considered that this transition is complete.</returns>
        bool UpdateEnteringTransition(double delta, bool waiting);

        /// <summary>
        /// Called every frame if the state of the screen this transition is placed upon is in the exit phase.
        /// </summary>
        /// <param name="delta">The time passed in seconds since the last frame.</param>
        /// <param name="waiting">Whether or not this transition is waiting on something. Usually the <see cref="ContentSystem"/>.</param>
        /// <returns>If this returns true, then it is considered that this transition is complete.</returns>
        bool UpdateExitingTransition(double delta, bool waiting);

        /// <summary>
        /// Called once every frame while transition is active. Meant to draw transition.
        /// </summary>
        /// <param name="spriteBatch"></param>
        void DrawTransition(ConsistentSpriteBatch spriteBatch);

        /// <summary>
        /// Updates if the previous screen uses a render target for exit transition.
        /// </summary>
        /// <param name="previousScreenFrame">The frame of the previous screen.</param>
        void UpdatePreviousScreenFrame(RenderTarget2D previousScreenFrame);
    }
}
