#include "displayText.h"
#include "Arduino.h"

//constructor
DisplayText::DisplayText(Adafruit_ST7796S_kbv& tftDisplay) : tft(tftDisplay) {
  tft.setCursor(0,0);
  tft.fillScreen(ST7796S_BLACK);
}
//display text public function
void DisplayText::writeText(char* text, int size, int posX, int posY, int screenTime, bool center, bool bottom) {
  if (center) {
    posX = centerText(text);
  }
  // if (bottom) {
  //   posY = bottomText(text);
  // }
  tft.setCursor(posX, posY);
  tft.setTextSize(size);
  printWordsFull(text);
  delay(screenTime);
}

//to center the text when enabled in the public function
int DisplayText::centerText(char* text) {
  int16_t x1, y1; 
  uint16_t w, h;
  tft.getTextBounds(text, 0, 0, &x1, &y1, &w, &h);
  int x = (tft.width() - w) / 2;
  return x;
}

// //to display the text at the bottom when enabled in the public function
// int DisplayText::bottomText(char* text) {
//   int16_t x1, y1;
//   uint16_t w, h;
//   tft.getTextBounds(text, 0, 0, &x1, &y1, &w, &h);
//   int y = (tft.height() - h);
//   return y;
// }

//attempt to write the text out in full (wip)
void DisplayText::printWordsFull(char* text) {
    const int screenWidth = 320; // replace with your TFT display width
    const int lineHeight = 22; // replace with your text line height

    char* word = strtok(text, " ");
    char line[100] = "";
    int lineCount = 0;

    while (word != NULL) {
        char tempLine[100];
        strcpy(tempLine, line);
        strcat(tempLine, word);
        strcat(tempLine, " ");

        int16_t x1, y1;
        uint16_t w, h;
        tft.getTextBounds(tempLine, 0, 0, &x1, &y1, &w, &h);

        if (w > screenWidth && strlen(line) > 0) {
            tft.setCursor(0, lineHeight * lineCount);
            tft.println(line);
            lineCount++;
            strcpy(line, word);
            strcat(line, " ");
        } else {
            strcpy(line, tempLine);
        }

        word = strtok(NULL, " ");
    }

    // print the last line
    tft.setCursor(0, lineHeight * lineCount);
    tft.println(line);
}