#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#include "Font_Data.h"
// Definisci il tipo di hardware e il numero di moduli
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_ZONES 2
#define ZONE_SIZE 4  // 4 moduli in orizzontale per zona
#define MAX_DEVICES (MAX_ZONES * ZONE_SIZE)
#define ZONE_LOWER 0
#define ZONE_UPPER 1
bool invertUpperZone = false;
// Alignment of the two zones
#ifdef INVERT_UPPER_ZONE
// if inverted, alignment should be opposite and
// CENTER may not work well depending on message
#define ALIGN_LOWER PA_LEFT
#define ALIGN_UPPER PA_RIGHT
#else
// if not inverted, should always be the same
#define ALIGN_LOWER PA_CENTER
#define ALIGN_UPPER ALIGN_LOWER
#endif
// Definisci i pin di connessione
#define DATA_PIN 23 // BLU
#define CLK_PIN 18  // GIALLO
#define CS_PIN 5    // GRIGIO
MD_Parola parola = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
// Testo da visualizzare
String scroller = "Ciao Amici!";
uint16_t scrollSpeed = 100;
textEffect_t effectIn = PA_SCROLL_LEFT;
textEffect_t effectOut = PA_SCROLL_LEFT;
void setup() {
  // uint8_t max = 0;
  invertUpperZone = (HARDWARE_TYPE == MD_MAX72XX::PAROLA_HW || HARDWARE_TYPE == MD_MAX72XX::GENERIC_HW);
  // catalog = (invertUpperZone ? catalogInvert : catalogNoInvert);
  Serial.begin(115200);
  parola.begin(MAX_ZONES);  // Inizializza Parola con 2 zone
  // Configura le zone
  parola.setZone(ZONE_LOWER, 0, ZONE_SIZE - 1);  // Prima riga (moduli 0-11)
  parola.setFont(ZONE_LOWER, BigFontLower);
  parola.setZone(ZONE_UPPER, ZONE_SIZE, MAX_DEVICES - 1); // Seconda riga (moduli 12-23)
  parola.setFont(ZONE_UPPER, BigFontUpper);
  parola.setZoneEffect(ZONE_UPPER, true, PA_FLIP_UD); // Capovolgi la seconda riga
  parola.setZoneEffect(ZONE_UPPER, true, PA_FLIP_LR);
  parola.setCharSpacing(parola.getCharSpacing() * 2); // double height --> double spacing
  if (invertUpperZone)
  {
    parola.setZoneEffect(ZONE_UPPER, true, PA_FLIP_UD);
    parola.setZoneEffect(ZONE_UPPER, true, PA_FLIP_LR);
     }
  parola.setIntensity(0); // Imposta la luminosità (0-15)
  parola.displayClear();
  parola.displayText(scroller.c_str(), PA_CENTER, scrollSpeed, 0, effectIn, effectOut);
  parola.displayAnimate();
 }
void loop() {
    parola.displayZoneText(ZONE_LOWER, scroller.c_str(), PA_CENTER, scrollSpeed, 0, effectIn, effectOut);
    parola.displayZoneText(ZONE_UPPER, scroller.c_str(), PA_CENTER, scrollSpeed, 0, effectIn, effectOut);
    //parola.synchZoneStart(); // Sincronizza l'inizio dell'animazione
  // Continua l'animazione del messaggio
  if (parola.displayAnimate()) {
    parola.displayReset();
  //if (parola.getZoneStatus(ZONE_LOWER) && parola.getZoneStatus(ZONE_UPPER)) {
   // parola.displayAnimate(); // Avvia l'animazione per sincronizzare le zone
  }
}