import 'dart:convert';
import 'dart:io';

import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:huixiang/generated/l10n.dart';
import 'package:huixiang/retrofit/data/base_data.dart';
import 'package:huixiang/view_widget/login_tips.dart';
import 'package:retrofit/retrofit.dart';
import 'package:shared_preferences/shared_preferences.dart';

part 'retrofit_api.g.dart';

const base_url = "https://pos.platform.lotus-wallet.com/app/"; ///正式
const baseUrl = "https://pos.platform.lotus-wallet.com/app/";  ///正式

// const base_url = "http://192.168.10.236:8766/app/";
// const baseUrl = "http://192.168.10.236:8766/app/";

/// 本地

@RestApi(baseUrl: baseUrl)
abstract class ApiService {
  factory ApiService(Dio dio,
      {String baseUrl,
      BuildContext context,
      String token,
      bool showLoading = true,
      bool pay = false}) {
    Map<String, dynamic> headers =
        (token == null || token == "") ? {} : {'token': "Bearer $token"};
    if (pay) {
      headers["Environment"] = "app";
    }
    dio.options = BaseOptions(
        connectTimeout: 60000,
        receiveTimeout: 60000,
        headers: headers,
        responseType: ResponseType.json);
    dio.interceptors.add(
      InterceptorsWrapper(onRequest: (RequestOptions options) {
        debugPrint("\n====================== 请求数据 =======================");
        debugPrint("method = ${options.method.toString()}");
        debugPrint("url = ${options.uri.toString()}");
        debugPrint("headers = ${options.headers}");
        if (showLoading) {
          //是否显示loading
          SmartDialog.showLoading(msg: S.current.zhengzaijiazai);
        }
        if (options.data is FormData) {
          debugPrint("params data = FormData");
        } else {
          debugPrint("params data = ${jsonEncode(options.data)}");
        }
        debugPrint("params queryParameters = ${options.queryParameters}");
      }, onResponse: (Response response) {
        if (showLoading) {
          SmartDialog.dismiss();
        }
        debugPrint("\n====================== 响应数据开始 =====================");
        debugPrint("code = ${response.statusCode}");
        p(jsonEncode(response.data));
        Map map = response.data;
        if (map["code"] == 40005 || map["code"] == 40001) {
          SmartDialog.show(
            widget: LoginTips(
              click: () {
                SharedPreferences.getInstance().then((value) {
                  value.setString("token", "");
                  value.setString("user", "");
                  value.setString("userJson", "");
                  value.setString("userId", "");
                  value.setString("mobile", "");
                  value.setString("nick", "");
                });
                Navigator.of(context).pushNamed('/router/login_page',
                    arguments: {"login": "login"});
              },
            ),
            clickBgDismissTemp: false,
          );
        } else if (map["code"] != 0 && response.request.baseUrl == baseUrl) {
          ///高德地图的poi服务请求不需要toast
          SmartDialog.showToast(map["msg"], alignment: Alignment.center);
        }
        debugPrint("======================= 响应数据结束 =======================\n");
      }, onError: (DioError e) {
        if (showLoading) {
          SmartDialog.dismiss();
        }
        debugPrint("\n=======================错误响应数据 ========================");
        debugPrint("type = ${e.type}");
        debugPrint("message = ${e.message}");
        debugPrint("\n");
      }),
    );

    if (kReleaseMode) {
      baseUrl = base_url;
    }
    return _ApiService(dio, baseUrl: baseUrl);
  }

  static showDialog(context) async {
    dynamic ddd = await showCupertinoDialog(
      context: context,
      barrierDismissible: false,
      builder: (context) {
        return LoginTips();
      },
    );
    print("ddd: $ddd");
  }

  static void p(String msg) {
    //因为String的length是字符数量不是字节数量所以为了防止中文字符过多,
    //  把4*1024的MAX字节打印长度改为1000字符数
    int maxStrLength = 900;
    //大于1000时
    while (msg.length > maxStrLength) {
      debugPrint(msg.substring(0, maxStrLength));
      msg = msg.substring(maxStrLength);
    }
    //剩余部分
    print(msg);
  }

  ///文件上传
  @POST("/file/upload")
  @MultiPart()
  Future<BaseData> upload(
      @Part(name: "file") File data, @Part(name: "folderId") int folderId);

  /// 周边搜索
  @GET(
      "https://restapi.amap.com/v3/place/around?key=542b46afa8e4b88fe1eb3c4d0ba0872f&location={lat},{lng}&keywords={keywords}&offset={size}&page={page}&extensions=all")
  Future<dynamic> searchPoi(@Path("lat") String lat, @Path("lng") String lng,
      @Path("keywords") String keywords, int size, int page);

  /// 用户登录
  @POST("/auth/platform/memberLogin")
  Future<BaseData> memberLogin(@Body() Map<String, dynamic> param);

  ///发送验证码
  @GET("/auth/sendVerify/{mobile}")
  Future<BaseData> sendVerify(@Path("mobile") String mobile);

  ///积分商城商品列表
  @POST("/creditGoods/list")
  Future<BaseData> creditGoods(@Body() Map<String, dynamic> param);

  ///积分商城商品分類列表
  @POST("/creditGoodsCategory/page")
  Future<BaseData> goodsCategory(@Body() Map<String, dynamic> param);

  ///积分商城商品详情
  @GET("/creditGoods/{id}")
  Future<BaseData> creditGoodsById(@Path("id") String id);

  ///查询用户信息
  @GET("/member/info")
  Future<BaseData> queryInfo();

  ///编辑用户信息
  @POST("/member/editMemberInfo")
  Future<BaseData> editInfo(@Body() Map<String, dynamic> param);

  ///用户签到信息
  @GET("/member/signInInfo")
  Future<BaseData> signInInfo();

  ///用户签到
  @GET("/member/signIn")
  Future<BaseData> signIn();

  ///会员充值
  @POST("/wallet/recharge")
  Future<BaseData> recharge(@Body() Map<String, dynamic> param);

  ///领取优惠券
  @GET("/coupon/receive?couponId={couponId}")
  Future<BaseData> receiveCoupon(@Path("couponId") String couponId);

  ///订单列表
  @POST("/creditOrder/list")
  Future<BaseData> creditOrderList(@Body() Map<String, dynamic> param);

  ///创建积分订单
  @POST("/creditOrder/create")
  Future<BaseData> creditOrder(@Body() Map<String, dynamic> param);

  ///保存收货地址
  @POST("/address/add")
  Future<BaseData> addAddress(@Body() Map<String, dynamic> param);

  ///删除收货地址
  @POST("/address/delete")
  Future<BaseData> deleteAddress(@Body() Map<String, dynamic> param);

  ///查询收货地址
  @GET("/address/detail/{id}")
  Future<BaseData> queryAddress(@Path("id") String id);

  ///查询用户所有的收货地址
  @GET("/address/queryMemberAddress")
  Future<BaseData> queryMemberAddress();

  ///更新收货地址
  @POST("/address/update")
  Future<BaseData> updateAddress(@Body() Map<String, dynamic> param);

  ///查询领券列表
  @POST("/coupon/centreList")
  Future<BaseData> queryCoupon(@Body() Map<String, dynamic> param);

  ///查询卡包列表
  @POST("/coupon/packageList")
  Future<BaseData> queryCard(@Body() Map<String, dynamic> param);

  ///门店地址列表
  @POST("/store/list")
  Future<BaseData> queryStore(@Body() Map<String, dynamic> param);

  ///分页查看资讯列表
  @POST("/information/list")
  Future<BaseData> informationList(@Body() Map<String, dynamic> param);

  ///查看资讯详情
  @GET("/information/{id}")
  Future<BaseData> informationInfo(@Path("id") String id);

  ///积分订单兑换到券包
  @GET("/creditOrder/receive/{id}")
  Future<BaseData> creditOrderReceive(@Path("id") String id);

  ///首页数据
  @GET("/home/home")
  Future<BaseData> queryHome();

  ///查询店铺商家详情
  @GET("/store/{id}")
  Future<BaseData> queryStoreInfo(@Path("id") String id);

  ///分页查看资讯列表
  @POST("/information/list")
  Future<BaseData> queryArticle(@Body() Map<String, dynamic> param);

  ///banner查询
  @POST("/banner/page")
  Future<BaseData> queryBanner(@Body() Map<String, dynamic> param);

  ///品牌信息
  @GET("/home/brand")
  Future<BaseData> queryHomeBrand();

  ///小程序会员登录
  @GET("/auth/mini/login/{storeId}")
  Future<BaseData> minLogin(@Path("storeId") String storeId);

  ///
  @POST("/member/listBill")
  Future<BaseData> queryBillInfo(@Body() Map<String, dynamic> param);

  ///会员等级列表
  @GET("/member/rankList")
  Future<BaseData> rankList();

  ///订单列表
  @POST("/order/list")
  Future<BaseData> orderList(@Body() Map<String, dynamic> param);

  ///订单详情
  @GET("/order/orderDetail?id={id}")
  Future<BaseData> orderDetail(@Path("id") String id);

  ///继续付款
  @POST("/order/continuePay")
  Future<BaseData> continuePay(@Body() Map<String, dynamic> param);

  ///积分订单兑换到券包
  @GET("/creditOrder/receive/{id}")
  Future<BaseData> receiveToCard(@Path("id") String id);

  ///会员卡列表
  @GET("/member/vipList")
  Future<BaseData> vipList();

  ///会员卡详情
  @GET("/member/vipDetail/{id}")
  Future<BaseData> vipDetail(@Path("id") String id);

  ///分页查询App消息列表
  @POST("/app-msg/list")
  Future<BaseData> msgList(@Body() Map<String, dynamic> param);

  ///App消息详情
  @GET("/app-msg/{id}")
  Future<BaseData> queryMsg(@Path("id") String id);

  ///给文章/活动点赞
  @GET("/information/likes/{id}")
  Future<BaseData> informationLikes(@Path("id") String id);

  ///发布评论
  @POST("/memberComment")
  Future<BaseData> memberComment(@Body() Map<String, dynamic> param);

  ///查询评论列表
  @POST("/memberComment/list")
  Future<BaseData> memberCommentList(@Body() Map<String, dynamic> param);

  ///给文章/活动点赞
  @GET("/memberComment/likes/{id}")
  Future<BaseData> commentLike(@Path("id") String id);
}