import 'dart:io';

import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:ftrecruiter/api/interceptors/auth_interceptor.dart';
import 'package:ftrecruiter/api/interceptors/log_res_interceptor.dart';
import 'package:ftrecruiter/api/interceptors/log_req_interceptor.dart';
import 'package:ftrecruiter/comm/constants/api_constants.dart';
import 'package:ftrecruiter/comm/constants/app_constant.dart';

import '../comm/utils/log_utils.dart';

typedef NetSuccessCallback<T> = Function(T data);
typedef NetSuccessListCallback<T> = Function(T data);
typedef NetErrorCallback = Function(int? code, String? msg);

enum HttpMethod { GET, POST }

//基类的Api封装
class ApiProvider extends GetConnect {
  //Get请求封装
  Future<void> requestNetwork(
      String url, {
        HttpMethod? method,
        Map<String, String>? headers,
        Map<String, dynamic>? query,  //请求参数
        Map<String, File>? paths,   //文件上传
        NetSuccessCallback<Map<String, dynamic>>? onSuccess,  //data数据成功回调
        NetSuccessListCallback<List<dynamic>>? onSuccessList,  //List数据成功回调
        NetErrorCallback? onError,
      }) async {
    //封装参数
    Future<Response> req;

    if (method != null && method == HttpMethod.POST) {
      var map = <String, dynamic>{};

      if (query != null || paths != null) {
        if (query != null) {
          map.addAll(query);
        }

        if (paths != null) {
          paths.forEach((key, value) {
            map[key] = MultipartFile(
              value.readAsBytesSync(),
              filename: "file",
            );
          });
        }
      }

      var form = FormData(map);

      Log.d("Post请求FromData参数,fields:${form.fields.toString()}");
      //以Post-Body的方式上传
      req = post(url, form, headers: headers);
    } else {
      //以Get-Params的方式上传
      req = get(url, headers: headers, query: query);
    }

    //开始真正请求
    final startTime = DateTime.now().millisecond;
    var result = await req;
    final endTime = DateTime.now().millisecond;

    if (!AppConstant.inProduction) {
      final duration = endTime - startTime;
      Log.d('网络请求耗时 $duration 毫秒, 响应内容 ${result.body}}');
    }

    if (result.statusCode == 200) {
      //网络请求正确之后获取正常的Json-Map
      Map<String, dynamic> jsonMap = result.body;

      //查看apiCode是否正确
      int code = jsonMap['code'];
      if (code == 200) {
        if (jsonMap['data'] is List<dynamic>) {
          //返回数组
          List<dynamic> list = jsonMap['data'];
          if (onSuccessList != null) {
            onSuccessList(list);
          }
        } else {
          //返回对象
          if (onSuccess != null) {
            onSuccess(jsonMap['data']);
          }
        }
      } else {
        //Api错误
        if (onError != null) {
          onError(jsonMap['code'], jsonMap['message']);
        }
      }
    } else {
      //网络请求错误
      if (onError != null) {
        // result.bodyString   错误信息,这里没必要打印,拦截器中有打印的
        onError(result.statusCode, result.statusText);
      }
      //吐司网络请求错误
      SmartDialog.compatible
          .showToast("Request Network Error :${result.statusCode}  ${result.statusText}");
    }
  }

  @override
  void onInit() {
    httpClient.baseUrl = ApiConstants.baseUrl;

    // httpClient.addResponseModifier(responseInterceptor);

    /// 统一添加身份验证请求头
    httpClient.addRequestModifier(authInterceptor);

    /// 打印Log(生产模式去除)
    if (!AppConstant.inProduction) {
      httpClient.addRequestModifier(logReqInterceptor);
    }

    /// 打印Log(生产模式去除)
    // if (!AppConstant.inProduction) {
    //   httpClient.addResponseModifier(logResInterceptor);
    // }
  }
}