#pragma once

#include <functional>
#include <memory>
#include <unordered_map>

#include "game/scenes/scene.hpp"

namespace Scenes {

    // Mapa de `state_key` (actualment = `Info::ctx.num_piramide`) a factory
    // d'escena. Permet que el dispatch de `gameFiberEntry` provi primer una
    // Scene nova i caiga al vell `ModuleSequence::Go()` si encara no està
    // migrada.
    //
    // Registre inicial: `Director::init()` cridarà `instance()` i afegirà
    // una entrada per cada escena ja portada. A mesura que vagen caient, les
    // línies del registre creixen i les funcions `doX()` del modulesequence
    // desapareixen.
    class SceneRegistry {
       public:
        using Factory = std::function<std::unique_ptr<Scene>()>;

        static auto instance() -> SceneRegistry&;

        void registerScene(int state_key, Factory factory);

        // Retorna `nullptr` si no hi ha cap escena registrada per a aquest
        // state. El caller hauria de caure al path legacy en aquest cas.
        auto tryCreate(int state_key) const -> std::unique_ptr<Scene>;

       private:
        SceneRegistry() = default;
        std::unordered_map<int, Factory> factories_;
    };

}  // namespace Scenes
