#pragma once

#include <Core/Common/NonNullPtr.h>

namespace Juliet
{
    struct RenderPass;
    struct CommandList;
    struct Texture;
    struct ColorTargetInfo;
    struct DepthStencilTargetInfo;
    struct Arena;

    class IApplication
    {
      public:
        virtual ~IApplication()                    = default;
        virtual void Init(NonNullPtr<Arena> arena) = 0;
        virtual void Shutdown()                    = 0;
        virtual void Update()                      = 0;
        virtual bool IsRunning()                   = 0;

        // Accessors for Engine Systems
        virtual struct Window*         GetPlatformWindow() = 0;
        virtual struct GraphicsDevice* GetGraphicsDevice() = 0;

        // Render Lifecycle (Engine-Managed Render Loop)
        virtual void                    OnPreRender(CommandList* cmd)                 = 0;
        virtual void                    OnRender(RenderPass* pass, CommandList* cmd)  = 0;
        virtual ColorTargetInfo         GetColorTargetInfo(Texture* swapchainTexture) = 0;
        virtual DepthStencilTargetInfo* GetDepthTargetInfo()                          = 0;
        virtual struct Camera           GetDebugCamera()                              = 0;
    };
} // namespace Juliet
