import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flutter/foundation.dart';

/// ネットワーク接続状態を管理するサービス
///
/// - オンライン/オフライン判定
/// - 接続状態変化の監視
class NetworkService {
  static final Connectivity _connectivity = Connectivity();

  /// 現在のネットワーク接続状態を確認
  ///
  /// Returns: true = オンライン, false = オフライン
  ///
  /// Usage:
  /// ```dart
  /// if (await NetworkService.isOnline()) {
  ///   // Gemini API呼び出し
  /// } else {
  ///   // Draft保存
  /// }
  /// ```
  static Future<bool> isOnline() async {
    try {
      final List<ConnectivityResult> results = await _connectivity.checkConnectivity();

      // オフライン判定: 接続がない、または機内モード
      if (results.isEmpty || results.contains(ConnectivityResult.none)) {
        debugPrint('🔴 Network: OFFLINE');
        return false;
      }

      debugPrint('🟢 Network: ONLINE (${results.join(', ')})');
      return true;
    } catch (e) {
      debugPrint('⚠️ Network check error: $e (assuming offline)');
      return false; // エラー時は安全側に倒す（オフライン扱い）
    }
  }

  /// ネットワーク接続状態の変化を監視するStream
  ///
  /// Usage:
  /// ```dart
  /// StreamSubscription? _subscription;
  ///
  /// void initState() {
  ///   _subscription = NetworkService.onConnectivityChanged.listen((results) {
  ///     if (!results.contains(ConnectivityResult.none)) {
  ///       // オンライン復帰時の処理（Draft解析開始など）
  ///     }
  ///   });
  /// }
  ///
  /// void dispose() {
  ///   _subscription?.cancel();
  /// }
  /// ```
  static Stream<List<ConnectivityResult>> get onConnectivityChanged {
    return _connectivity.onConnectivityChanged;
  }

  /// オンライン復帰を待機する（最大待機時間あり）
  ///
  /// Returns: true = タイムアウト前にオンライン復帰, false = タイムアウト
  ///
  /// Usage:
  /// ```dart
  /// if (await NetworkService.waitForOnline(timeout: Duration(seconds: 30))) {
  ///   // オンライン復帰成功
  /// }
  /// ```
  static Future<bool> waitForOnline({Duration timeout = const Duration(seconds: 30)}) async {
    if (await isOnline()) return true; // 既にオンラインなら即座に返す

    try {
      await for (final results in _connectivity.onConnectivityChanged.timeout(timeout)) {
        if (!results.contains(ConnectivityResult.none)) {
          debugPrint('🟢 Network: Back ONLINE!');
          return true;
        }
      }
      return false;
    } catch (e) {
      debugPrint('⚠️ waitForOnline timeout or error: $e');
      return false;
    }
  }
}
