#pragma once

#include <vector>
#include "defines.hpp"  // for Color, ThemeKeyframe

/**
 * Theme: Interfaz polimórfica para todos los temas (estáticos y dinámicos)
 *
 * Responsabilidades:
 * - Proporcionar información básica del tema (nombre, color de texto)
 * - Generar colores interpolados para pelotas y fondo
 * - Actualizar estado interno si es animado (solo dinámicos)
 *
 * Implementaciones:
 * - StaticTheme: 1 keyframe, sin animación, colores fijos
 * - DynamicTheme: N keyframes, animación continua con loop
 */
class Theme {
    public:
        virtual ~Theme() = default;

        // ========================================
        // QUERIES BÁSICAS (implementar en derivadas)
        // ========================================

        virtual const char* getNameEN() const = 0;
        virtual const char* getNameES() const = 0;
        virtual void getTextColor(int& r, int& g, int& b) const = 0;
        virtual void getNotificationBackgroundColor(int& r, int& g, int& b) const = 0;

        // ========================================
        // CORE: OBTENER COLORES (polimórfico)
        // ========================================

        /**
         * Obtiene color de pelota según índice y progreso de animación
         * @param ball_index: Índice de pelota (para seleccionar color de paleta)
         * @param progress: Progreso 0.0-1.0 si hay transición LERP externa (PHASE 3)
         * @return Color interpolado para esta pelota
         */
        virtual Color getBallColor(size_t ball_index, float progress) const = 0;

        /**
         * Obtiene colores de fondo degradado (top/bottom)
         * @param progress: Progreso 0.0-1.0 si hay transición LERP externa (PHASE 3)
         * @param tr, tg, tb: Color superior (out)
         * @param br, bg, bb: Color inferior (out)
         */
        virtual void getBackgroundColors(float progress,
                                         float& tr, float& tg, float& tb,
                                         float& br, float& bg, float& bb) const = 0;

        // ========================================
        // ANIMACIÓN (solo temas dinámicos)
        // ========================================

        /**
         * Actualiza progreso de animación interna (solo dinámicos)
         * @param delta_time: Tiempo transcurrido desde último frame
         */
        virtual void update(float delta_time) { }

        /**
         * ¿Este tema necesita update() cada frame?
         * @return false para estáticos, true para dinámicos
         */
        virtual bool needsUpdate() const { return false; }

        /**
         * Obtiene progreso actual de animación interna
         * @return 0.0 para estáticos, 0.0-1.0 para dinámicos
         */
        virtual float getProgress() const { return 0.0f; }

        /**
         * Reinicia progreso de animación a 0.0 (usado al activar tema)
         */
        virtual void resetProgress() { }

        // ========================================
        // PAUSA (solo temas dinámicos)
        // ========================================

        /**
         * ¿Está pausado? (solo dinámicos)
         * @return false para estáticos, true/false para dinámicos
         */
        virtual bool isPaused() const { return false; }

        /**
         * Toggle pausa de animación (solo dinámicos, tecla Shift+D)
         */
        virtual void togglePause() { }
};
