// ship_animator.hpp - Sistema d'animació de naus per a l'escena de títol
// © 2025 Port a C++20 amb SDL3

#pragma once

#include <SDL3/SDL.h>

#include <array>
#include <memory>

#include "core/graphics/shape.hpp"
#include "core/rendering/shape_renderer.hpp"
#include "core/types.hpp"

namespace Title {

// Estats de l'animació de la nau
enum class EstatNau {
    ENTERING,  // Entrant des de fora de pantalla
    FLOATING,  // Flotant en posició estàtica
    EXITING    // Volant cap al punt de fuga
};

// Dades d'una nau individual al títol
struct NauTitol {
        // Identificació
        int jugador_id;  // 1 o 2

        // Estat
        EstatNau estat;
        float temps_estat;  // Temps acumulat en l'estat actual

        // Posicions
        Punt posicio_inicial;   // Posició d'inici (fora de pantalla per ENTERING)
        Punt posicio_objectiu;  // Posició objectiu (rellotge 8 o 4)
        Punt posicio_actual;    // Posició interpolada actual

        // Escales (simulació eix Z)
        float escala_inicial;   // Escala d'inici (més gran = més a prop)
        float escala_objectiu;  // Escala objectiu (mida flotació)
        float escala_actual;    // Escala interpolada actual

        // Flotació
        float fase_oscilacio;  // Acumulador de fase per moviment sinusoïdal

        // Paràmetres d'entrada
        float entry_delay;  // Delay abans d'entrar (0.0 per P1, 0.5 per P2)

        // Paràmetres d'oscil·lació per nau
        float amplitude_x;
        float amplitude_y;
        float frequency_x;
        float frequency_y;

        // Forma
        std::shared_ptr<Graphics::Shape> forma;

        // Visibilitat
        bool visible;
};

// Gestor d'animació de naus per a l'escena de títol
class ShipAnimator {
    public:
        explicit ShipAnimator(SDL_Renderer* renderer);

        // Cicle de vida
        void inicialitzar();
        void actualitzar(float delta_time);
        void dibuixar() const;

        // Control d'estat (cridat per EscenaTitol)
        void start_entry_animation();
        void trigger_exit_animation();                           // Anima totes les naus
        void trigger_exit_animation_for_player(int jugador_id);  // Anima només una nau (P1=1, P2=2)

        // Control de visibilitat
        void set_visible(bool visible);
        bool is_animation_complete() const;

    private:
        SDL_Renderer* renderer_;
        std::array<NauTitol, 2> naus_;  // Naus P1 i P2

        // Mètodes d'animació
        void actualitzar_entering(NauTitol& nau, float delta_time);
        void actualitzar_floating(NauTitol& nau, float delta_time);
        void actualitzar_exiting(NauTitol& nau, float delta_time);

        // Configuració
        void configurar_nau_p1(NauTitol& nau);
        void configurar_nau_p2(NauTitol& nau);
        Punt calcular_posicio_fora_pantalla(float angle_rellotge) const;
};

}  // namespace Title
