// scene_context.hpp - Sistema de gestió de escenes i context de transiciones
// © 2025 Port a C++20

#pragma once

#include "core/system/game_config.hpp"

namespace SceneManager {

// Context de transición entre escenes
// Conté l'escena destinació i opciones específiques per aquella escena
class SceneContext {
    public:
        // Tipo de escena del juego
        enum class SceneType {
            LOGO,   // Pantalla de start (logo JAILGAMES)
            TITLE,  // Pantalla de título con menú
            GAME,    // Juego principal (Asteroids)
            EXIT   // Salir del programa
        };

        // Opciones específiques para cada escena
        enum class Option {
            NONE,                // Sin opciones especials (comportament per defecte)
            JUMP_TO_TITLE_MAIN,  // TITLE: Saltar directament a MAIN (starfield instantani)
            // MODE_DEMO,           // GAME: Mode demostració con IA (futur)
        };

        // Constructor inicial con escena LOGO i sin opciones
        SceneContext() = default;

        // Canviar escena con opción específica
        void setNextScene(SceneType next_scene, Option option = Option::NONE) {
            next_scene_ = next_scene;
            option_ = option;
        }

        // Consultar escena destinació
        [[nodiscard]] auto nextScene() const -> SceneType {
            return next_scene_;
        }

        // Consultar opción actual
        [[nodiscard]] auto option() const -> Option {
            return option_;
        }

        // Consumir opción (retorna value i reseteja a NONE)
        // Utilitzar cuando l'escena processa l'opción
        [[nodiscard]] auto consumeOption() -> Option {
            Option value = option_;
            option_ = Option::NONE;
            return value;
        }

        // Reset opción a NONE (sin retornar value)
        void resetOption() {
            option_ = Option::NONE;
        }

        // Configurar match antes de transicionar a GAME
        void setMatchConfig(const GameConfig::MatchConfig& config) {
            match_config_ = config;
        }

        // Obtenir configuración de match (consumit per GameScene)
        [[nodiscard]] const GameConfig::MatchConfig& getMatchConfig() const {
            return match_config_;
        }

    private:
        SceneType next_scene_{SceneType::LOGO};         // SceneType a la qual transicionar
        Option option_{Option::NONE};                  // Opción específica per l'escena
        GameConfig::MatchConfig match_config_;  // Configuración de match (jugadors active, mode)
};

// Variable global inline per gestionar l'escena actual (backward compatibility)
// Sincronitzada con context.nextScene() por el Director
inline SceneContext::SceneType actual = SceneContext::SceneType::LOGO;

}  // namespace SceneManager
