import 'package:domain/constants/api_constants.dart';
import 'package:domain/entity/myfollowing_list_entity.dart';
import 'package:domain/entity/myposts_newsfeed_entity.dart';
import 'package:domain/entity/newsfeed_comment_publish_entity.dart';
import 'package:domain/entity/newsfeed_detail_entity.dart';
import 'package:domain/entity/newsfeed_following_entity.dart';
import 'package:domain/entity/newsfeed_foryou_entity.dart';
import 'package:domain/entity/newsfeed_news_entity.dart';
import 'package:domain/entity/server_time.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 'common_newsfeed.g.dart';

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

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

  CommonNewsFeedRespository({required this.dioEngine});

  // news feed - news 列表
  Future<HttpResult<Object>> fetchNewsList(
      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/news-feed/feed/news', // api 地址
      params: params,
      headers: headers,
      method: HttpMethod.GET,
      isShowLoadingDialog: false,  //是否展示默认的Loading弹窗
      networkDebounce: false,   //是否防抖防止重复请求
      cancelToken: cancelToken,
    );

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

  // news feed - following 列表
  Future<HttpResult<Object>> fetchFollowingList(
      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/news-feed/feed/following', // api 地址
      params: params,
      headers: headers,
      method: HttpMethod.GET,
      isShowLoadingDialog: false,  //是否展示默认的Loading弹窗
      networkDebounce: false,   //是否防抖防止重复请求
      cancelToken: cancelToken,
    );

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

  // news feed - foryou 列表
  Future<HttpResult<Object>> fetchForyouList(
      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/news-feed/feed/for-you', // api 地址
      params: params,
      headers: headers,
      method: HttpMethod.GET,
      isShowLoadingDialog: false,  //是否展示默认的Loading弹窗
      networkDebounce: false,   //是否防抖防止重复请求
      cancelToken: cancelToken,
    );

    //根据返回的结果，封装原始数据为Bean/Entity对象
    if (result.isSuccess) {
      //重新赋值data或list
      final json = result.getDataJson();
      var data = NewsfeedForyouEntity.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>> fetchNewsFeedDetailInfo(
      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/news-feed/feed/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 = NewsfeedDetailEntity.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>> fetchNewsfeedCommentSubmit(
      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/news-feed/comment/publish', // 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 = NewsfeedCommentPublishEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert(data: data);
    }else {
      if(result.errorMsg != null && result.errorMsg!.isNotEmpty){
        ToastEngine.show("${result.errorMsg}");
      }
    }
    return result.convert();
  }

  // news feed - post 发布newsfeed
  Future<HttpResult<Object>> fetchNewsfeedPublish(
      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/news-feed/index/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 = NewsfeedCommentPublishEntity.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>> fetchMyFollowList(
      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/me/index/follows', // 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 data = ListJson!.map((e) => MyfollowingListEntity.fromJson(e!)).toList();
      //重新赋值data或list
      return result.convert(list: data);
    }else {
      if(result.errorMsg != null && result.errorMsg!.isNotEmpty){
        ToastEngine.show("${result.errorMsg}");
      }
    }
    return result.convert();
  }

  // 获取 关注我的人
  Future<HttpResult<Object>> fetchMyFlowerList(
      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/me/index/flowers', // 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 data = ListJson!.map((e) => MyfollowingListEntity.fromJson(e!)).toList();
      //重新赋值data或list
      return result.convert(list: data);
    }else {
      if(result.errorMsg != null && result.errorMsg!.isNotEmpty){
        ToastEngine.show("${result.errorMsg}");
      }
    }
    return result.convert();
  }

  // news feed 点赞/取消点赞
  Future<HttpResult<Object>> fetchLikeClick(
      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/news-feed/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();
      // var data = NewsfeedForyouEntity.fromJson(json!);
      //重新赋值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>> handlerFollowOrCancel(
      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/me/index/follow', // 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();
  }

  // 获取 我发布的newsfeed
  Future<HttpResult<Object>> fetchMyPostNewsfeedList(
      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/me/post/news-feed', // 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 = MypostsNewsfeedEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert(data: data);
    }else {
      if(result.errorMsg != null && result.errorMsg!.isNotEmpty){
        ToastEngine.show("${result.errorMsg}");
      }
    }
    return result.convert();
  }

  // 获取 我发布的 garage
  Future<HttpResult<Object>> fetchMyPostGarageList(
      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/me/post/garage-sale', // 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 = NewsfeedDetailEntity.fromJson(json!);
      //重新赋值data或list
      return result.convert(data: data);
    }else {
      if(result.errorMsg != null && result.errorMsg!.isNotEmpty){
        ToastEngine.show("${result.errorMsg}");
      }
    }
    return result.convert();
  }

}
