package com.yidianling.user.modular_service

import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.text.TextUtils
import androidx.fragment.app.Fragment
import com.alibaba.android.arouter.facade.annotation.Route
import com.ydl.ydlcommon.base.BaseApp
import com.ydl.ydlcommon.bean.VersionData
import com.ydl.ydlcommon.data.http.RxUtils
import com.ydl.ydlcommon.data.http.ThrowableConsumer
import com.ydl.ydlcommon.utils.ActivityManager
import com.ydl.ydlcommon.utils.ApkUpdateDialog
import com.yidianling.common.tools.RxAppTool
import com.yidianling.user.LoginHelper
import com.yidianling.user.LoginUtils
import com.yidianling.user.UserConstants
import com.yidianling.user.UserHelper
import com.yidianling.user.api.bean.UserResponseBean
import com.yidianling.user.api.bean.UserSettingBean
import com.yidianling.user.api.listener.LoginCallBackListener
import com.yidianling.user.api.listener.SecretDataListener
import com.yidianling.user.api.listener.UserInfoFromApiListener
import com.yidianling.user.api.listener.VersionUpdateStatusListener
import com.yidianling.user.api.service.IUserService
import com.yidianling.user.http.UserHttpImpl
import com.yidianling.user.mine.MineFragment
import com.yidianling.user.mine.data.AppDataManager
import com.yidianling.user.mine.utils.UpdateUtil
import com.yidianling.user.route.UserIn
import com.yidianling.user.safePrivate.FingerPrintCheckActivity
import com.yidianling.user.safePrivate.FingerPrintUtil
import com.yidianling.user.safePrivate.HandUnlockCheckActivity
import com.yidianling.user.safePrivate.PrivacyActivity
import com.yidianling.user.ui.InputPhoneActivity
import com.yidianling.user.ui.LoginActivity
import com.yidianling.user.ui.login.OneKeyLoginHelp
import com.yidianling.user.ui.login.RegisterAndLoginActivity
import com.yidianling.user.ui.login.SecretActivity
import com.yidianling.user.widget.utils.PrivacyDialogUtils
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.functions.Consumer
import io.reactivex.schedulers.Schedulers

/**
 * author : Zhangwenchao
 * e-mail : zhangwch@yidianling.com
 * time   : 2018/04/13
 */
@Route(path = "/user/UserService")
public class UserServiceImp : IUserService {

    constructor()

    override fun init(context: Context?) {

    }

    override fun getUserSetting(): UserSettingBean? {
        return UserHelper.getUsetSetting()
    }

    override fun updateUserInfoSp(userInfo: UserResponseBean.UserInfo?) {
        UserHelper.updateUserinfo(userInfo)
    }

    override fun updateUserSetingSp(userSetting: UserSettingBean?) {
        UserHelper.updateUserSetting(userSetting)
    }

    override fun setChatTeamHisShowed(showed: Boolean) {
        UserHelper.getUsetSetting()?.chatTeamHisShowed = showed
    }

    override fun setUserResponse(userInfo: UserResponseBean?) {
        UserHelper.setUserinfo(userInfo)
    }

    override fun getUserResponse(): UserResponseBean? {
        return UserHelper.getUserInfo()
    }

    override fun isLogin(): Boolean {
        return UserHelper.isLogin()
    }

    override fun isFirstLogin(): Boolean {
        return UserHelper.getUserInfo()?.firstLogin==1
    }

    override fun setFirstLogin(first: Boolean) {
        var value : Int = if (first) 1 else 2 //1是2否
        UserHelper.getUserInfo()?.firstLogin = value
    }

    override fun isSafePrivacyClicked(): Boolean {
        return UserHelper.getUsetSetting()?.meSafePrivateIsClick?:true
    }

    override fun putSafePrivacyClicked(clicked: Boolean) {
        UserHelper.getUsetSetting()?.meSafePrivateIsClick = clicked
    }

    override fun getUserInfo(): UserResponseBean.UserInfo? {
        return UserHelper.getUserInfo()?.userInfo
    }

    @SuppressLint("CheckResult")
    override fun getUserInfoFromApi(listener: UserInfoFromApiListener) {
        AppDataManager.getHttp().getUserInfo()
            .compose(RxUtils.resultJavaData())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(Consumer {
                try {
                    listener.apiResponse(it)
                }catch (e: Exception) {
                    listener.onFailure(e.toString())
                }
            }, object : ThrowableConsumer() {
                override fun accept(msg: String) {
                    listener.onFailure(msg)
                }
            })
    }

    override fun setUserInfo(userInfo: UserResponseBean.UserInfo?) {
        UserHelper.getUserInfo()?.userInfo = userInfo
    }

    override fun isBindPhone(): Boolean {
        return !TextUtils.isEmpty(UserHelper.getUserInfo()?.userInfo?.phone)
    }

    override fun putUnlockCheckSuccessTime(time: Long) {
        UserHelper.getUsetSetting()?.unLockCheckSuccessTime = time
    }

    override fun getChatTeamHisShow(): Boolean {
        return UserHelper.getUsetSetting()?.chatTeamHisShowed?:true
    }

    override fun privacyIntent(activity: Activity): Intent {
        return Intent(activity, PrivacyActivity::class.java)
    }

    override fun loginWayIntent(context: Context): Intent {
        return RegisterAndLoginActivity.getIntent(context)
    }

    override fun inputPhoneIntent(activity: Activity, smsAction: String): Intent {
        return InputPhoneActivity.newIntent(activity, smsAction)
    }

    override fun safeTipViewGone(): Boolean {
        //如果是非登录状态 或者 app指纹开启 或者 手势密码不为空 或者 已提示过安全解锁 -> 隐藏 设置密码提示
        return !UserHelper.isLogin() || FingerPrintUtil.instance().fingerPrintIsOpen()
                || !TextUtils.isEmpty(FingerPrintUtil.instance().getHandPass())
                || FingerPrintUtil.instance().getTrendsSafeTip()
    }

    override fun setTrendsSafeTip(status: Boolean) {
        FingerPrintUtil.instance().setTrendsSafeTip(status)
    }

    override fun errorAgainTime(): Long {
        return FingerPrintUtil.errorAgainTime
    }

    override fun isFirstStart(): Boolean {
        val lastVersionCode : Int = UserHelper.getUsetSetting()?.lastVersionCode?:0
        val currentVersionCode : Int = RxAppTool.getAppVersionCode(BaseApp.getApp())
        if (lastVersionCode < currentVersionCode) {
            UserHelper.getUsetSetting()?.lastVersionCode = currentVersionCode
            return true
        }
        return false
    }

    override fun clearUserInfo() {
        UserHelper.setUserinfo(null)
        UserIn.clearImData()
    }

    override fun getMineFragment(): Fragment {
        return MineFragment()
    }

    override fun updateUI(fragment: Fragment) {
        if (fragment is MineFragment) {
            fragment.updateUI()
        }
    }

    override fun checkUpVersion(activity: Activity, listener: VersionUpdateStatusListener) {
        UpdateUtil.getInstance().setUpdateListener(activity,
            object : UpdateUtil.VersionUpdateListener {
                override fun setUpdateData(version1: VersionData) {
                    //根据获取的version判断是否需要更新
                    var isUpdate = UpdateUtil.getInstance().needUpdate(activity, version1.ver)
                    if (activity != null && isUpdate) {
                        listener.shouldUpdate()
                        AppDataManager.getLocal().putUpdate(true)
                        ApkUpdateDialog(activity).setData(version1).setCancle(false).show()

                    } else {
                        listener.notUpdate()
                        AppDataManager.getLocal().putUpdate(false)
                    }
                }

                override fun onFailed() {

                }
            })
    }

    override fun getRedPocketTime(): Long {
        return AppDataManager.getLocal().getRedPocketTime()
    }

    override fun putRedPocketTime(time: Long) {
        AppDataManager.getLocal().putRedPocketTime(time)
    }

    override fun hasUpdate(): Boolean {
        return AppDataManager.getLocal().hasUpdate()
    }

    override fun hasPrivacyDialog(): Boolean {
        return PrivacyDialogUtils.INSTANCE.privacyDialog != null
    }

    override fun initPrivacyDialog(activity: Activity, content: String, time: String) {
        PrivacyDialogUtils.INSTANCE.initPrivacy(activity, content, time)
    }

    override fun privacyDialogIsShow(): Boolean {
        return PrivacyDialogUtils.INSTANCE.privacyDialog?.isShowing?:true
    }

    override fun showPrivacyDialog() {
        PrivacyDialogUtils.INSTANCE.privacyDialog?.show()
    }

    override fun loginUtilsLogout() {
        LoginUtils.logout()
    }

    override fun setChannelId() {
        LoginHelper.setChannelId()
    }

    override fun logoutlearLocal() {
        LoginUtils.logoutClearLocal()
    }

    override fun shouldShowFingerPage(activity: Activity) {
        if(!(activity is HandUnlockCheckActivity
                || activity is FingerPrintCheckActivity
                || activity is LoginActivity)
                && FingerPrintUtil.instance().isShowActivity()) {
            //跳转解锁页面
            val intent = Intent(
                ActivityManager.getInstance().getTopTaskActivity(),
                HandUnlockCheckActivity::class.java
            )
            intent.putExtra("isFromBackground", true)
            ActivityManager.getInstance().getTopTaskActivity().startActivity(intent)
        }
    }

    override fun shouldShowFingerPageFromKill(activity: Activity, isSplashActivity: Boolean) {
        if (FingerPrintUtil.instance().appIsSetUnLockPass() && isSplashActivity) {
            //跳转解锁页面
            val intent = Intent(activity, HandUnlockCheckActivity::class.java)
            intent.putExtra("isFromBackground", true)
            activity.startActivity(intent)
        }
    }

    override fun wxBindToInputhonePage(activity: Activity) {
        InputPhoneActivity.start(activity, UserConstants.BIND_PHONE_ACTION, null, false)
    }

    override fun getSecretPageRequestOkCode(): Int {
        return SecretActivity.SECRET_PAGE_REQUEST_OK_CODE
    }

    @SuppressLint("CheckResult")
    override fun getSecretDataApi(activity: Activity, listener: SecretDataListener) {
        UserHttpImpl.Companion.getInstance().getSecretJavaData()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(Consumer {
                if (it.code == 200) {
                    SecretActivity.startProtocol(activity, it.data)
                } else {
                    listener.onOtherAction()
                }
            }, object : ThrowableConsumer() {
                override fun accept(msg: String) {
                    listener.onOtherAction()
                }
            })
    }

    override fun startFromGuide(context: Context, isBindPhone: Boolean, isFromGudile: Boolean) {
        RegisterAndLoginActivity.startFromGuide(context, isBindPhone, isFromGudile)
    }
    /**
     * 调用优先使用一键登录，并返回调用时的登录状态，
     * @param isOpenDialog true:一键登录使用弹窗展示 false:一键登录使用全屏模式
     * @return true：已登录，不触发登录跳转，false：未登录，优先一键登录
     * */
    override fun loginByOneKeyLogin(context: Context, isOpenDialog: Boolean):Boolean {
        return OneKeyLoginHelp.startLoginByStatus(context,isOpenDialog)
    }

    override fun checkOneLoginEnvAvailable(): Boolean {
        return OneKeyLoginHelp.mPhoneNumberAuthHelper!!.checkEnvAvailable()
    }

    override fun loginByOneKeyLoginCallBack(
        context: Context,
        isOpenDialog: Boolean,
        listener: LoginCallBackListener
    ) {
        OneKeyLoginHelp.startLoginByStatusLoginCallBack(context,isOpenDialog,listener)
    }
}