#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>

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

const char* mqtt_server = "broker.emqx.io";
const char* mqtt_topic = "dengiaothong";
const char* MQTT_ID = "esp32_led_client";

#define GREEN_LED 5
#define YELLOW_LED 4
#define RED_LED 2

WiFiClient espClient;
PubSubClient client(espClient);

int green_time = 0, yellow_time = 0, red_time = 0;
bool newDataReceived = false;

void setup() {
  Serial.begin(115200);

  // Kết nối WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi đã kết nối thành công!");

  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

  while (!client.connected()) {
    Serial.print("Kết nối đến MQTT broker...");
    if (client.connect(MQTT_ID)) {
      Serial.println("Đã kết nối thành công!");
      client.subscribe(mqtt_topic); // Đăng ký topic
    } else {
      Serial.print("Lỗi kết nối: ");
      Serial.println(client.state());
      delay(5000);
    }
  }

  pinMode(GREEN_LED, OUTPUT);
  pinMode(YELLOW_LED, OUTPUT);
  pinMode(RED_LED, OUTPUT);

  digitalWrite(GREEN_LED, LOW);
  digitalWrite(YELLOW_LED, LOW);
  digitalWrite(RED_LED, LOW);
}

void loop() {
  client.loop(); 

  if (newDataReceived || green_time > 0 || yellow_time > 0 || red_time > 0) {
    // Chu kỳ đèn giao thông
    Serial.println("Bắt đầu chu kỳ đèn giao thông...");

    digitalWrite(GREEN_LED, HIGH);
    digitalWrite(YELLOW_LED, LOW);
    digitalWrite(RED_LED, LOW);
    delay(green_time * 1000);

    digitalWrite(GREEN_LED, LOW);
    digitalWrite(YELLOW_LED, HIGH);
    digitalWrite(RED_LED, LOW);
    delay(yellow_time * 1000);

    digitalWrite(GREEN_LED, LOW);
    digitalWrite(YELLOW_LED, LOW);
    digitalWrite(RED_LED, HIGH);
    delay(red_time * 1000);

    Serial.println("Hoàn tất một chu kỳ đèn giao thông.");
    newDataReceived = false; 
  }
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Nhận tin nhắn từ topic: ");
  Serial.println(topic);

  StaticJsonDocument<200> doc;
  DeserializationError error = deserializeJson(doc, payload, length);
  if (error) {
    Serial.print("Lỗi JSON: ");
    Serial.println(error.c_str());
    return;
  }

  green_time = doc["green"] | 0;  
  yellow_time = doc["yellow"] | 0;
  red_time = doc["red"] | 0;     

  Serial.print("Đèn xanh: ");
  Serial.println(green_time);
  Serial.print("Đèn vàng: ");
  Serial.println(yellow_time);
  Serial.print("Đèn đỏ: ");
  Serial.println(red_time);

  newDataReceived = true; 
}











// <!DOCTYPE html>
// <html lang="en">
// <head>
//     <meta charset="UTF-8">
//     <meta name="viewport" content="width=device-width, initial-scale=1.0">
//     <title>ESP32 LED Control via MQTT</title>
//     <script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.min.js"></script>
//     <style>
//         body {
//             font-family: Arial, sans-serif;
//             text-align: center;
//             background-color: #f0f0f0;
//             padding: 20px;
//         }
//         h2 {
//             color: #333;
//         }
//         form {
//             display: inline-block;
//             background: #fff;
//             padding: 20px;
//             border-radius: 10px;
//             box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
//         }
//         input[type="text"] {
//             padding: 10px;
//             margin: 10px 0;
//             width: 200px;
//         }
//         input[type="button"] {
//             background-color: #4CAF50;
//             color: white;
//             padding: 10px 20px;
//             border: none;
//             border-radius: 5px;
//             cursor: pointer;
//         }
//         input[type="button"]:hover {
//             background-color: #45a049;
//         }
//         #notif {
//             margin-top: 20px;
//             color: green;
//             font-weight: bold;
//         }
//     </style>
// </head>
// <body>
//     <h2>ESP32 LED Control via MQTT</h2>
//     <form id="ledForm">
//         <label for="green">Thời gian đèn xanh bật (giây):</label><br>
//         <input type="text" id="green" name="green" value="0"><br>
        
//         <label for="yellow">Thời gian đèn vàng bật (giây):</label><br>
//         <input type="text" id="yellow" name="yellow" value="0"><br>
        
//         <label for="red">Thời gian đèn đỏ bật (giây):</label><br>
//         <input type="text" id="red" name="red" value="0"><br><br>
        
//         <input type="button" value="Gửi MQTT" onclick="sendToMQTT()">
//     </form>

//     <h3>Trạng thái:</h3>
//     <div id="notif">Đang kết nối...</div>

//     <script>
//         const client = new Paho.MQTT.Client("broker.emqx.io", 8084, "client-web" + Math.random());
//         function onConnect() {
//             console.log("Kết nối thành công!");
//             document.getElementById('notif').innerText = "Kết nối thành công!";
//             client.subscribe("dengiaothong");
//         }
//         client.onMessageArrived = (message) => {
//             console.log("Tin nhắn nhận được: " + message.payloadString);
//             document.getElementById('notif').innerText = "Phản hồi từ ESP32 nhận thành công!";
//         };

//         client.onConnectionLost = (responseObject) => {
//             if (responseObject.errorCode !== 0) {
//                 console.log("Mất kết nối: " + responseObject.errorMessage);
//                 document.getElementById('notif').innerText = "Mất kết nối! Đang thử lại...";
//                 setTimeout(() => {
//                     reconnectMQTT(); 
//                 }, 5000); 
//             }
//         };

//         function reconnectMQTT() {
//             client.connect({
//                 useSSL: true,
//                 onSuccess: onConnect,
//                 onFailure: (err) => {
//                     console.error("Không thể kết nối lại MQTT broker", err);
//                     document.getElementById('notif').innerText = "Không thể kết nối lại!";
//                 },
//             });
//         }

//         client.connect({
//             useSSL: true,
//             onSuccess: onConnect,
//             onFailure: (err) => {
//                 console.error("Không thể kết nối đến MQTT broker", err);
//                 document.getElementById('notif').innerText = "Không thể kết nối!";
//             },
//         });

//         function sendToMQTT() {
//             const green = parseInt(document.getElementById('green').value);
//             const yellow = parseInt(document.getElementById('yellow').value);
//             const red = parseInt(document.getElementById('red').value);

//             if (isNaN(green) || isNaN(yellow) || isNaN(red) || green < 0 || yellow < 0 || red < 0) {
//                 alert("Vui lòng nhập giá trị hợp lệ (số >= 0)!");
//                 return;
//             }

//             const data = {
//                 green: green,
//                 yellow: yellow,
//                 red: red,
//             };

//             const message = new Paho.MQTT.Message(JSON.stringify(data));
//             message.destinationName = "dengiaothong";
//             client.send(message);

//             document.getElementById('notif').innerText = "Dữ liệu đã gửi thành công!";
//         }
//     </script>
// </body>
// </html>