// 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 "../../core/graphics/shape.hpp"
#include "../../core/rendering/sdl_manager.hpp"
#include "../../core/types.hpp"
#include <SDL3/SDL.h>
#include <memory>
#include <vector>

class EscenaLogo {
public:
  explicit EscenaLogo(SDLManager &sdl);
  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
  };

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

  // 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

  // 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 =
      4.0f; // Duració POST_ANIMATION (logo complet)
  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 =
      640.0f / 2.0f; // Punt inicial X del zoom (320)
  static constexpr float ORIGEN_ZOOM_Y =
      480.0f * 0.4f; // Punt inicial Y del zoom (240)

  // Mètodes privats
  void inicialitzar_lletres();
  void actualitzar(float delta_time);
  void dibuixar();
  void processar_events(const SDL_Event &event);

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