using AlienAttack.MonoGame.Audio;
using AlienAttack.MonoGame.Textures;
using AlienAttack.MonoGame.View;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;

namespace AlienAttack.MonoGame.GameLoops;

internal abstract class GameLoopBase(AlienAttackGame game) : IGameLoop
{
    protected readonly AlienAttackGame Game = game;
    protected readonly ContentManager Content = game.Content;
    protected readonly SpriteBatch SpriteBatch = game.SpriteBatch;
    protected readonly ViewTransform ViewTransform = game.ViewTransform;
    protected readonly AudioManager Audio = game.Audio;
    protected readonly TextureCache Textures = game.Textures;

    public void Draw(GameTime gameTime)
    {
        SpriteBatch.Begin(transformMatrix: ViewTransform.ViewMatrix);

        OnDraw(gameTime);

        SpriteBatch.End();
    }

    public void Update(GameTime gameTime)
    {
        Audio.UpdateWithDuck(gameTime);
        OnUpdate(gameTime);
    }

    public abstract void OnDraw(GameTime gameTime);
    public abstract void OnUpdate(GameTime gameTime);
}