#pragma once
#include <SDL3/SDL.h>

struct Color {
    Uint8 r;
    Uint8 g;
    Uint8 b;
};

namespace Jd8 {

    using Surface = Uint8*;
    using Palette = Color*;

    void init();

    void quit();

    void clearScreen(Uint8 color);

    auto newSurface() -> Surface;

    auto loadSurface(const char* file) -> Surface;

    auto loadPalette(const char* file) -> Palette;

    void setScreenPalette(Palette palette);

    void fillSquare(int ini, int height, Uint8 color);

    // Omple un rectangle arbitrari de la pantalla amb un color paletat.
    // Pensat per a UI senzilla (barra de progrés del BootLoader, etc.).
    void fillRect(int x, int y, int w, int h, Uint8 color);

    void blit(const Uint8* surface);

    void blit(int x, int y, const Uint8* surface, int sx, int sy, int sw, int sh);

    void blitToSurface(int x, int y, const Uint8* surface, int sx, int sy, int sw, int sh, Surface dest);

    void blitCK(int x, int y, const Uint8* surface, int sx, int sy, int sw, int sh, Uint8 colorkey);

    void blitCKCut(int x, int y, const Uint8* surface, int sx, int sy, int sw, int sh, Uint8 colorkey);

    void blitCKScroll(int y, const Uint8* surface, int sx, int sy, int sh, Uint8 colorkey);

    void blitCKToSurface(int x, int y, const Uint8* surface, int sx, int sy, int sw, int sh, Surface dest, Uint8 colorkey);

    // Converteix la pantalla indexada a ARGB. El Director crida aquesta
    // funció al final de cada tick i després llegeix el framebuffer via
    // getFramebuffer() per presentar-lo.
    void flip();

    // Accés al framebuffer ARGB de 320x200 actualitzat per l'última crida a
    // flip(). Propietat de jdraw8 — el caller no ha de lliberar-lo.
    auto getFramebuffer() -> Uint32*;

    void freeSurface(Surface surface);

    auto getPixel(const Uint8* surface, int x, int y) -> Uint8;

    void putPixel(Surface surface, int x, int y, Uint8 pixel);

    void setPaletteColor(Uint8 index, Uint8 r, Uint8 g, Uint8 b);

    // API de fade no bloquejant (màquina d'estats). `fadeStart*` inicia el
    // fade; `fadeTickStep` aplica un pas i retorna `true` quan el fade ha
    // acabat. Un pas correspon visualment a una iteració del fade original
    // (32 passos en total). El caller és responsable de fer el Flip entre
    // passos si el vol veure animat. `fadeIsActive` permet saber si hi ha
    // un fade en curs per a enllaçar-lo amb un altre subsistema.
    // L'embolcall `Scenes::PaletteFade` ho fa més idiomàtic per a escenes.
    void fadeStartOut();
    void fadeStartToPal(const Color* pal);
    auto fadeTickStep() -> bool;
    auto fadeIsActive() -> bool;

}  // namespace Jd8
