import 'package:domain/constants/api_constants.dart';
import 'package:domain/entity/garage_sale_history_entity.dart';
import 'package:domain/entity/garage_sale_rent_detail_entity.dart';
import 'package:domain/entity/garage_sale_rent_entity.dart';
import 'package:domain/entity/myposts_sale_rent_entity.dart';
import 'package:domain/entity/newsfeed_foryou_entity.dart';
import 'package:domain/entity/newsfeed_news_entity.dart';
import 'package:domain/entity/paid_service_detail_entity.dart';
import 'package:domain/entity/paid_service_entity.dart';
import 'package:domain/entity/paid_service_pay_success_info_entity.dart';
import 'package:domain/entity/repair_service_entity.dart';
import 'package:domain/entity/server_time.dart';
import 'package:domain/entity/service_category_entity.dart';
import 'package:domain/entity/service_in_progress_entity.dart';
import 'package:domain/entity/service_time_period_entity.dart';
import 'package:domain/entity/service_order_detail_entity.dart';
import 'package:domain/entity/service_evaluate_list_entity.dart';
import 'package:domain/entity/service_repair_detail_entity.dart';
import 'package:plugin_platform/engine/toast/toast_engine.dart';
import 'package:plugin_platform/platform_export.dart';
import 'package:plugin_platform/http/dio_engine.dart';
import 'package:plugin_platform/http/http_result.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:shared/utils/log_utils.dart';
import 'package:shared/utils/util.dart';

import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:plugin_basic/provider/http_provider/http_provider.dart';

part 'services_respository.g.dart';

@Riverpod(keepAlive: true)
ServicesRespository servicesRespository(Ref ref) {
  final dioEngine = ref.watch(dioEngineProvider);
  return ServicesRespository(dioEngine: dioEngine);
}

/*
 * 数据仓库
 */
class ServicesRespository {
  DioEngine dioEngine;

  ServicesRespository({required this.dioEngine});

  //服务 获取 分类 字典
  Future<HttpResult<Object>> fetchServiceCateGoryList(
    Map<String, dynamic>? data, {
    CancelToken? cancelToken,
  }) async {
    Map<String, dynamic> params = {};
    params = data!;
    Map<String, String> headers = {};
    headers["Content-Type"] = "application/x-www-form-urlencoded";
    headers["Accept"] = "application/x.yyjobs-api.v1+json";

    final result = await dioEngine.requestNetResult(
      // ApiConstants.apiServerTime, // api 地址
      '/api/v1/user/service/category/index', // api 地址
      params: params,
      headers: headers,
      method: HttpMethod.GET,
      isShowLoadingDialog: false,
      //是否展示默认的Loading弹窗
      networkDebounce: true,
      //是否防抖防止重复请求
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final listJson = result.getListJson();
      var listData = listJson!.map((e) => ServiceCategoryEntity.fromJson(e!)).toList();
      //重新赋值data或list
      return result.convert(list: listData);
    }else  {
      if (result.errorMsg != null && result.errorMsg!.isNotEmpty) {
        ToastEngine.show("${result.errorMsg}");
      }
    }
    return result.convert();
  }

  // 付费服务 获取 列表
  Future<HttpResult<Object>> fetchPaidServiceDataList(
    Map<String, dynamic>? data, {
    CancelToken? cancelToken,
  }) async {
    Map<String, dynamic> params = {};
    params = data!;
    Map<String, String> headers = {};
    headers["Content-Type"] = "application/x-www-form-urlencoded";
    headers["Accept"] = "application/x.yyjobs-api.v1+json";

    final result = await dioEngine.requestNetResult(
      '/api/v1/user/service/paid-service/index', // api 地址
      params: params,
      headers: headers,
      method: HttpMethod.GET,
      isShowLoadingDialog: false,
      //是否展示默认的Loading弹窗
      networkDebounce: true,
      //是否防抖防止重复请求
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      var data = PaidServiceEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert(data: data);
    } else {
      if (result.errorMsg != null && result.errorMsg!.isNotEmpty) {
        ToastEngine.show("${result.errorMsg}");
      }
    }
    return result.convert();
  }

  // 付费/维修 服务 列表 点赞/取消点赞
  Future<HttpResult<Object>> fetchServiceLiked(
    Map<String, dynamic>? data, {
    CancelToken? cancelToken,
  }) async {
    Map<String, dynamic> params = {};
    params = data!;
    Map<String, String> headers = {};
    // headers["Content-Type"] = "application/x-www-form-urlencoded";
    // headers["Accept"] = "application/x.yyjobs-api.v1+json";

    final result = await dioEngine.requestNetResult(
      '/api/v1/user/service/like/click', // api 地址
      params: params,
      headers: headers,
      method: HttpMethod.POST,
      isShowLoadingDialog: true,
      //是否展示默认的Loading弹窗
      networkDebounce: true,
      //是否防抖防止重复请求
      cancelToken: cancelToken,
    );
    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final boolData = result.getDataDynamic();
      //重新赋值data或list
      return result.convert(data: boolData);
    } else {
      if (result.errorMsg != null && result.errorMsg!.isNotEmpty) {
        ToastEngine.show("${result.errorMsg}");
      }
    }
    return result.convert();
  }

  // 提交评价
  Future<HttpResult<Object>> fetchPublishEvaluation(
    Map<String, dynamic>? data, {
    CancelToken? cancelToken,
  }) async {
    Map<String, dynamic> params = {};
    params = data!;
    Map<String, String> headers = {};
    headers["Content-Type"] = "application/x-www-form-urlencoded";
    headers["Accept"] = "application/x.yyjobs-api.v1+json";

    List<String> paths = data!["resources"] as List<String>;

    Map<String, String> files = {};
    if (paths != null && paths.isNotEmpty) {
      paths.asMap().forEach((index, path) {
        files["resources[$index]"] = path;
      });
    }
    // 删除 resources 属性
    params.remove("resources");

    final result = await dioEngine.requestNetResult(
      // ApiConstants.apiServerTime, // api 地址
      '/api/v1/user/service/evaluation/publish', // api 地址
      params: params,
      paths: files,
      headers: headers,
      method: HttpMethod.POST,
      isShowLoadingDialog: true,
      //是否展示默认的Loading弹窗
      networkDebounce: true,
      //是否防抖防止重复请求
      cancelToken: cancelToken,
    );
    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      // var data = NewsfeedForyouEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert(data: json);
    } else {
      if (result.errorMsg != null && result.errorMsg!.isNotEmpty) {
        ToastEngine.show("${result.errorMsg}");
      }
    }
    return result.convert();
  }

  // 评价列表
  Future<HttpResult<Object>> fetchEvaluationDataList(
    Map<String, dynamic>? data, {
    CancelToken? cancelToken,
  }) async {
    Map<String, dynamic> params = {};
    params = data!;
    Map<String, String> headers = {};
    headers["Content-Type"] = "application/x-www-form-urlencoded";
    headers["Accept"] = "application/x.yyjobs-api.v1+json";

    final result = await dioEngine.requestNetResult(
      // ApiConstants.apiServerTime, // api 地址
      '/api/v1/user/service/evaluation/index', // api 地址
      params: params,
      headers: headers,
      method: HttpMethod.GET,
      isShowLoadingDialog: false,
      //是否展示默认的Loading弹窗
      networkDebounce: true,
      //是否防抖防止重复请求
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      var data = ServiceEvaluateListEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert(data: data);
    } else {
      if (result.errorMsg != null && result.errorMsg!.isNotEmpty) {
        ToastEngine.show("${result.errorMsg}");
      }
    }
    return result.convert();
  }

  // 获取 付费服务 详情信息
  Future<HttpResult<Object>> fetchPaidServiceCleanDetailInfo(
    Map<String, dynamic>? data, {
    CancelToken? cancelToken,
  }) async {
    Map<String, dynamic> params = {};
    params = data!;
    Map<String, String> headers = {};
    // headers["Content-Type"] = "application/x-www-form-urlencoded";
    // headers["Accept"] = "application/x.yyjobs-api.v1+json";

    final result = await dioEngine.requestNetResult(
      '/api/v1/user/service/paid-service/detail', // api 地址
      params: params,
      headers: headers,
      method: HttpMethod.GET,
      isShowLoadingDialog: false,
      //是否展示默认的Loading弹窗
      networkDebounce: true,
      //是否防抖防止重复请求
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      var data = PaidServiceDetailEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert(data: data);
    }else {
      if(result.errorMsg != null && result.errorMsg!.isNotEmpty){
        ToastEngine.show("${result.errorMsg}");
      }
    }
    return result.convert();
  }

  // 获取 付费服务 时间段
  Future<HttpResult<Object>> fetchPaidServiceTimePeriod(
      Map<String, dynamic>? data, {
        CancelToken? cancelToken,
      }) async {
    Map<String, dynamic> params = {};
    params = data!;
    Map<String, String> headers = {};
    // headers["Content-Type"] = "application/x-www-form-urlencoded";
    // headers["Accept"] = "application/x.yyjobs-api.v1+json";

    final result = await dioEngine.requestNetResult(
      '/api/v1/user/service/paid-service/time-period', // api 地址
      params: params,
      headers: headers,
      method: HttpMethod.GET,
      isShowLoadingDialog: false,  //是否展示默认的Loading弹窗
      networkDebounce: false,   //是否防抖防止重复请求
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final list = result.getListJson();
      List<ServiceTimePeriodEntity> listEntity= list!.map((e)=>ServiceTimePeriodEntity.fromJson(e)).toList();
      //重新赋值data或list
      return result.convert(list: listEntity);
    }else {
      if(result.errorMsg != null && result.errorMsg!.isNotEmpty){
        ToastEngine.show("${result.errorMsg}");
      }
    }
    return result.convert();
  }

  // 付费服务 下单
  Future<HttpResult<Object>> fetchPaidServiceBook(
    Map<String, dynamic>? data, {
    CancelToken? cancelToken,
  }) async {
    Map<String, dynamic> params = {};
    params = data!;
    Map<String, String> headers = {};
    headers["Content-Type"] = "application/x-www-form-urlencoded";
    headers["Accept"] = "application/x.yyjobs-api.v1+json";

    final result = await dioEngine.requestNetResult(
      // ApiConstants.apiServerTime, // api 地址
      '/api/v1/user/service/paid-service-order/book', // api 地址
      params: params,
      headers: headers,
      method: HttpMethod.POST,
      isShowLoadingDialog: false,
      //是否展示默认的Loading弹窗
      networkDebounce: true,
      //是否防抖防止重复请求
      cancelToken: cancelToken,
    );
    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      var data = PaidServicePaySuccessInfoEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert(data: data);
    } else {
      if (result.errorMsg != null && result.errorMsg!.isNotEmpty) {
        ToastEngine.show("${result.errorMsg}");
      }
    }
    return result.convert();
  }

  // 付费服务  订单列表
  Future<HttpResult<GarageSaleHistoryEntity>> fetchPaidServiceOrderList({
    required String keyword,
    required String type,
    required int limit,
    required int curPage,
    CancelToken? cancelToken,
  }) async {
    Map<String, String> params = {};
    params['type'] = type;
    params['keyword'] = keyword;
    params['page'] = curPage.toString();
    params['limit'] = limit.toString();

    final result = await dioEngine.requestNetResult(
      '/api/v1/user/service/paid-service-order/index',
      params: params,
      method: HttpMethod.GET,
      isShowLoadingDialog: false,
      //是否展示默认的Loading弹窗
      networkDebounce: true,
      //是否防抖防止重复请求
      cancelToken: cancelToken,
    );

    if (result.isSuccess) {
      final json = result.getDataJson();
      var data = GarageSaleHistoryEntity.fromJson(json!);
      return result.convert<GarageSaleHistoryEntity>(data: data);
    }
    return result.convert();
  }

  // 获取 付费服务 订单详情
  Future<HttpResult<ServiceOrderDetailEntity>> fetchPaidServiceCleanOrderDetail({
    required String id,
    CancelToken? cancelToken,
  }) async {
    Map<String, dynamic> params = {};
    params['id'] = id;

    final result = await dioEngine.requestNetResult(
      '/api/v1/user/service/paid-service-order/detail',
      params: params,
      method: HttpMethod.GET,
      isShowLoadingDialog: false,
      //是否展示默认的Loading弹窗
      networkDebounce: true,
      //是否防抖防止重复请求
      cancelToken: cancelToken,
    );

    if (result.isSuccess) {
      final json = result.getDataJson();
      var data = ServiceOrderDetailEntity.fromJson(json!);
      return result.convert<ServiceOrderDetailEntity>(data: data);
    }
    return result.convert();
  }

  // 获取 付费订单实际需要支付的价格
  Future<HttpResult<Object>> fetchPaidServiceCleanOrderPrice(
    Map<String, dynamic>? data, {
    CancelToken? cancelToken,
  }) async {
    Map<String, dynamic> params = {};
    params = data!;
    Map<String, String> headers = {};
    // headers["Content-Type"] = "application/x-www-form-urlencoded";
    // headers["Accept"] = "application/x.yyjobs-api.v1+json";

    final result = await dioEngine.requestNetResult(
      // ApiConstants.apiServerTime, // api 地址
      '/api/v1/user/service/paid-service-order/price', // api 地址
      params: params,
      headers: headers,
      method: HttpMethod.GET,
      isShowLoadingDialog: false,
      //是否展示默认的Loading弹窗
      networkDebounce: true,
      //是否防抖防止重复请求
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      // var data = GarageSaleRentDetailEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert(data: json);
    } else {
      if (result.errorMsg != null && result.errorMsg!.isNotEmpty) {
        ToastEngine.show("${result.errorMsg}");
      }
    }
    return result.convert();
  }

  // 付费服务 取消订单
  Future<HttpResult> fetchCancelPaidServiceOrder({
    required String? id,
    required String? cancel_reason,
    CancelToken? cancelToken,
  }) async {
    Map<String, String> params = {};
    params['id'] = id ?? "";
    params['cancel_reason'] = cancel_reason  ?? "";

    final result = await dioEngine.requestNetResult(
      '/api/v1/user/service/paid-service-order/cancel',
      params: params,
      method: HttpMethod.POST,
      isShowLoadingDialog: true,
      networkDebounce: true,
      cancelToken: cancelToken,
    );

    if (result.isSuccess) {
      return result.convert();
    }
    return result.convert();
  }

  ///-------------------咨询类---------------------------------

  // 维修服务  列表
  Future<HttpResult<Object>> fetchRepairServiceList(
    Map<String, dynamic>? data, {
    CancelToken? cancelToken,
  }) async {
    Map<String, dynamic> params = {};
    params = data!;
    Map<String, String> headers = {};
    headers["Content-Type"] = "application/x-www-form-urlencoded";
    headers["Accept"] = "application/x.yyjobs-api.v1+json";

    final result = await dioEngine.requestNetResult(
      // ApiConstants.apiServerTime, // api 地址
      '/api/v1/user/service/inquiry-service/index', // api 地址
      params: params,
      headers: headers,
      method: HttpMethod.GET,
      isShowLoadingDialog: false,
      //是否展示默认的Loading弹窗
      networkDebounce: true,
      //是否防抖防止重复请求
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      var data = RepairServiceEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert(data: data);
    } else {
      if (result.errorMsg != null && result.errorMsg!.isNotEmpty) {
        ToastEngine.show("${result.errorMsg}");
      }
    }
    return result.convert();
  }

  // 获取 repair 详情信息
  Future<HttpResult<Object>> fetchServiceRepairDetailInfo(
    Map<String, dynamic>? data, {
    CancelToken? cancelToken,
  }) async {
    Map<String, dynamic> params = {};
    params = data!;
    Map<String, String> headers = {};
    // headers["Content-Type"] = "application/x-www-form-urlencoded";
    // headers["Accept"] = "application/x.yyjobs-api.v1+json";

    final result = await dioEngine.requestNetResult(
      // ApiConstants.apiServerTime, // api 地址
      '/api/v1/user/service/inquiry-service/detail', // api 地址
      params: params,
      headers: headers,
      method: HttpMethod.GET,
      isShowLoadingDialog: false,
      //是否展示默认的Loading弹窗
      networkDebounce: true,
      //是否防抖防止重复请求
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      var data = ServiceRepairDetailEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert(data: data);
    } else {
      if (result.errorMsg != null && result.errorMsg!.isNotEmpty) {
        ToastEngine.show("${result.errorMsg}");
      }
    }
    return result.convert();
  }

  // 维修服务 提交咨询
  Future<HttpResult<Object>> fetchRepairServiceSubmit(
    Map<String, dynamic>? data, {
    CancelToken? cancelToken,
  }) async {
    Map<String, dynamic> params = {};
    params = data!;
    Map<String, String> headers = {};
    headers["Content-Type"] = "application/x-www-form-urlencoded";
    headers["Accept"] = "application/x.yyjobs-api.v1+json";

    final result = await dioEngine.requestNetResult(
      // ApiConstants.apiServerTime, // api 地址
      '/api/v1/user/service/inquiry-service-order/submit', // api 地址
      params: params,
      headers: headers,
      method: HttpMethod.POST,
      isShowLoadingDialog: true,
      //是否展示默认的Loading弹窗
      networkDebounce: true,
      //是否防抖防止重复请求
      cancelToken: cancelToken,
    );
    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      // var data = NewsfeedForyouEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert(data: json);
    } else {
      if (result.errorMsg != null && result.errorMsg!.isNotEmpty) {
        ToastEngine.show("${result.errorMsg}");
      }
    }
    return result.convert();
  }

  // 维修服务  订单列表
  Future<HttpResult<ServiceInProgressEntity>> fetchRepairServiceOrderList({
    required String keyword,
    required int status,
    required int curPage,
    CancelToken? cancelToken,
  }) async {
    Map<String, String> params = {};
    params['keyword'] = keyword;
    params['status'] = status.toString();
    params['page'] = curPage.toString();
    params['limit'] = "10";

    final result = await dioEngine.requestNetResult(
      '/api/v1/user/service/inquiry-service-order/index',
      params: params,
      method: HttpMethod.GET,
      isShowLoadingDialog: false,
      //是否展示默认的Loading弹窗
      networkDebounce: true,
      //是否防抖防止重复请求
      cancelToken: cancelToken,
    );

    if (result.isSuccess) {
      final json = result.getDataJson();
      var data = ServiceInProgressEntity.fromJson(json!);
      return result.convert<ServiceInProgressEntity>(data: data);
    }
    return result.convert();
  }
}
