import 'package:flutter/material.dart';
import 'package:flutter_background_service/flutter_background_service.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'dart:async'; // Import for Timer
import 'services/notification_service.dart'; // Import layanan notifikasi

String lastLcdStatus = ""; // Menyimpan status terakhir LCD
String lastSensorStatus = ""; // Menyimpan status terakhir Sensor
String lastWifiStatus = ""; // Menyimpan status terakhir WiFi
DateTime? lastSensorResponseTime; // Menyimpan waktu terakhir sensor merespon
Timer? wifiCheckTimer; // Timer untuk memeriksa koneksi WiFi berdasarkan respons sensor

void backgroundService() {
  WidgetsFlutterBinding.ensureInitialized();
  FlutterBackgroundService.initialize(onStart);

  print("Background service initialized...");
  print("Background service is running...");

  // Inisialisasi Firebase Database
  final DatabaseReference lcdRef = FirebaseDatabase.instance.ref().child('logs/lcd');
  final DatabaseReference sensorRef = FirebaseDatabase.instance.ref().child('logs/sensor');
  
  // Memulai timer untuk memeriksa koneksi WiFi setiap 30 detik
  wifiCheckTimer = Timer.periodic(Duration(seconds: 30), (timer) {
    checkWifiStatusBasedOnSensor();
  });

  // Inisialisasi layanan notifikasi untuk monitoring suhu dan kelembapan
  NotificationService().initialize().then((_) {
    print("✅ Layanan notifikasi suhu dan kelembapan berhasil diinisialisasi di background service");
  });

  lcdRef.onValue.listen((event) {
    print("Listener untuk LCD dipanggil");
    if (event.snapshot.value != null) {
      if (event.snapshot.value is String) {
        var value = event.snapshot.value as String;
        print("Data LCD diterima: $value"); // Log data LCD
        var parts = value.split(':'); // Memecah string menjadi bagian-bagian
        if (parts.length > 1) {
          var status = parts[1].trim(); // Mengambil status dari bagian kedua
          print("Status LCD: $status");
          if (status.contains("Initializing")) {
            print("LCD Initialization Started");
            if (lastLcdStatus != status) {
              updateNotification("LCD Status", "Inisialisasi LCD dimulai", 1);
              lastLcdStatus = status;
            }
          } else if (status.contains("Ready")) {
            print("LCD Ready and Initialized");
            if (lastLcdStatus != status) {
              updateNotification("LCD Status", "LCD siap dan terinisialisasi", 1);
              lastLcdStatus = status;
            }
          } else if (status.contains("Failed")) {
            print("LCD Initialization Failed");
            if (lastLcdStatus != status) {
              updateNotification("LCD Status", "Inisialisasi LCD gagal - Periksa koneksi", 1);
              lastLcdStatus = status;
            }
          } else if (status.contains("Lost")) {
            print("LCD Connection Lost");
            if (lastLcdStatus != status) {
              updateNotification("LCD Status", "Koneksi LCD terputus - Periksa kabel", 1);
              lastLcdStatus = status;
            }
          } else if (status.contains("Restored")) {
            print("LCD Connection Restored");
            if (lastLcdStatus != status) {
              updateNotification("LCD Status", "Koneksi LCD dipulihkan", 1);
              lastLcdStatus = status;
            }
          } else {
            print("LCD Status not recognized: $status"); // Debugging line
          }
        } else {
          print("Invalid LCD data format"); // Debugging line
        }
      } else {
        print("Data LCD tidak dalam format String"); // Debugging line
      }
    } else {
      print("Data LCD tidak ada");
    }
  });

  sensorRef.onValue.listen((event) {
    if (event.snapshot.value != null) {
      // Update waktu terakhir sensor merespon
      lastSensorResponseTime = DateTime.now();
      print("Sensor merespon pada: $lastSensorResponseTime");
      
      // Periksa status WiFi berdasarkan respons sensor
      checkWifiStatusBasedOnSensor();
      
      if (event.snapshot.value is String) {
        var value = event.snapshot.value as String;
        print("Data Sensor diterima: $value"); // Log data sensor
        var parts = value.split(':'); // Memecah string menjadi bagian-bagian
        if (parts.length > 1) {
          var status = parts[1].trim(); // Mengambil status dari bagian kedua
          print("Status Sensor: $status"); // Menambahkan log untuk status sensor
          if (status == 'Failed to Read from DHT Sensor') {
            print("Failed to Read from DHT Sensor");
            if (lastSensorStatus != status) {
              updateNotification("Sensor Status", "Gagal membaca dari sensor DHT", 2);
              lastSensorStatus = status;
            }
          } else if (status == 'DHT Sensor Reading Successful') {
            print("DHT Sensor Reading Successful");
            if (lastSensorStatus != status) {
              updateNotification("Sensor Status", "Pembacaan sensor DHT berhasil", 2);
              lastSensorStatus = status;
            }
          } else {
            print("Sensor Status not recognized: $status"); // Debugging line
          }
        } else {
          print("Invalid Sensor data format"); // Debugging line
        }
      } else {
        print("Data Sensor tidak dalam format String"); // Debugging line
      }
    } else {
      print("Data Sensor tidak ada");
    }
  });
}

// Fungsi untuk memeriksa status WiFi berdasarkan respons sensor
void checkWifiStatusBasedOnSensor() {
  if (lastSensorResponseTime == null) {
    // Jika belum ada respons sensor sama sekali
    if (lastWifiStatus != "Disconnected") {
      updateNotification("WiFi Status", "WiFi terputus", 3);
      lastWifiStatus = "Disconnected";
      print("WiFi dianggap terputus karena belum ada respons sensor");
    }
    return;
  }
  
  // Hitung selisih waktu antara sekarang dan respons sensor terakhir
  Duration timeSinceLastResponse = DateTime.now().difference(lastSensorResponseTime!);
  print("Waktu sejak respons sensor terakhir: ${timeSinceLastResponse.inSeconds} detik");
  
  // Jika sensor tidak merespon dalam 60 detik, anggap WiFi terputus
  if (timeSinceLastResponse.inSeconds > 60) {
    if (lastWifiStatus != "Disconnected") {
      updateNotification("WiFi Status", "WiFi terputus", 3);
      lastWifiStatus = "Disconnected";
      print("WiFi dianggap terputus karena sensor tidak merespon selama 60 detik");
    }
  } else {
    // Jika sensor merespon dalam 60 detik terakhir, anggap WiFi terhubung
    if (lastWifiStatus != "Connected") {
      updateNotification("WiFi Status", "WiFi terhubung", 3);
      lastWifiStatus = "Connected";
      print("WiFi dianggap terhubung karena sensor merespon dalam 60 detik terakhir");
    }
  }
}

void onStart() {
  updateNotification("Service Status", "Background Service sedang berjalan...", 0);
  
  // Inisialisasi layanan notifikasi untuk monitoring suhu dan kelembapan
  NotificationService().initialize().then((_) {
    print("✅ Layanan notifikasi suhu dan kelembapan berhasil diinisialisasi di onStart");
  });
  
  backgroundService();
}

void updateNotification(String title, String body, int notificationId) {
  print("Menampilkan notifikasi: $title - $body");
  FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
  
  const AndroidNotificationDetails androidPlatformChannelSpecifics = AndroidNotificationDetails(
    'Jago',
    'Notification',
    channelDescription: 'Cek Notification!!!',
    importance: Importance.max,
    priority: Priority.high,
  );
  const NotificationDetails platformChannelSpecifics = NotificationDetails(android: androidPlatformChannelSpecifics);
  
  flutterLocalNotificationsPlugin.show(
    notificationId,
    title, // Judul notifikasi yang relevan
    body,  // Isi notifikasi yang relevan
    platformChannelSpecifics,
    payload: 'item x',
  );
}