#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>
#include <ESP32Servo.h>   // Compatible servo library

#define LED_BUILTIN 2
#define SERVO_PIN 23
#define BUZZER_PIN 22      // Active buzzer (digital ON/OFF)

#define RSSI_THRESHOLD -45
#define SERVO_OPEN 108
#define SERVO_CLOSED 0

int scanTime = 2;
BLEScan* pBLEScan;
Servo myServo;
bool isClosed = false;

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  digitalWrite(BUZZER_PIN, LOW);

  // Start with the servo open and then detach to save power
  myServo.attach(SERVO_PIN);
  myServo.write(SERVO_OPEN);
  delay(500);
  myServo.detach();

  // Initialize BLE scanning
  BLEDevice::init("");
  pBLEScan = BLEDevice::getScan();
  pBLEScan->setActiveScan(true);
  pBLEScan->setInterval(100);
  pBLEScan->setWindow(99);

  Serial.println("🔧 ESP32 Initialized! Scanning for AirTags...");
}

void loop() {
  Serial.println("🔎 Scanning BLE...");
  BLEScanResults* results = pBLEScan->start(scanTime, false);
  bool airtagNearby = false;

  for (int i = 0; i < results->getCount(); i++) {
    BLEAdvertisedDevice d = results->getDevice(i);
    int rssi = d.getRSSI();

    if (!d.haveName() && !d.haveServiceUUID() && rssi > -80) {
      String range;
      if (rssi > RSSI_THRESHOLD) range = "<30 cm (VERY CLOSE)";
      else if (rssi > -65) range = "<1 m (nearby)";
      else range = "1–2 m (far)";

      Serial.printf("📡 RSSI: %d | Range: %s\n", rssi, range.c_str());
      if (rssi > RSSI_THRESHOLD) airtagNearby = true;
    }
  }

  // ===== SERVO AND BUZZER CONTROL =====
  if (airtagNearby && !isClosed) {
    digitalWrite(LED_BUILTIN, HIGH);
    myServo.attach(SERVO_PIN);
    myServo.write(SERVO_CLOSED);
    digitalWrite(BUZZER_PIN, HIGH);
    isClosed = true;
    Serial.println("🔥 AirTag detected – Servo CLOSED + Buzzer ON");
  }
  else if (!airtagNearby && isClosed) {
    digitalWrite(LED_BUILTIN, LOW);
    myServo.attach(SERVO_PIN);
    myServo.write(SERVO_OPEN);
    delay(500);
    myServo.detach();      // ✅ Turns off PWM to save power
    digitalWrite(BUZZER_PIN, LOW);
    isClosed = false;
    Serial.println("✅ No AirTag – Servo OPEN (powered off) + Buzzer OFF");
  }

  pBLEScan->clearResults();
  delay(500);
}
