// escena_logo.hpp - Pantalla d'inici del joc
// Mostra logo JAILGAMES animat amb zoom i salta al joc
// © 2025 Port a C++20

#pragma once

#include <SDL3/SDL.h>

#include <array>
#include <memory>
#include <vector>

#include "core/defaults.hpp"
#include "core/graphics/shape.hpp"
#include "core/input/input_types.hpp"
#include "core/rendering/sdl_manager.hpp"
#include "core/system/context_escenes.hpp"
#include "core/types.hpp"
#include "game/effects/debris_manager.hpp"

class EscenaLogo {
    public:
        explicit EscenaLogo(SDLManager& sdl, GestorEscenes::ContextEscenes& context);
        ~EscenaLogo();    // Destructor per aturar sons
        void executar();  // Bucle principal de l'escena

    private:
        // Màquina d'estats per l'animació
        enum class EstatAnimacio {
            PRE_ANIMATION,   // Pantalla negra inicial
            ANIMATION,       // Animació de zoom de lletres
            POST_ANIMATION,  // Logo complet visible
            EXPLOSION,       // Explosió seqüencial de lletres
            POST_EXPLOSION   // Espera després de l'última explosió
        };

        SDLManager& sdl_;
        GestorEscenes::ContextEscenes& context_;
        EstatAnimacio estat_actual_;  // Estat actual de la màquina
        float
            temps_estat_actual_;  // Temps en l'estat actual (reset en cada transició)

        // Gestor de fragments d'explosions
        std::unique_ptr<Effects::DebrisManager> debris_manager_;

        // Seguiment d'explosions seqüencials
        size_t lletra_explosio_index_;        // Índex de la següent lletra a explotar
        float temps_des_ultima_explosio_;     // Temps des de l'última explosió
        std::vector<size_t> ordre_explosio_;  // Ordre aleatori d'índexs de lletres

        // Estructura per a cada lletra del logo
        struct LetraLogo {
                std::shared_ptr<Graphics::Shape> forma;
                Punt posicio;         // Posició final en pantalla
                float ancho;          // Ancho del bounding box
                float offset_centre;  // Distància de min_x a shape_centre.x
        };

        std::vector<LetraLogo> lletres_;  // 9 lletres: J-A-I-L-G-A-M-E-S

        // Seguiment de sons de lletres (evitar reproduccions repetides)
        std::array<bool, 9> so_reproduit_;  // Track si cada lletra ja ha reproduit el so

        // Constants d'animació
        static constexpr float DURACIO_PRE = 1.5F;             // Duració PRE_ANIMATION (pantalla negra)
        static constexpr float DURACIO_ZOOM = 4.0F;            // Duració del zoom (segons)
        static constexpr float DURACIO_POST_ANIMATION = 3.0F;  // Duració POST_ANIMATION (logo complet)
        static constexpr float DURACIO_POST_EXPLOSION = 3.0F;  // Duració POST_EXPLOSION (espera final)
        static constexpr float DELAY_ENTRE_EXPLOSIONS = 0.1F;  // Temps entre explosions de lletres
        static constexpr float VELOCITAT_EXPLOSIO = 240.0F;    // Velocitat base fragments (px/s)
        static constexpr float ESCALA_INICIAL = 0.1F;          // Escala inicial (10%)
        static constexpr float ESCALA_FINAL = 0.8F;            // Escala final (80%)
        static constexpr float ESPAI_ENTRE_LLETRES = 10.0F;    // Espaiat entre lletres

        // Constants d'animació seqüencial
        static constexpr float THRESHOLD_LETRA = 0.6F;                         // Umbral per activar següent lletra (0.0-1.0)
        static constexpr float ORIGEN_ZOOM_X = Defaults::Game::WIDTH * 0.5F;   // Punt inicial X del zoom
        static constexpr float ORIGEN_ZOOM_Y = Defaults::Game::HEIGHT * 0.4F;  // Punt inicial Y del zoom

        // Mètodes privats
        void inicialitzar_lletres();
        void actualitzar(float delta_time);
        void actualitzar_explosions(float delta_time);
        void dibuixar();
        void processar_events(const SDL_Event& event);
        auto checkSkipButtonPressed() -> bool;

        // Mètodes de gestió d'estats
        void canviar_estat(EstatAnimacio nou_estat);
        [[nodiscard]] bool totes_lletres_completes() const;
};
