//  sdl_manager.hpp - Gestor de inicialización de SDL3
// © 2025 Port a C++20 con SDL3
//
// Tras la Fase 7 de la migración, el rendering ya no usa SDL_Renderer:
// SDLManager posee un GpuFrameRenderer (SDL3 GPU) que es el contexto único
// de dibujo del juego. El resto del código accede vía getRenderer() →
// Rendering::Renderer* (alias del GpuFrameRenderer).

#pragma once

#include <SDL3/SDL.h>

#include <cstdint>

#include "core/rendering/render_context.hpp"

class SDLManager {
    public:
        SDLManager();                                        // Constructor per defecte (usa Defaults::)
        SDLManager(int width, int height, bool fullscreen);  // Constructor con configuración
        ~SDLManager();

        // No permetre còpia ni assignació
        SDLManager(const SDLManager&) = delete;
        auto operator=(const SDLManager&) -> SDLManager& = delete;

        // [NUEVO] Gestió de finestra dinàmica
        void increaseWindowSize();                       // F2: +100px
        void decreaseWindowSize();                       // F1: -100px
        void toggleFullscreen();                         // F3
        void toggleVSync();                              // F4
        auto handleWindowEvent(const SDL_Event& event) -> bool;  // Per a SDL_EVENT_WINDOW_RESIZED

        // Funciones principals (renderizado)
        void clear(uint8_t r = 0, uint8_t g = 0, uint8_t b = 0);
        void present();

        // Getters
        auto getRenderer() -> Rendering::Renderer* { return &gpu_renderer_; }
        [[nodiscard]] auto getScaleFactor() const -> float { return zoom_factor_; }

        // [NUEVO] Actualitzar context de renderizado (factor de scale global)
        void updateRenderingContext() const;

    private:
        SDL_Window* finestra_;
        Rendering::Renderer gpu_renderer_;  // GpuFrameRenderer (SDL3 GPU)

        // [NUEVO] Estat de la finestra
        int current_width_;  // Mida física actual
        int current_height_;
        bool is_fullscreen_;
        int max_width_;  // Calculat des del display
        int max_height_;

        // [ZOOM SYSTEM]
        float zoom_factor_;    // Current zoom (0.5x to max_zoom_)
        int windowed_width_;   // Saved size before fullscreen
        int windowed_height_;  // Saved size before fullscreen
        float max_zoom_;       // Maximum zoom (calculated from display)

        // [NUEVO] Funciones internes
        void calculateMaxWindowSize();                // Llegir resolució del display
        void calculateMaxZoom();                      // Calculate max zoom from display
        void applyZoom(float new_zoom);               // Apply zoom and resize window
        void applyWindowSize(int width, int height);  // Canviar mida + centrar
        void updateViewport();                        // Configurar viewport con letterbox

};
