#include <WiFi.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <Keypad.h>

#define TFT_CS 5
#define TFT_RESET 22
#define TFT_DC 21

#define CAPACITOR_3V3 2
#define CAPACITOR_GND 4

#define LED_WIFI_CONNECTED 25
#define LED_WIFI_DISCONNECTED 26

Adafruit_ILI9341 tft(TFT_CS, TFT_DC, TFT_RESET);

const char *ssid = "Wokwi-GUEST";
const char *password = "";

const byte ROWS = 4; // Definindo o número de linhas do teclado de membrana
const byte COLS = 4; // Definindo o número de colunas do teclado de membrana

char keys[ROWS][COLS] = { // Definindo os rótulos das teclas do teclado de membrana
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

uint8_t rowPins[ROWS] = {9, 8, 7, 6}; // Pinos conectados às linhas do teclado de membrana
uint8_t colPins[COLS] = {5, 4, 3, 2}; // Pinos conectados às colunas do teclado de membrana

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); // Inicializando o teclado de membrana

void conectarAoWiFi();
void exibirQRCode(const char *url);
void sendHtml();
void controlarLEDsWifi();
void processarTeclado(char key); // Assinatura da função processarTeclado

bool wifiConnected = false;

void setup()
{
  pinMode(CAPACITOR_3V3, OUTPUT);
  pinMode(CAPACITOR_GND, OUTPUT);
  digitalWrite(CAPACITOR_3V3, HIGH);
  digitalWrite(CAPACITOR_GND, LOW);

  pinMode(LED_WIFI_CONNECTED, OUTPUT);
  pinMode(LED_WIFI_DISCONNECTED, OUTPUT);

  delay(1000);
  Serial.begin(115200);
  delay(1000);
  Serial.println("- setup() started -");

  tft.begin();
  tft.setRotation(2);
  tft.fillScreen(ILI9341_BLACK);

  conectarAoWiFi(); // Conecta ao Wi-Fi ao iniciar

  // Ajuste o código para iniciar o servidor HTTP, se necessário
  // server.on("/", HTTP_GET, sendHtml);
  // server.begin();

  Serial.println("HTTP server started");
}

void loop()
{
  // Ajuste o código para manipular as requisições do servidor HTTP, se necessário
  // server.handleClient();

  char key = keypad.getKey(); // Captura a tecla pressionada pelo teclado de membrana
  if (key != NO_KEY)
  {
    processarTeclado(key); // Processa a tecla pressionada
  }
  // Outras tarefas podem ser adicionadas aqui, se necessário
}

void processarTeclado(char key)
{
  switch (key)
  {
    case '1':
      exibirQRCode("www.uteiserazoaveis.com");
      break;
    case '2':
      exibirQRCode("www.uteiserazoaveis.com/seo");
      break;
    case '3':
      exibirQRCode("www.uteiserazoaveis.com/programacao");
      break;
    case '4':
      exibirQRCode("www.uteiserazoaveis.com/web-designer");
      break;
    case '5':
      exibirQRCode("www.uteiserazoaveis.com/conteudos");
      break;
    case '6':
      exibirQRCode("www.uteiserazoaveis.com/marketing-e-comunicacao");
      break;
    default:
      // Lógica para tratar outras teclas pressionadas, se necessário
      break;
  }
}

void conectarAoWiFi()
{
  // Lógica para conexão Wi-Fi
}

void exibirQRCode(const char *url)
{
  // Implemente aqui a lógica para desenhar o QR Code na tela
}

void sendHtml()
{
  // Lógica para enviar o HTML para o cliente
}

void controlarLEDsWifi()
{
  // Lógica para controlar os LEDs indicadores de status do Wi-Fi
}