import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:shorebird_code_push/shorebird_code_push.dart';

/// Shorebird Code Push Service
/// Handles OTA (Over-The-Air) updates for Dart code.
/// Checks for patches on app launch and notifies users when updates are available.
class ShorebirdUpdateService extends GetxService {
  final _updater = ShorebirdUpdater();

  final isUpdateAvailable = false.obs;
  final isDownloading = false.obs;
  final currentPatchNumber = 0.obs;

  @override
  void onInit() {
    super.onInit();
    _checkForUpdate();
  }

  /// Check if Shorebird is available (only works with shorebird release builds)
  bool get isShorebirdAvailable => _updater.isAvailable;

  /// Get current patch number
  Future<void> loadCurrentPatch() async {
    if (!isShorebirdAvailable) return;
    try {
      final patch = await _updater.readCurrentPatch();
      currentPatchNumber.value = patch?.number ?? 0;
    } catch (_) {}
  }

  /// Check for updates on launch
  Future<void> _checkForUpdate() async {
    if (!isShorebirdAvailable) {
      debugPrint('[Shorebird] Not available (debug build)');
      return;
    }

    try {
      await loadCurrentPatch();
      debugPrint('[Shorebird] Current patch: ${currentPatchNumber.value}');

      final status = await _updater.checkForUpdate();
      if (status == UpdateStatus.outdated) {
        isUpdateAvailable.value = true;
        debugPrint('[Shorebird] Update available!');
        _showUpdateDialog();
      } else {
        debugPrint('[Shorebird] App is up to date');
      }
    } catch (e) {
      debugPrint('[Shorebird] Error checking for update: $e');
    }
  }

  /// Download and apply the update
  Future<void> downloadUpdate() async {
    if (!isShorebirdAvailable) return;

    isDownloading.value = true;
    try {
      await _updater.update();
      isDownloading.value = false;
      isUpdateAvailable.value = false;

      // Show restart prompt
      Get.defaultDialog(
        title: '✅ تم التحديث',
        middleText: 'تم تحميل التحديث بنجاح.\nأعد تشغيل التطبيق لتطبيق التغييرات.',
        textConfirm: 'حسناً',
        confirmTextColor: Colors.white,
        buttonColor: const Color(0xFF0F4C81),
        onConfirm: () => Get.back(),
        titleStyle: const TextStyle(fontWeight: FontWeight.bold),
        radius: 14,
      );
    } catch (e) {
      isDownloading.value = false;
      debugPrint('[Shorebird] Download failed: $e');
      Get.snackbar(
        'خطأ',
        'فشل تحميل التحديث',
        backgroundColor: Colors.red,
        colorText: Colors.white,
      );
    }
  }

  /// Show update available dialog
  void _showUpdateDialog() {
    Get.defaultDialog(
      title: '🔄 تحديث متاح',
      middleText: 'يتوفر تحديث جديد لمُصادَق.\nهل تريد تحميله الآن؟',
      textConfirm: 'تحديث',
      textCancel: 'لاحقاً',
      confirmTextColor: Colors.white,
      buttonColor: const Color(0xFF0F4C81),
      onConfirm: () {
        Get.back();
        downloadUpdate();
      },
      titleStyle: const TextStyle(fontWeight: FontWeight.bold),
      radius: 14,
    );
  }

  /// Manual check (can be called from settings)
  Future<void> manualCheckForUpdate() async {
    if (!isShorebirdAvailable) {
      Get.snackbar(
        'تنبيه',
        'التحديث التلقائي متاح فقط في نسخة الإصدار',
        backgroundColor: Colors.orange,
        colorText: Colors.white,
      );
      return;
    }

    Get.snackbar(
      'جارٍ الفحص...',
      'يتم البحث عن تحديثات',
      backgroundColor: const Color(0xFF0F4C81),
      colorText: Colors.white,
      showProgressIndicator: true,
      duration: const Duration(seconds: 2),
    );

    try {
      final status = await _updater.checkForUpdate();
      if (status == UpdateStatus.outdated) {
        isUpdateAvailable.value = true;
        _showUpdateDialog();
      } else {
        Get.snackbar(
          '✅ محدّث',
          'التطبيق يعمل بأحدث إصدار (Patch ${currentPatchNumber.value})',
          backgroundColor: const Color(0xFF10B981),
          colorText: Colors.white,
        );
      }
    } catch (e) {
      Get.snackbar('خطأ', 'فشل البحث عن تحديثات',
          backgroundColor: Colors.red, colorText: Colors.white);
    }
  }
}
