import 'dart:io';
import 'kr_log_util.dart';

/// macOS 系统代理管理工具类
/// 
/// 使用 `networksetup` 命令管理 macOS 的 SOCKS5 代理设置
class KRMacosProxyUtil {
  /// 私有构造函数
  KRMacosProxyUtil._();

  /// 获取所有网络服务列表
  static Future<List<String>> _listNetworkServices() async {
    try {
      final r = await Process.run('networksetup', ['-listallnetworkservices']);
      if (r.exitCode != 0) {
        KRLogUtil.kr_e('列出网络服务失败: ${r.stderr}', tag: 'MacosProxy');
        return [];
      }
      final lines = (r.stdout as String).split('\n').map((e) => e.trim()).toList();
      // 过滤掉第一行说明文字和空行
      return lines
          .where((l) => l.isNotEmpty && !l.toLowerCase().contains('an asterisk'))
          .skip(1)
          .toList();
    } catch (e) {
      KRLogUtil.kr_e('列出网络服务异常: $e', tag: 'MacosProxy');
      return [];
    }
  }

  /// 为所有网络服务启用 SOCKS5 代理
  static Future<void> enableSocks5({
    required String host,
    required int port,
  }) async {
    if (!Platform.isMacOS) return;

    final services = await _listNetworkServices();
    if (services.isEmpty) {
      KRLogUtil.kr_w('未找到可用的网络服务', tag: 'MacosProxy');
      return;
    }

    for (final service in services) {
      try {
        // 1) 设置 SOCKS5 服务器地址和端口
        final r1 = await Process.run('networksetup', [
          '-setsocksfirewallproxy',
          service,
          host,
          port.toString(),
        ]);
        
        if (r1.exitCode != 0) {
          KRLogUtil.kr_w('服务 [$service] 设置 SOCKS5 代理失败: ${r1.stderr}', tag: 'MacosProxy');
          continue;
        }

        // 2) 开启 SOCKS5 代理状态
        final r2 = await Process.run('networksetup', [
          '-setsocksfirewallproxystate',
          service,
          'on',
        ]);
        
        if (r2.exitCode != 0) {
          KRLogUtil.kr_w('服务 [$service] 启用 SOCKS5 代理失败: ${r2.stderr}', tag: 'MacosProxy');
          continue;
        }

        KRLogUtil.kr_i('✅ 服务 [$service] SOCKS5 代理已启用: $host:$port', tag: 'MacosProxy');
      } catch (e) {
        KRLogUtil.kr_e('服务 [$service] 启用代理异常: $e', tag: 'MacosProxy');
      }
    }
  }

  /// 为所有网络服务禁用 SOCKS5 代理
  static Future<void> disableSocks5() async {
    if (!Platform.isMacOS) return;

    final services = await _listNetworkServices();
    if (services.isEmpty) return;

    for (final service in services) {
      try {
        final r = await Process.run('networksetup', [
          '-setsocksfirewallproxystate',
          service,
          'off',
        ]);
        
        if (r.exitCode == 0) {
          KRLogUtil.kr_i('✅ 服务 [$service] SOCKS5 代理已关闭', tag: 'MacosProxy');
        } else {
          KRLogUtil.kr_w('服务 [$service] 关闭 SOCKS5 代理失败: ${r.stderr}', tag: 'MacosProxy');
        }
      } catch (e) {
        KRLogUtil.kr_e('服务 [$service] 关闭代理异常: $e', tag: 'MacosProxy');
      }
    }
  }

  /// 获取指定服务的 SOCKS5 状态 (主要用于调试)
  static Future<String> getSocks5Status(String serviceName) async {
    try {
      final r = await Process.run('networksetup', ['-getsocksfirewallproxy', serviceName]);
      return r.stdout as String;
    } catch (e) {
      return '获取状态失败: $e';
    }
  }
}
