#include <Arduino.h>
#include <SoftwareSerial.h>

#define MQTT_CONNECT 0x10
#define MQTT_CONNACK 0x20
#define MQTT_PUBLISH 0x30
#define MQTT_SUBSCRIBE 0x82
#define MQTT_SUBACK 0x90
#define MQTT_DISCONNECT 0xE0

SoftwareSerial Serial1(10, 11); // RX, TX

void setup() {
  Serial.begin(115200);
  Serial1.begin(9600); // Soros port a MQTT klienshez
  Serial.println("MQTT Broker Indítás");
}

void loop() {
  if (Serial.available()) {
    handleMQTTMessage();
  }
}

void handleMQTTMessage() {
  byte packetType = Serial1.read();
  switch (packetType) {
    case MQTT_CONNECT:
      handleConnect();
      break;
    case MQTT_PUBLISH:
      handlePublish();
      break;
    case MQTT_SUBSCRIBE:
      handleSubscribe();
      break;
    case MQTT_DISCONNECT:
      handleDisconnect();
      break;
    default:
      Serial.println("Ismeretlen üzenettípus.");
  }
}

void handleConnect() {
  Serial.println("MQTT CONNECT Üzenet Fogadva");
  byte connack[] = { MQTT_CONNACK, 0x00, 0x00, 0x00 };
  Serial1.write(connack, sizeof(connack));
}

void handlePublish() {
  Serial.println("MQTT PUBLISH Üzenet Fogadva");
  int topicLength = Serial1.read() << 8 | Serial1.read();
  char topic[topicLength + 1];
  Serial1.readBytes(topic, topicLength);
  topic[topicLength] = '\0';

  int messageLength = Serial1.available();
  char message[messageLength + 1];
  Serial1.readBytes(message, messageLength);
  message[messageLength] = '\0';

  Serial.print("Téma: ");
  Serial.println(topic);
  Serial.print("Üzenet: ");
  Serial.println(message);

  // Üzenet továbbítása minden előfizetőnek (a megvalósítás hiányzik)
}

void handleSubscribe() {
  Serial.println("MQTT SUBSCRIBE Üzenet Fogadva");
  int topicLength = Serial1.read() << 8 | Serial1.read();
  char topic[topicLength + 1];
  Serial1.readBytes(topic, topicLength);
  topic[topicLength] = '\0';

  // Előfizetés regisztrálása (a megvalósítás hiányzik)

  byte suback[] = { MQTT_SUBACK, 0x00, 0x00, 0x00, 0x00 };
  Serial1.write(suback, sizeof(suback));
}

void handleDisconnect() {
  Serial.println("MQTT DISCONNECT Üzenet Fogadva");
  // Kapcsolat bontása (a megvalósítás hiányzik)
}