// Proyek 144 - Pelacak Lokasi GPS
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
#include <WiFi.h>
#include <PubSubClient.h>
#include <TinyGPSPlus.h>

// ===== ISI DULU =====
const char* WIFI_NAMA = "nama-wifi-kamu";
const char* WIFI_PASS = "password-wifi-kamu";

// topic MQTT: ganti budi1234 dengan KODE-mu (sama dengan di dashboard Klenik)
const char* TOPIK_SATELIT    = "ichibot/budi1234/p144/satelit";
const char* TOPIK_STATUS     = "ichibot/budi1234/p144/status";
const char* TOPIK_LOKASI     = "ichibot/budi1234/p144/lokasi";
const char* TOPIK_KECEPATAN  = "ichibot/budi1234/p144/kecepatan";
const char* TOPIK_KETINGGIAN = "ichibot/budi1234/p144/ketinggian";

const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
TinyGPSPlus gps;
unsigned long terakhir = 0;

void langganan() {}

void sambungWiFi() {
  WiFi.begin(WIFI_NAMA, WIFI_PASS);
  Serial.print("WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" OK, IP " + WiFi.localIP().toString());
}

void sambungMQTT() {
  while (!mqtt.connected()) {
    if (mqtt.connect(WiFi.macAddress().c_str())) {
      Serial.println("Terhubung ke Klenik");
      langganan();
    } else {
      Serial.println("Broker gagal, coba lagi 3 detik");
      delay(3000);
    }
  }
}
void setup() {
  Serial.begin(115200);
  Serial2.begin(9600, SERIAL_8N1, 16, 17);   // RX2 = GPIO16 (dari TX GPS), TX2 = GPIO17
  sambungWiFi();
  mqtt.setServer(BROKER, 1883);
}

void loop() {
  if (!mqtt.connected()) sambungMQTT();
  mqtt.loop();

  while (Serial2.available()) gps.encode(Serial2.read());   // GPS mengirim kalimat NMEA terus-menerus

  if (millis() - terakhir < 5000) return;
  terakhir = millis();
  mqtt.publish(TOPIK_SATELIT, String(gps.satellites.value()).c_str());
  if (!gps.location.isValid() || gps.location.age() > 10000) {
    mqtt.publish(TOPIK_STATUS, "0");
    return;                           // belum dapat posisi (di dalam ruangan / baru menyala)
  }
  mqtt.publish(TOPIK_STATUS, "1");
  String lat = String(gps.location.lat(), 6), lon = String(gps.location.lng(), 6);
  mqtt.publish(TOPIK_LOKASI, ("https://maps.google.com/?q=" + lat + "," + lon).c_str());
  mqtt.publish(TOPIK_KECEPATAN, String(gps.speed.kmph(), 1).c_str());
  mqtt.publish(TOPIK_KETINGGIAN, String(gps.altitude.meters(), 0).c_str());
}
