import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:fluwx/fluwx.dart';
import 'package:huixiang/generated/l10n.dart';
import 'package:huixiang/retrofit/data/base_data.dart';
import 'package:huixiang/retrofit/data/wx_pay.dart';
import 'package:huixiang/retrofit/retrofit_api.dart';
import 'package:huixiang/utils/min.dart';
import 'package:huixiang/view_widget/item_input_widget.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:huixiang/view_widget/my_appbar.dart';
import 'package:huixiang/view_widget/round_button.dart';
import 'package:shared_preferences/shared_preferences.dart';

class RechargePage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _RechargePage();
  }
}

class _RechargePage extends State<RechargePage> {
  ApiService apiService;

  TextEditingController controller = TextEditingController();

  Color color = Colors.black;

  @override
  void initState() {
    super.initState();

    SharedPreferences.getInstance().then((value) {
      apiService = ApiService(Dio(),
          context: context, token: value.getString("token"), pay: true);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: MyAppBar(
        title: S.of(context).chongzhi,
        titleColor: Colors.black,
        titleSize: 18.sp,
        background: Color(0xFFFFFFFF),
        leadingColor: Colors.black,
      ),
      body: SingleChildScrollView(
        physics: BouncingScrollPhysics(),
        child: Container(
          child: Column(
            children: [
              ItemInputWidget(
                S.of(context).qingshuruchongzhijine,
                hintText: "",
                controller: controller,
                padding: EdgeInsets.all(20),
                errorText: S.of(context).chongzhizuixiaojine(10),
                titleColor: Color(0xFF727272),
                errorTextColor: Color(0xFF32A060),
                radius: 8,
                style: TextStyle(
                  fontWeight: FontWeight.bold,
                  fontSize: 27.sp,
                  color: color,
                ),
                inputLimit: 6,
                textInputType: TextInputType.number,
                textInputFormatter: FilteringTextInputFormatter.digitsOnly,
                onChanged: (value) {
                  if (value != null &&
                      value != "" &&
                      double.tryParse(value) < 10) {
                    color = Colors.red;
                  } else {
                    color = Colors.black;
                  }
                  setState(() {});
                },
              ),
              Container(
                width: double.infinity,
                margin: EdgeInsets.only(
                  left: 20.w,
                  right: 20.w,
                  top: 12.h,
                  bottom: 4.h,
                ),
                padding: EdgeInsets.only(
                  left: 20.w,
                  right: 16.w,
                  top: 20.h,
                  bottom: 20.h,
                ),
                decoration: BoxDecoration(
                  boxShadow: [
                    BoxShadow(
                      color: Color(0x000000).withAlpha(25),
                      offset: Offset(0, 1),
                      blurRadius: 12.0,
                    ),
                  ],
                  color: Colors.white,
                  borderRadius: BorderRadius.circular(4),
                ),
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.spaceAround,
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Padding(
                      padding: EdgeInsets.only(bottom: 16.h),
                      child: Text(
                        S.of(context).zhifufangshi,
                        style: TextStyle(
                          fontSize: 16.sp,
                          color: Colors.black,
                          fontWeight: FontWeight.bold,
                        ),
                      ),
                    ),
                    GestureDetector(
                      onTap: () {
                        setState(() {
                          checkIndex = 1;
                        });
                      },
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.start,
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: [
                          Image.asset("assets/image/icon_we_chat.png"),
                          Expanded(
                            flex: 1,
                            child: Padding(
                              padding: EdgeInsets.only(left: 8.w),
                              child: Text(
                                S.of(context).weixinzhifu,
                                style: TextStyle(
                                  fontSize: 14.sp,
                                  color: Color(0xff353535),
                                ),
                              ),
                            ),
                          ),
                          checkView(1),
                        ],
                      ),
                    ),
                  ],
                ),
              ),
              InkWell(
                onTap: () {
                  recharge();
                },
                child: Container(
                  margin: EdgeInsets.only(left: 20.w, right: 20.w, top: 26.h),
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.spaceAround,
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      RoundButton(
                        width: double.infinity,
                        height: 46.h,
                        text: S.of(context).querenchongzhi,
                        textColor: Colors.white,
                        fontSize: 14.sp,
                        backgroup: Color(0xff32A060),
                        fontWeight: FontWeight.bold,
                      ),
                    ],
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }

  var checkIndex = 1;

  Widget checkView(var index) {
    return Container(
      padding: EdgeInsets.only(right: 16.w),
      alignment: Alignment.center,
      child: Image.asset(
        checkIndex != index
            ? "assets/image/icon_radio_unselected.png"
            : "assets/image/icon_radio_selected.png",
        width: 15.w,
        height: 15.h,
      ),
    );
  }

  recharge() async {
    String money = controller.text;
    if (money == null || money == "") {
      SmartDialog.showToast(S.of(context).qingshuruchongzhijine,
          alignment: Alignment.center);
      return;
    }
    int amount = int.tryParse(money);
    if (checkIndex == 1) {
      if (amount < 10) {
        SmartDialog.showToast(S.of(context).chongzhizuixiaojine(10),
            alignment: Alignment.center);
        return;
      }

      if (!(await Min.isInitialize())) {
        // 小程序的微信支付和app的充值支付使用同一个WXPayEntryActivity回调,
        // 然而充值时小程序未初始化会导致回调内部代码调用getPackage空指针,
        // 故而在此初始化一下
        await Min.initialize();
      }

      BaseData<WxPay> baseData =
          await apiService.recharge({"amount": amount, "rechargeType": 2});
      if (baseData != null && baseData.isSuccess) {
        WxPay wxPay = baseData.data;
        await registerWxApi(
          appId: wxPay.appId,
          doOnAndroid: true,
          universalLink: "https://hx.lotus-wallet.com/app/",
        );
        payWithWeChat(
          appId: wxPay.appId,
          partnerId: wxPay.partnerId,
          prepayId: wxPay.prepayId,
          packageValue: wxPay.packageValue,
          nonceStr: wxPay.nonceStr,
          timeStamp: int.tryParse(wxPay.timeStamp),
          sign: wxPay.sign,
        );
        weChatResponseEventHandler.listen((event) async {
          print("payCallback: ${event.errCode}");
        });
      }
    }
  }
}