// context_escenes.hpp - Sistema de gestió d'escenes i context de transicions
// © 2025 Port a C++20

#pragma once

#include "core/system/game_config.hpp"

namespace GestorEscenes {

// Context de transició entre escenes
// Conté l'escena destinació i opcions específiques per aquella escena
class ContextEscenes {
    public:
        // Tipus d'escena del joc
        enum class Escena {
            LOGO,   // Pantalla d'inici (logo JAILGAMES)
            TITOL,  // Pantalla de títol amb menú
            JOC,    // Joc principal (Asteroids)
            EIXIR   // Sortir del programa
        };

        // Opcions específiques per a cada escena
        enum class Opcio {
            NONE,                // Sense opcions especials (comportament per defecte)
            JUMP_TO_TITLE_MAIN,  // TITOL: Saltar directament a MAIN (starfield instantani)
            // MODE_DEMO,           // JOC: Mode demostració amb IA (futur)
        };

        // Constructor inicial amb escena LOGO i sense opcions
        ContextEscenes() = default;

        // Canviar escena amb opció específica
        void canviar_escena(Escena nova_escena, Opcio opcio = Opcio::NONE) {
            escena_desti_ = nova_escena;
            opcio_ = opcio;
        }

        // Consultar escena destinació
        [[nodiscard]] auto escena_desti() const -> Escena {
            return escena_desti_;
        }

        // Consultar opció actual
        [[nodiscard]] auto opcio() const -> Opcio {
            return opcio_;
        }

        // Consumir opció (retorna valor i reseteja a NONE)
        // Utilitzar quan l'escena processa l'opció
        [[nodiscard]] auto consumir_opcio() -> Opcio {
            Opcio valor = opcio_;
            opcio_ = Opcio::NONE;
            return valor;
        }

        // Reset opció a NONE (sense retornar valor)
        void reset_opcio() {
            opcio_ = Opcio::NONE;
        }

        // Configurar partida abans de transicionar a JOC
        void set_config_partida(const GameConfig::ConfigPartida& config) {
            config_partida_ = config;
        }

        // Obtenir configuració de partida (consumit per EscenaJoc)
        [[nodiscard]] const GameConfig::ConfigPartida& get_config_partida() const {
            return config_partida_;
        }

    private:
        Escena escena_desti_{Escena::LOGO};         // Escena a la qual transicionar
        Opcio opcio_{Opcio::NONE};                  // Opció específica per l'escena
        GameConfig::ConfigPartida config_partida_;  // Configuració de partida (jugadors actius, mode)
};

// Variable global inline per gestionar l'escena actual (backward compatibility)
// Sincronitzada amb context.escena_desti() pel Director
inline ContextEscenes::Escena actual = ContextEscenes::Escena::LOGO;

}  // namespace GestorEscenes
