
//text_helpers.h


#pragma once
#include <Arduino.h>
#include <VGA.h>

// ---------- Konfiguration ----------
// Name des Font-Arrays in deiner Font-Datei:
// Setze hier den tatsächlichen Namen, z.B. font8x8_basic oder font8x8
#ifndef FONT8X8_ARRAY
  #define FONT8X8_ARRAY font8x8    // <-- anpassen falls deine Datei anders heißt
#endif

// Wenn dein Font in PROGMEM liegt, setze dieses Makro auf 1
#ifndef FONT8X8_PROGMEM
  #define FONT8X8_PROGMEM 0       // 0 = Font im RAM, 1 = Font im PROGMEM
#endif

// Breite/Höhe des 8x8-Fonts
#define FONT8X8_W 8
#define FONT8X8_H 8

// Externes Array (wird beim Preprocessornamen ersetzt)
extern const uint8_t FONT8X8_ARRAY[96][8];

// Macro, um ein Byte aus dem Font zu holen (PROGMEM oder RAM)
#if FONT8X8_PROGMEM
  #define FONT8X8_GET(idx, row) pgm_read_byte(&(FONT8X8_ARRAY[(idx)][(row)]))
#else
  #define FONT8X8_GET(idx, row) (FONT8X8_ARRAY[(idx)][(row)])
#endif

// ---------- Helferfunktionen (benutzen vga.dotFast) ----------
/*
  drawChar8x8(x,y,ch,color)
  - zeichnet das 8x8-Zeichen ch (ASCII 32..127) oben-links bei (x,y)
  - color passt du je nach Modus an (0..7 bei 3-bit-Modus oder 16-bit RGB565)
*/
inline void drawChar8x8(VGA &vga, int x, int y, char ch, uint32_t color) {
  if ((uint8_t)ch < 32 || (uint8_t)ch > 127) return;
  uint8_t idx = (uint8_t)ch - 32;
  for (int row = 0; row < FONT8X8_H; ++row) {
    uint8_t bits = FONT8X8_GET(idx, row);
    for (int col = 0; col < FONT8X8_W; ++col) {
      if (bits & (1 << col)) {
        vga.dotFast(x + col, y + row, color);
      }
    }
  }
}

/*
  drawText8x8(x,y,text,color)
  - zeichnet Text linksbündig (x,y) mit Abstand FONT8X8_W pro Zeichen
*/
inline void drawText8x8(VGA &vga, int x, int y, const char* text, uint32_t color) {
  int px = x;
  while (*text) {
    drawChar8x8(vga, px, y, *text, color);
    px += FONT8X8_W;
    ++text;
  }
}

/*
  drawCenteredText8x8(text,color)
  - zentriert horizontal UND vertikal (voller Bildschirm)
  - verwendet globale SCREEN_W / SCREEN_H (definiere sie in deinem Sketch)
*/
inline void drawCenteredText8x8(VGA &vga, const char* text, uint32_t color, int SCREEN_W, int SCREEN_H) {
  int len = strlen(text);
  int textW = len * FONT8X8_W;
  int textH = FONT8X8_H;
  int startX = (SCREEN_W - textW) / 2;
  int startY = (SCREEN_H - textH) / 2;
  drawText8x8(vga, startX, startY, text, color);
}