import 'package:get/get.dart';
import 'dart:io' show Platform;
import 'package:url_launcher/url_launcher.dart';
import 'package:kaer_with_panels/app/widgets/dialogs/kr_update_dialog.dart';
import 'package:package_info_plus/package_info_plus.dart';
import '../localization/app_translations.dart';
import 'package:kaer_with_panels/app/utils/kr_log_util.dart';

import '../model/response/kr_config_data.dart';

/// 更新工具类
class KRUpdateUtil {
  /// 单例模式
  static final KRUpdateUtil _instance = KRUpdateUtil._internal();
  factory KRUpdateUtil() => _instance;
  KRUpdateUtil._internal();

  /// 当前更新信息
  KRUpdateApplication? _kr_currentUpdateInfo;

  /// 初始化更新信息
  /// [updateInfo] 更新信息对象
  void kr_initUpdateInfo(KRUpdateApplication updateInfo) {
    _kr_currentUpdateInfo = updateInfo;
  }

  /// 检查更新
  Future<void> kr_checkUpdate() async {
    if (_kr_currentUpdateInfo == null) {
      return;
    }

    // 获取当前应用版本号
    final PackageInfo packageInfo = await PackageInfo.fromPlatform();
    final String currentVersion = packageInfo.version;

    // 比较版本号
    if (_kr_compareVersions(currentVersion, _kr_currentUpdateInfo!.kr_version) <
        0) {
      _kr_showUpdateDialog(_kr_currentUpdateInfo!);
    }
  }

  /// 比较版本号
  /// 返回值：
  /// -1: 当前版本小于目标版本
  /// 0: 当前版本等于目标版本
  /// 1: 当前版本大于目标版本
  int _kr_compareVersions(String currentVersion, String targetVersion) {
    return currentVersion.compareTo(targetVersion);
  }

  /// 显示更新对话框
  void _kr_showUpdateDialog(KRUpdateApplication updateInfo) {
    // 获取更新内容
    String? updateContent = updateInfo.kr_version_description;
    
    // 如果更新内容为空，使用默认内容
    if (updateContent?.isEmpty ?? true) {
      updateContent = AppTranslations.kr_update.content;
    }

    KRUpdateDialog.show(
      
      version: updateInfo.kr_version,
      updateContent: updateContent,
      onConfirm: () {
        _kr_handleUpdate(updateInfo);
      },
      onCancel: () => Get.back(),
      showCancelButton: true,
    );
  }

  /// 处理更新
  Future<void> _kr_handleUpdate(KRUpdateApplication updateInfo) async {
    if (updateInfo.kr_url.isEmpty) {
      Get.back();
      return;
    }

    try {
      final Uri uri = Uri.parse(updateInfo.kr_url);
      
      if (Platform.isAndroid) {
        // Android 平台处理
        await _kr_handleAndroidUpdate(uri);
      } else if (Platform.isIOS) {
        // iOS 平台处理
        await _kr_handleIOSUpdate(uri);
      } else if (Platform.isMacOS) {
        // macOS 平台处理
        await _kr_handleMacOSUpdate(uri);
      } else if (Platform.isWindows) {
        // Windows 平台处理
        await _kr_handleWindowsUpdate(uri);
      } else if (Platform.isLinux) {
        // Linux 平台处理
        await _kr_handleLinuxUpdate(uri);
      }
    } catch (e) {
      KRLogUtil.kr_e('更新处理错误: $e', tag: 'UpdateUtil');
    } finally {
      Get.back();
    }
  }

  /// 处理 Android 平台更新
  Future<void> _kr_handleAndroidUpdate(Uri uri) async {
    // Android 平台通常是下载 APK 文件
    if (await canLaunchUrl(uri)) {
      await launchUrl(uri, mode: LaunchMode.externalApplication);
    }
  }

  /// 处理 iOS 平台更新
  Future<void> _kr_handleIOSUpdate(Uri uri) async {
    // iOS 平台通常是跳转到 App Store
    if (await canLaunchUrl(uri)) {
      await launchUrl(uri, mode: LaunchMode.externalApplication);
    }
  }

  /// 处理 macOS 平台更新
  Future<void> _kr_handleMacOSUpdate(Uri uri) async {
    // macOS 平台通常是下载 DMG 文件或跳转到 Mac App Store
    if (await canLaunchUrl(uri)) {
      await launchUrl(uri, mode: LaunchMode.externalApplication);
    }
  }

  /// 处理 Windows 平台更新
  Future<void> _kr_handleWindowsUpdate(Uri uri) async {
    // Windows 平台通常是下载 exe 安装文件
    if (await canLaunchUrl(uri)) {
      await launchUrl(uri, mode: LaunchMode.externalApplication);
    }
  }

  /// 处理 Linux 平台更新
  Future<void> _kr_handleLinuxUpdate(Uri uri) async {
    // Linux 平台通常是下载安装包文件
    if (await canLaunchUrl(uri)) {
      await launchUrl(uri, mode: LaunchMode.externalApplication);
    }
  }
}
