// escena_joc.hpp - Lògica principal del joc
// © 1999 Visente i Sergi (versió Pascal)
// © 2025 Port a C++20 amb SDL3

#ifndef ESCENA_JOC_HPP
#define ESCENA_JOC_HPP

#include <SDL3/SDL.h>

#include <array>
#include <cstdint>

#include "../constants.hpp"
#include "../effects/debris_manager.hpp"
#include "../entities/bala.hpp"
#include "../entities/enemic.hpp"
#include "../entities/nau.hpp"
#include "../stage_system/stage_manager.hpp"
#include "core/graphics/vector_text.hpp"
#include "core/rendering/sdl_manager.hpp"
#include "core/system/context_escenes.hpp"
#include "core/types.hpp"

#include <memory>

// Classe principal del joc (escena)
class EscenaJoc {
    public:
        explicit EscenaJoc(SDLManager& sdl, GestorEscenes::ContextEscenes& context);
        ~EscenaJoc() = default;

        void executar();  // Bucle principal de l'escena
        void inicialitzar();
        void actualitzar(float delta_time);
        void dibuixar();
        void processar_input(const SDL_Event& event);

    private:
        SDLManager& sdl_;
        GestorEscenes::ContextEscenes& context_;

        // Efectes visuals
        Effects::DebrisManager debris_manager_;

        // Estat del joc
        Nau nau_;
        std::array<Enemic, Constants::MAX_ORNIS> orni_;
        std::array<Bala, Constants::MAX_BALES> bales_;
        Poligon chatarra_cosmica_;
        float itocado_;  // Death timer (seconds)

        // Lives and game over system
        int num_vides_;          // Current lives count
        bool game_over_;         // Game over state flag
        float game_over_timer_;  // Countdown timer for auto-return (seconds)
        Punt punt_spawn_;        // Configurable spawn point

        // Text vectorial
        Graphics::VectorText text_;

        // [NEW] Stage system
        std::unique_ptr<StageSystem::ConfigSistemaStages> stage_config_;
        std::unique_ptr<StageSystem::StageManager> stage_manager_;

        // Funcions privades
        void tocado();
        void detectar_col·lisions_bales_enemics();  // Col·lisions bala-enemic
        void detectar_col·lisio_nau_enemics();      // Ship-enemy collision detection
        void dibuixar_marges() const;               // Dibuixar vores de la zona de joc
        void dibuixar_marcador();                   // Dibuixar marcador de puntuació

        // [NEW] Stage system helpers
        void dibuixar_missatge_stage(const std::string& missatge);
};

#endif  // ESCENA_JOC_HPP
