// escena_titol.hpp - Pantalla de títol del joc
// Mostra missatge "PRESS BUTTON TO PLAY" i copyright
// © 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/graphics/starfield.hpp"
#include "core/graphics/vector_text.hpp"
#include "core/input/input_types.hpp"
#include "core/rendering/sdl_manager.hpp"
#include "core/system/context_escenes.hpp"
#include "core/system/game_config.hpp"
#include "core/types.hpp"
#include "game/title/ship_animator.hpp"

// Botones para INICIAR PARTIDA desde MAIN (solo START)
static constexpr std::array<InputAction, 1> START_GAME_BUTTONS = {
    InputAction::START};

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

    private:
        // Màquina d'estats per la pantalla de títol
        enum class EstatTitol {
            STARFIELD_FADE_IN,  // Fade-in del starfield (3.0s)
            STARFIELD,          // Pantalla amb camp d'estrelles (4.0s)
            MAIN,               // Pantalla de títol amb text (indefinit, fins START)
            PLAYER_JOIN_PHASE,  // Fase d'unió de jugadors: fade-out música + text parpellejant (2.5s)
            BLACK_SCREEN        // Pantalla negra de transició (2.0s)
        };

        // Estructura per emmagatzemar informació de cada lletra del títol
        struct LetraLogo {
                std::shared_ptr<Graphics::Shape> forma;  // Forma vectorial de la lletra
                Punt posicio;                            // Posició en pantalla
                float ancho;                             // Amplada escalada
                float altura;                            // Altura escalada
                float offset_centre;                     // Offset del centre per posicionament
        };

        SDLManager& sdl_;
        GestorEscenes::ContextEscenes& context_;
        GameConfig::ConfigPartida config_partida_;            // Configuració de jugadors actius
        Graphics::VectorText text_;                           // Sistema de text vectorial
        std::unique_ptr<Graphics::Starfield> starfield_;      // Camp d'estrelles de fons
        std::unique_ptr<Title::ShipAnimator> ship_animator_;  // Naus 3D flotants
        EstatTitol estat_actual_;                             // Estat actual de la màquina
        float temps_acumulat_;                                // Temps acumulat per l'estat INIT

        // Lletres del títol "ORNI ATTACK!"
        std::vector<LetraLogo> lletres_orni_;    // Lletres de "ORNI" (línia 1)
        std::vector<LetraLogo> lletres_attack_;  // Lletres de "ATTACK!" (línia 2)
        float y_attack_dinamica_;                // Posició Y calculada dinàmicament per "ATTACK!"

        // Estat d'animació del logo
        float temps_animacio_;                          // Temps acumulat per animació orbital
        std::vector<Punt> posicions_originals_orni_;    // Posicions originals de "ORNI"
        std::vector<Punt> posicions_originals_attack_;  // Posicions originals de "ATTACK!"

        // Estat d'arrencada de l'animació
        float temps_estat_main_;  // Temps acumulat en estat MAIN
        bool animacio_activa_;    // Flag: true quan animació està activa
        float factor_lerp_;       // Factor de lerp actual (0.0 → 1.0)

        // Constants
        static constexpr float BRIGHTNESS_STARFIELD = 1.2f;  // Brightness del starfield (>1.0 = més brillant)
        static constexpr float DURACIO_FADE_IN = 3.0f;       // Duració del fade-in del starfield (1.5 segons)
        static constexpr float DURACIO_INIT = 4.0f;          // Duració de l'estat INIT (2 segons)
        static constexpr float DURACIO_TRANSITION = 2.5f;    // Duració de la transició (1.5 segons)
        static constexpr float ESPAI_ENTRE_LLETRES = 10.0f;  // Espai entre lletres
        static constexpr float BLINK_FREQUENCY = 3.0f;       // Freqüència de parpelleig (3 Hz)
        static constexpr float DURACIO_BLACK_SCREEN = 2.0f;  // Duració pantalla negra (2 segons)
        static constexpr int MUSIC_FADE = 1500;              // Duracio del fade de la musica del titol al començar a jugar

        // Constants d'animació del logo
        static constexpr float ORBIT_AMPLITUDE_X = 4.0f;    // Amplitud oscil·lació horitzontal (píxels)
        static constexpr float ORBIT_AMPLITUDE_Y = 3.0f;    // Amplitud oscil·lació vertical (píxels)
        static constexpr float ORBIT_FREQUENCY_X = 0.8f;    // Velocitat oscil·lació horitzontal (Hz)
        static constexpr float ORBIT_FREQUENCY_Y = 1.2f;    // Velocitat oscil·lació vertical (Hz)
        static constexpr float ORBIT_PHASE_OFFSET = 1.57f;  // Desfasament entre X i Y (90° per circular)

        // Constants d'ombra del logo
        static constexpr float SHADOW_DELAY = 0.5f;       // Retard temporal de l'ombra (segons)
        static constexpr float SHADOW_BRIGHTNESS = 0.4f;  // Multiplicador de brillantor de l'ombra (0.0-1.0)
        static constexpr float SHADOW_OFFSET_X = 2.0f;    // Offset espacial X fix (píxels)
        static constexpr float SHADOW_OFFSET_Y = 2.0f;    // Offset espacial Y fix (píxels)

        // Temporització de l'arrencada de l'animació
        static constexpr float DELAY_INICI_ANIMACIO = 10.0f;  // 10s estàtic abans d'animar
        static constexpr float DURACIO_LERP = 2.0f;           // 2s per arribar a amplitud completa

        // Mètodes privats
        void actualitzar(float delta_time);
        void actualitzar_animacio_logo(float delta_time);  // Actualitza l'animació orbital del logo
        void dibuixar();
        void processar_events(const SDL_Event& event);
        auto checkSkipButtonPressed() -> bool;
        auto checkStartGameButtonPressed() -> bool;
        void inicialitzar_titol();  // Carrega i posiciona les lletres del títol
};
