import 'package:domain/entity/response/labour_request_edit_index_entity.dart';
import 'package:domain/entity/response/labour_request_index_entity.dart';
import 'package:domain/entity/response/labour_request_list_entity.dart';
import 'package:domain/entity/response/labour_request_work_flow_entity.dart';
import 'package:get/get.dart';
import 'package:plugin_platform/platform_export.dart';
import 'package:plugin_platform/http/http_provider.dart';
import 'package:plugin_platform/http/http_result.dart';
import 'package:shared/utils/util.dart';

import '../constants/api_constants.dart';
import '../entity/response/job_template_edit_index_entity.dart';
import '../entity/response/labour_review_list_entity.dart';
import '../entity/response/labour_review_status_entity.dart';

/// 用工请求相关
class LabourRepository extends GetxService {
  HttpProvider httpProvider;

  LabourRepository({required this.httpProvider});

  /// 获取用工请求的筛选选项
  Future<HttpResult<LabourRequestIndexEntity>> fetchLabourRequestIndex({
    CancelToken? cancelToken,
  }) async {
    final result = await httpProvider.requestNetResult(
      ApiConstants.apiLabourRequestIndex,
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      var data = LabourRequestIndexEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert<LabourRequestIndexEntity>(data: data);
    }
    return result.convert();
  }

  /// 获取用工请求的主列表
  Future<HttpResult<LabourRequestListEntity>> fetchLabourRequestList(
    String? keyword,
    String? startDate,
    String? endDate,
    String? statusId,
    String? departmentId, {
    required int curPage,
    CancelToken? cancelToken,
  }) async {
    //参数
    Map<String, String> params = {};
    params["cur_page"] = curPage.toString();
    params["page_size"] = "20";

    if (!Utils.isEmpty(keyword)) {
      params["job_title"] = keyword!;
    }
    if (!Utils.isEmpty(startDate)) {
      params["job_start"] = startDate!;
    }
    if (!Utils.isEmpty(endDate)) {
      params["job_end"] = endDate!;
    }
    if (!Utils.isEmpty(statusId)) {
      params["co_status"] = statusId!;
    }
    if (!Utils.isEmpty(departmentId)) {
      params["co_department_id"] = departmentId!;
    }

    final result = await httpProvider.requestNetResult(
      ApiConstants.apiLabourRequestList,
      params: params,
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      var data = LabourRequestListEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert<LabourRequestListEntity>(data: data);
    }
    return result.convert();
  }

  /// 根据ID获取主列表的Item数据，用于刷新Item
  Future<HttpResult<LabourRequestListEntity>> fetchItemByRequestId(
    String? requestId, {
    CancelToken? cancelToken,
  }) async {
    //参数
    Map<String, String> params = {};
    params["cur_page"] = "1";
    params["page_size"] = "1";

    if (!Utils.isEmpty(requestId)) {
      params["request_id"] = requestId!;
    }

    final result = await httpProvider.requestNetResult(
      ApiConstants.apiLabourRequestList,
      params: params,
      isShowLoadingDialog: true,
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      var data = LabourRequestListEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert<LabourRequestListEntity>(data: data);
    }
    return result.convert();
  }

  /// 添加用工的选项
  Future<HttpResult<LabourRequestEditIndexEntity>> fetchLabourRequestAddOption({
    CancelToken? cancelToken,
  }) async {
    final result = await httpProvider.requestNetResult(
      ApiConstants.apiLabourRequestAddOption,
      isShowLoadingDialog: true,
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      var data = LabourRequestEditIndexEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert<LabourRequestEditIndexEntity>(data: data);
    }
    return result.convert();
  }

  /// 添加用工请求发布
  Future<HttpResult> addLabourRequestSubmit(
    String? templateId,
    String? jobStart,
    String? jobEnd,
    String? departmentId,
    String? needNum,
    String? salaryBy,
    String? amount, {
    CancelToken? cancelToken,
  }) async {
    //参数
    Map<String, String> params = {};
    params['template_id'] = templateId ?? "";
    params['job_start'] = jobStart ?? "";
    params['job_end'] = jobEnd ?? "";
    params['need_num'] = needNum ?? "";
    if (!Utils.isEmpty(departmentId)) {
      params["co_department_id"] = departmentId!;
    }

    params['salary_by'] = salaryBy ?? "";

    if (!Utils.isEmpty(amount)) {
      params["amount"] = amount!;
    }

    final result = await httpProvider.requestNetResult(
      ApiConstants.apiLabourRequestAddSubmit,
      method: HttpMethod.POST,
      params: params,
      networkDebounce: true,
      isShowLoadingDialog: true,
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      return result.convert();
    }
    return result.convert();
  }

  /// 用工的编辑详情
  Future<HttpResult<LabourRequestEditIndexEntity>> fetchLabourRequestEditDetail(
    String? requestId, {
    CancelToken? cancelToken,
  }) async {
    //参数
    Map<String, String> params = {};
    params['request_id'] = requestId ?? "";

    final result = await httpProvider.requestNetResult(
      ApiConstants.apiLabourRequestEditDetail,
      params: params,
      isShowLoadingDialog: true,
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      var data = LabourRequestEditIndexEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert<LabourRequestEditIndexEntity>(data: data);
    }
    return result.convert();
  }

  /// 编辑用工请求发布
  Future<HttpResult> editLabourRequestSubmit(
    String? requestId,
    String? templateId,
    String? jobStart,
    String? jobEnd,
    String? departmentId,
    String? needNum,
    String? salaryBy,
    String? amount, {
    CancelToken? cancelToken,
  }) async {
    //参数
    Map<String, String> params = {};
    params['request_id'] = requestId ?? "";
    params['template_id'] = templateId ?? "";
    params['job_start'] = jobStart ?? "";
    params['job_end'] = jobEnd ?? "";
    params['need_num'] = needNum ?? "";
    if (!Utils.isEmpty(departmentId)) {
      params["co_department_id"] = departmentId!;
    }

    params['salary_by'] = salaryBy ?? "";

    if (!Utils.isEmpty(amount)) {
      params["amount"] = amount!;
    }

    final result = await httpProvider.requestNetResult(
      ApiConstants.apiLabourRequestEditSubmit,
      method: HttpMethod.POST,
      params: params,
      networkDebounce: true,
      isShowLoadingDialog: true,
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      return result.convert();
    }
    return result.convert();
  }

  /// 撤回用工请求
  Future<HttpResult> recallLabourRequest(
    String? requestId, {
    CancelToken? cancelToken,
  }) async {
    //参数
    Map<String, String> params = {};
    params['request_id'] = requestId ?? "";

    final result = await httpProvider.requestNetResult(
      ApiConstants.apiLabourRequestRecall,
      method: HttpMethod.POST,
      params: params,
      networkDebounce: true,
      isShowLoadingDialog: true,
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      return result.convert();
    }
    return result.convert();
  }

  ///  用工的审核详情工作流列表
  Future<HttpResult<LabourRequestWorkFlowEntity>> fetchLabourRequestWorkFlow(
    String? requestId, {
    CancelToken? cancelToken,
  }) async {
    //参数
    Map<String, String> params = {};
    if (!Utils.isEmpty(requestId)) {
      params["request_id"] = requestId!;
    }

    final result = await httpProvider.requestNetResult(
      ApiConstants.apiLabourRequestStateWorkFlow,
      params: params,
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      var data = LabourRequestWorkFlowEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert<LabourRequestWorkFlowEntity>(data: data);
    }
    return result.convert();
  }

  /// 添加工作模板的详情或选项数据
  Future<HttpResult<JobTemplateEditIndexEntity>> fetchJobTemplateAddIndex({
    CancelToken? cancelToken,
  }) async {
    final result = await httpProvider.requestNetResult(
      ApiConstants.apiJobTemplateAddIndexSG,
      isShowLoadingDialog: true,
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      var data = JobTemplateEditIndexEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert<JobTemplateEditIndexEntity>(data: data);
    }
    return result.convert();
  }

  /// 编辑工作模板的详情或选项数据
  Future<HttpResult<JobTemplateEditIndexEntity>> fetchJobTemplateEditIndex(
    String? templateId, {
    CancelToken? cancelToken,
  }) async {
    Map<String, String> params = {};
    params["template_id"] = templateId ?? "";

    final result = await httpProvider.requestNetResult(
      ApiConstants.apiJobTemplateEditIndexSG,
      params: params,
      isShowLoadingDialog: true,
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      var data = JobTemplateEditIndexEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert<JobTemplateEditIndexEntity>(data: data);
    }
    return result.convert();
  }

  /// 添加工作模板的提交
  Future<HttpResult> addLabourTemplateSubmit(
    String? name,
    String? description,
    String? note,
    String? age,
    String? sex,
    String? language, {
    CancelToken? cancelToken,
  }) async {
    //参数
    Map<String, String> params = {};
    params['job_title'] = name ?? "";

    if (!Utils.isEmpty(description)) {
      params["description"] = description!;
    }

    if (!Utils.isEmpty(note)) {
      params["note"] = note!;
    }

    if (!Utils.isEmpty(age)) {
      params["age"] = age!;
    }

    if (!Utils.isEmpty(sex)) {
      params["gender"] = sex!;
    }

    if (!Utils.isEmpty(language)) {
      params["language"] = language!;
    }

    final result = await httpProvider.requestNetResult(
      ApiConstants.apiJobTemplateAddSubmitSG,
      method: HttpMethod.POST,
      params: params,
      networkDebounce: true,
      isShowLoadingDialog: true,
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      return result.convert();
    }
    return result.convert();
  }

  /// 编辑工作模板的提交
  Future<HttpResult> editLabourTemplateSubmit(
    String? templateId,
    String? name,
    String? description,
    String? note,
    String? age,
    String? sex,
    String? language, {
    CancelToken? cancelToken,
  }) async {
    //参数
    Map<String, String> params = {};
    params['job_title'] = name ?? "";
    params['template_id'] = templateId ?? "";

    if (!Utils.isEmpty(description)) {
      params["description"] = description!;
    }

    if (!Utils.isEmpty(note)) {
      params["note"] = note!;
    }

    if (!Utils.isEmpty(age)) {
      params["age"] = age!;
    }

    if (!Utils.isEmpty(sex)) {
      params["gender"] = sex!;
    }

    if (!Utils.isEmpty(language)) {
      params["language"] = language!;
    }

    final result = await httpProvider.requestNetResult(
      ApiConstants.apiJobTemplateEditSubmitSG,
      method: HttpMethod.POST,
      params: params,
      networkDebounce: true,
      isShowLoadingDialog: true,
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      return result.convert();
    }
    return result.convert();
  }

  /// 用工审核选项
  Future<HttpResult<LabourRequestIndexEntity>> fetchLabourReviewIndex({
    CancelToken? cancelToken,
  }) async {
    final result = await httpProvider.requestNetResult(
      ApiConstants.apiLabourReviewIndex,
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      var data = LabourRequestIndexEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert<LabourRequestIndexEntity>(data: data);
    }
    return result.convert();
  }

  /// 用工审核列表
  Future<HttpResult<LabourReviewListEntity>> fetchLabourReviewList(
    String? keyword,
    String? startDate,
    String? endDate,
    String? departmentId, {
    required int curPage,
    CancelToken? cancelToken,
  }) async {
    //参数
    Map<String, String> params = {};
    params["cur_page"] = curPage.toString();
    params["page_size"] = "20";

    if (!Utils.isEmpty(keyword)) {
      params["job_title"] = keyword!;
    }
    if (!Utils.isEmpty(startDate)) {
      params["job_start"] = startDate!;
    }
    if (!Utils.isEmpty(endDate)) {
      params["job_end"] = endDate!;
    }
    if (!Utils.isEmpty(departmentId)) {
      params["department_id"] = departmentId!;
    }

    final result = await httpProvider.requestNetResult(
      ApiConstants.apiLabourReviewTable,
      params: params,
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      var data = LabourReviewListEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert<LabourReviewListEntity>(data: data);
    }
    return result.convert();
  }

  /// 根据ID获取主列表的Item数据，用于刷新审核列表Item
  Future<HttpResult<LabourReviewListEntity>> fetchItemByRecordId(
    String? recordId, {
    CancelToken? cancelToken,
  }) async {
    //参数
    Map<String, String> params = {};
    params["cur_page"] = "1";
    params["page_size"] = "1";

    if (!Utils.isEmpty(recordId)) {
      params["record_id"] = recordId!;
    }

    final result = await httpProvider.requestNetResult(
      ApiConstants.apiLabourReviewTable,
      params: params,
      isShowLoadingDialog: true,
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      var data = LabourReviewListEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert<LabourReviewListEntity>(data: data);
    }
    return result.convert();
  }

  /// 用工审核的编辑详情
  Future<HttpResult<LabourRequestEditIndexEntity>> fetchLabourReviewDetail(
    String? requestId, {
    CancelToken? cancelToken,
  }) async {
    //参数
    Map<String, String> params = {};
    params['request_id'] = requestId ?? "";

    final result = await httpProvider.requestNetResult(
      ApiConstants.apiLabourReviewDetail,
      params: params,
      isShowLoadingDialog: true,
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      var data = LabourRequestEditIndexEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert<LabourRequestEditIndexEntity>(data: data);
    }
    return result.convert();
  }

  /// 用工审核的编辑提交
  Future<HttpResult> editLabourReviewSubmit(
    String? requestId,
    String? templateId,
    String? jobStart,
    String? jobEnd,
    String? departmentId,
    String? needNum,
    String? salaryBy,
    String? amount, {
    CancelToken? cancelToken,
  }) async {
    //参数
    Map<String, String> params = {};
    params['request_id'] = requestId ?? "";
    params['template_id'] = templateId ?? "";
    params['job_start'] = jobStart ?? "";
    params['job_end'] = jobEnd ?? "";
    params['need_num'] = needNum ?? "";
    if (!Utils.isEmpty(departmentId)) {
      params["co_department_id"] = departmentId!;
    }

    params['salary_by'] = salaryBy ?? "";

    if (!Utils.isEmpty(amount)) {
      params["amount"] = amount!;
    }

    final result = await httpProvider.requestNetResult(
      ApiConstants.apiLabourReviewEdit,
      method: HttpMethod.POST,
      params: params,
      networkDebounce: true,
      isShowLoadingDialog: true,
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      return result.convert();
    }
    return result.convert();
  }

  /// 用工审核的审核流程列表
  Future<HttpResult<LabourReviewStatusEntity>> fetchLabourReviewStatusView(
    String? requestId, {
    CancelToken? cancelToken,
  }) async {
    //参数
    Map<String, String> params = {};
    params['request_id'] = requestId ?? "";

    final result = await httpProvider.requestNetResult(
      ApiConstants.apiLabourReviewStatusView,
      params: params,
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      var data = LabourReviewStatusEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert<LabourReviewStatusEntity>(data: data);
    }
    return result.convert();
  }

  /// 用工审核的批量同意
  Future<HttpResult> approveLabourReviews(
    String? recordIds, {
    CancelToken? cancelToken,
  }) async {
    //参数
    Map<String, String> params = {};
    params['record_ids'] = recordIds ?? "";

    final result = await httpProvider.requestNetResult(
      ApiConstants.apiLabourReviewApprove,
      method: HttpMethod.POST,
      params: params,
      networkDebounce: true,
      isShowLoadingDialog: true,
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      return result.convert();
    }
    return result.convert();
  }

  /// 用工审核的批量拒绝
  Future<HttpResult> rejectLabourReviews(
    String? recordIds,
    String? reason, {
    CancelToken? cancelToken,
  }) async {
    //参数
    Map<String, String> params = {};
    params['record_ids'] = recordIds ?? "";

    if (Utils.isNotEmpty(reason)) {
      params['audit_mark'] = reason ?? "";
    }

    final result = await httpProvider.requestNetResult(
      ApiConstants.apiLabourReviewReject,
      method: HttpMethod.POST,
      params: params,
      networkDebounce: true,
      isShowLoadingDialog: true,
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      return result.convert();
    }
    return result.convert();
  }
}
