#pragma once

#include <memory>
#include <string>
#include <vector>

#include "scene_context.hpp"

class Scene;
class SDLManager;
namespace System { class DebugOverlay; }

class Director {
    public:
        explicit Director(std::vector<std::string> const& args);
        ~Director();

        auto run() -> int;  // Main game loop

    private:
        std::string executable_path_;
        std::string system_folder_;

        static auto checkProgramArguments(std::vector<std::string> const& args)
            -> std::string;
        void createSystemFolder(const std::string& folder);

        // Construye la escena correspondiente al tipo solicitado. Retorna
        // nullptr para EXIT u otros valores no constructibles.
        static auto buildScene(SceneManager::SceneContext::SceneType type,
                               SDLManager& sdl,
                               SceneManager::SceneContext& context)
            -> std::unique_ptr<Scene>;

        // Ejecuta el bucle de frames de UNA escena hasta que scene.isFinished()
        // sea true. Maneja delta_time, eventos (globales + escena), update y draw.
        // El debug_overlay es global a todas las escenas; el Director lo posee.
        static void runFrameLoop(Scene& scene, SDLManager& sdl,
                                 SceneManager::SceneContext& context,
                                 System::DebugOverlay& debug_overlay);
};
