package com.edufound.reader.base;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.alibaba.fastjson.JSONObject;
import com.baidu.duer.bot.directive.payload.AmountInfo;
import com.baidu.duer.botsdk.BotIntent;
import com.baidu.duer.botsdk.IAccountChargeMsgListener;
import com.edufound.reader.apiserver.UserApiServerImpl;
import com.edufound.reader.application.EApplication;
import com.edufound.reader.bean.BaiDuUserInfo;
import com.edufound.reader.bean.ChannelCodeEnum;
import com.edufound.reader.bean.HttpResultBean;
import com.edufound.reader.bean.SignBean;
import com.edufound.reader.bean.UserBean;
import com.edufound.reader.botsdk.BotRegisterListener;
import com.edufound.reader.botsdk.IBotIntentCallback;
import com.edufound.reader.cusview.CusToast;
import com.edufound.reader.receiver.NetworkChangeReceiver;
import com.edufound.reader.util.Consts;
import com.edufound.reader.util.DeviceUuidFactory;
import com.edufound.reader.util.EfunboxUtil;
import com.edufound.reader.util.MMKVEncodeKey;
import com.edufound.reader.util.MMKVUtil;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.jakewharton.rxbinding4.view.RxView;
import com.okhttplib.HttpInfo;
import com.okhttplib.callback.Callback;
import com.orhanobut.logger.Logger;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;

import cc.taylorzhang.singleclick.SingleClickUtil;
import io.reactivex.rxjava3.annotations.Nullable;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.functions.Consumer;

public abstract class BaseFragment extends Fragment {

    public CompositeDisposable mCompositeDisposable;
    Gson mGson;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mGson = new Gson();
        // 注册网络广播
        NetworkChangeReceiver.registerReceiver(getContext());
        NetworkChangeReceiver.registerObserver(NetStateChangeObserver);

    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        EfunboxUtil.initDesignSize(getActivity());
        View view = inflater.inflate(this.getLayoutId(), container, false);
        initView(view);
        initViewListener();

        return view;
    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        if (Consts.getUMengChannel().equals(ChannelCodeEnum.BAIDU.getChannelCode())) {
            BotRegisterListener.registerListener(mBotIntentCallBack, mIAccountChargeMsgListener);
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();

    }

    @Override
    public void onDestroyView() {

        super.onDestroyView();
    }


    /**
     * 初始化视图
     *
     * @param view
     */
    protected abstract void initView(View view);

    protected abstract int getLayoutId();

    protected abstract void initViewListener();

    /**
     * 添加订阅
     */
    public void addDisposable(Disposable mDisposable) {
        if (mCompositeDisposable == null) {
            mCompositeDisposable = new CompositeDisposable();
        }
        mCompositeDisposable.add(mDisposable);
    }

    /**
     * 取消所有订阅
     */
    public void clearDisposable() {
        if (mCompositeDisposable != null) {
            mCompositeDisposable.clear();
        }
    }

    @Override
    public void onDestroy() {
        BotRegisterListener.removeListener(mBotIntentCallBack);
        clearDisposable();
        super.onDestroy();
    }


    public void addUiClickListener(View view, View.OnClickListener listener) {
        //isShareSingleClick为true,表示共用时间.为false表示单独计时
        SingleClickUtil.onSingleClick(view, Consts.VIEW_CLICK_TIME, true, listener);
    }

    public abstract void onGetDisconnect();

    public abstract void onGetMobileConnect();

    public abstract void onGetWifiConnect();

    NetworkChangeReceiver.NetStateChangeObserver NetStateChangeObserver = new NetworkChangeReceiver.NetStateChangeObserver() {
        @Override
        public void onDisconnect() {
            //断网了
            onGetDisconnect();
        }

        @Override
        public void onMobileConnect() {
            //有网了(移动网络)
            onGetMobileConnect();
        }

        @Override
        public void onWifiConnect() {
            //有网了(wifi)
            onGetWifiConnect();
        }
    };

    protected void refUserInfo(UserBean bean) {

    }

    //百度的回调逻辑代码块
    protected void botHandleIntent(BotIntent intent, String customData) {
    }


    protected void botOnClickLink(String url, HashMap<String, String> paramMap) {
    }

    protected void botOnHandleScreenNavigatorEvent(int event) {
    }

    protected void botOnLinkAccountSucceed(String s, String s1) {

    }

    protected void botOnChargeStatusUpdated(String purchaseResult, AmountInfo authorizationAmount,
                                            AmountInfo capturedAmount, long creationTimestamp,
                                            String baiduOrderReferenceId, String sellerOrderId, String msg) {
    }

    protected void botOnBuyStatusUpdated(@NonNull final String purchaseResult,
                                         @NonNull final String productId,
                                         @NonNull final String baiduOrderId,
                                         @NonNull final String sellerOrderId, @Nullable final String msg, String token) {
    }

    IBotIntentCallback mBotIntentCallBack = new IBotIntentCallback() {
        @Override
        public void handleIntent(BotIntent intent, String customData) {
            Logger.e("fragment---intent.name:" + intent.name);
            if (intent.name.equals("all_login")) {
                //用户主动要求登录
                Consts.setIsNeedLogin(true);
                EfunboxUtil.userLogin(EApplication.mActivityList.get(EApplication.mActivityList.size() - 1), getView());
                return;
            } else if (intent.name.equals("user_info")) {
                //获取是不是百度VIP
                Consts.setmConstsBaiDuUserBean(mGson.fromJson(customData, BaiDuUserInfo.class));
                Logger.e("json----" + mGson.toJson(Consts.getmConstsBaiDuUserBean()));
                if (Consts.getIsNeedLogin()) {
                    BotRegisterListener.BaiDuLogin();
                } else {
                    Consts.setIsNeedLogin(true);
                }
                botHandleIntent(intent, customData);
                return;
            }
            if (BotRegisterListener.isNoLoginIntent(intent)) {
                //不是获取手机号
                Logger.e("不是获取手机号--不是获取手机号:" + intent.name + "---" + intent.slots.toString());
                botHandleIntent(intent, customData);
            } else {
                Logger.e("是获取手机号--是获取手机号");
                //是获取手机号
                if (intent.slots.get(0).value.equals("SUCCESS")) {
                    //获取手机号Token成功
                    String token = intent.slots.get(1).value;
                    UserApiServerImpl userApiServer = new UserApiServerImpl();
                    Activity topActivity = EApplication.mActivityList.get(EApplication.mActivityList.size() - 1);
                    userApiServer.getBaiDuUserPhone(topActivity, token, new Callback() {
                        @Override
                        public void onSuccess(HttpInfo info) throws IOException {
                            JSONObject object = JSONObject.parseObject(info.getRetDetail().toString());
                            String phone = JSONObject.parseObject(object.getString("data")).getString("phone");
                            if (EfunboxUtil.isMobileNO(phone)) {
                                Map<String, String> map = new HashMap<>();
                                map.put("deviceCode", DeviceUuidFactory.getUuid());
                                map.put("channel", Consts.getUMengChannel());
                                map.put("mobileNo", phone);
                                map.put("nickName", EfunboxUtil.setPhoneMiddle(phone));
                                Logger.e("Consts.getmConstsBaiDuUserBean().getUserInfo().getUserId():" + Consts.getmConstsBaiDuUserBean().getUserInfo().getUserId());
                                map.put("userId", Consts.getmConstsBaiDuUserBean().getUserInfo().getUserId());
                                if (MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE).equals("") || MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE) == null) {
                                    //如果没有,默认给一年级
                                    map.put("grade", "PRIMARY_FIRST_GRADE");
                                } else {
                                    map.put("grade", MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE));
                                }

                                String json = mGson.toJson(map);
                                userApiServer.registerUserId(topActivity, json, new Callback() {
                                    @Override
                                    public void onSuccess(HttpInfo info) throws IOException {
                                        Logger.e("注册用户:" + info.getRetDetail());
                                        HttpResultBean<UserBean> bean = info.getRetDetail(new TypeToken<HttpResultBean<UserBean>>() {
                                        }.getType());
                                        Consts.setUID(bean.getData().getUid());
                                        //用户是否登录,登录了,创建Consts的userbean
                                        String nickName = EfunboxUtil.setPhoneMiddle(bean.getData().getMobile());
                                        bean.getData().setNickName(nickName);
                                        Consts.setmConstsUserBean(bean.getData());
                                        refUserInfo(Consts.getmConstsUserBean());
                                        Toast.makeText(topActivity, "登录成功", Toast.LENGTH_SHORT).show();
                                        userApiServer.loginSign(topActivity, new Callback() {
                                            @Override
                                            public void onSuccess(HttpInfo info) throws IOException {
                                                HttpResultBean<SignBean> bean = info.getRetDetail(new TypeToken<HttpResultBean<SignBean>>() {
                                                }.getType());
                                                if (bean.getData().getIsSign()) {
                                                    CusToast.getInstance(topActivity).show("恭喜签到成功\n奖励" + bean.getData().getCount() + "朵小红花", 2000);
                                                }
                                            }

                                            @Override
                                            public void onFailure(HttpInfo info) throws IOException {

                                            }
                                        });
                                    }

                                    @Override
                                    public void onFailure(HttpInfo info) throws IOException {
                                        Logger.e("手机号注册失败:" + info.getRetDetail());
//                                        CusToast.getInstance(topActivity).show("注册失败",2000);
                                        Toast.makeText(topActivity, "注册失败", Toast.LENGTH_SHORT).show();
                                    }
                                });
                            } else {
//                                CusToast.getInstance(topActivity).show("手机号不正确",2000);
                                Toast.makeText(topActivity, "手机号不正确", Toast.LENGTH_SHORT).show();
                            }
                        }

                        @Override
                        public void onFailure(HttpInfo info) throws IOException {

                        }
                    });
                } else if (intent.slots.get(0).value.equals("FAIL")) {
                    //获取手机号Token失败
                }
            }

        }

        @Override
        public void onClickLink(String url, HashMap<String, String> paramMap) {
            botOnClickLink(url, paramMap);
        }

        @Override
        public void onHandleScreenNavigatorEvent(int event) {
            botOnHandleScreenNavigatorEvent(event);
        }
    };


    IAccountChargeMsgListener mIAccountChargeMsgListener = new IAccountChargeMsgListener() {
        @Override
        public void onLinkAccountSucceed(String s, String s1) {
            botOnLinkAccountSucceed(s, s1);
        }

        @Override
        public void onChargeStatusUpdated(String purchaseResult, AmountInfo authorizationAmount,
                                          AmountInfo capturedAmount, long creationTimestamp,
                                          String baiduOrderReferenceId, String sellerOrderId, String msg) {
            botOnChargeStatusUpdated(purchaseResult, authorizationAmount, capturedAmount, creationTimestamp, baiduOrderReferenceId, sellerOrderId, msg);
        }

        @Override
        public void onBuyStatusUpdated(@NonNull final String purchaseResult,
                                       @NonNull final String productId,
                                       @NonNull final String baiduOrderId,
                                       @NonNull final String sellerOrderId, @Nullable final String msg, String token) {

            Consts.setIsNeedLogin(false);
            //处理支付回调
            Logger.e("purchaseResult:" + purchaseResult);
            Logger.e("productId:" + productId);
            Logger.e("baiduOrderId:" + baiduOrderId);
            Logger.e("sellerOrderId:" + sellerOrderId);
            Logger.e("msg:" + msg);
            Logger.e("token:" + token);
            if (purchaseResult.equals("SUCCESS")) {
                //成功
            } else if (purchaseResult.equals("ERROR")) {
                //支付失败
            }
            botOnBuyStatusUpdated(purchaseResult, productId, baiduOrderId, sellerOrderId, msg, token);

        }
    };

    @Override
    public void onResume() {
        super.onResume();
        if (Consts.getUMengChannel().equals(ChannelCodeEnum.BAIDU.getChannelCode())) {
            if (!Consts.getIsNeedLogin()) {
                BotRegisterListener.getBaiDuVipInfo();
            }
        }
    }

}