import 'dart:async';
import 'dart:io';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:internet_connection_checker/internet_connection_checker.dart';

class NetGuard {
  static final NetGuard _i = NetGuard._();
  NetGuard._();
  factory NetGuard() => _i;

  bool _notified = false;

  /// فحص: (أ) فيه شبكة؟ (ب) فيه انترنت؟ (ج) السيرفر نفسه reachable؟
  Future<bool> hasInternet({Uri? mustReach}) async {
    final connectivity = await Connectivity().checkConnectivity();
    if (connectivity == ConnectivityResult.none) return false;

    final hasNet =
        await InternetConnectionChecker.createInstance().hasConnection;
    if (!hasNet) return false;

    if (mustReach != null) {
      try {
        final host = mustReach.host;
        final result = await InternetAddress.lookup(host);
        if (result.isEmpty || result.first.rawAddress.isEmpty) return false;

        // اختباري خفيف عبر TCP (80/443) — 400ms timeout
        final port = mustReach.scheme == 'http' ? 80 : 443;
        final socket = await Socket.connect(host, port,
            timeout: const Duration(seconds: 1));
        socket.destroy();
      } catch (_) {
        return false;
      }
    }
    return true;
  }

  /// إظهار إشعار مرة واحدة ثم إسكات التكرارات
  void notifyOnce(void Function(String title, String msg) show) {
    if (_notified) return;
    _notified = true;
    show('لا يوجد اتصال بالإنترنت', 'تحقق من الشبكة ثم حاول مجددًا.');
    // إعادة السماح بعد 15 ثانية
    Future.delayed(const Duration(seconds: 15), () => _notified = false);
  }
}
