import 'dart:async';

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

import '../config.dart';

/// وضعیتِ اینترنت را نگه می‌دارد: هم قطعِ رابطِ شبکه (وای‌فای/دیتا) و هم دسترسیِ
/// واقعی به سرور (با پینگِ سبکِ /health). [online] برای نمایشِ اوورلیِ «اتصال نیست».
class ConnectivityService {
  ConnectivityService._();
  static final ConnectivityService I = ConnectivityService._();

  final ValueNotifier<bool> online = ValueNotifier<bool>(true);

  final Connectivity _conn = Connectivity();
  final Dio _dio = Dio(BaseOptions(
    connectTimeout: const Duration(seconds: 4),
    receiveTimeout: const Duration(seconds: 4),
  ));
  StreamSubscription? _sub;
  bool _checking = false;

  Future<void> init() async {
    _sub = _conn.onConnectivityChanged.listen(_onChange);
    await recheck();
  }

  void _onChange(List<ConnectivityResult> results) {
    final hasInterface =
        results.any((r) => r != ConnectivityResult.none);
    if (!hasInterface) {
      online.value = false; // بی‌درنگ: رابطِ شبکه قطع است
    } else {
      _verify(); // رابط هست؛ دسترسیِ واقعی را بررسی کن
    }
  }

  /// بررسیِ دستیِ اتصال (دکمه‌ی «تلاش مجدد»).
  Future<void> recheck() async {
    final results = await _conn.checkConnectivity();
    final hasInterface = results.any((r) => r != ConnectivityResult.none);
    if (!hasInterface) {
      online.value = false;
      return;
    }
    await _verify();
  }

  Future<void> _verify() async {
    if (_checking) return;
    _checking = true;
    try {
      final res = await _dio.get('${AppConfig.baseUrl}/health');
      online.value = res.statusCode == 200;
    } catch (_) {
      online.value = false;
    } finally {
      _checking = false;
    }
  }

  void dispose() => _sub?.cancel();
}
