package com.yidianling.user.ui;

import android.Manifest;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.SparseArray;
import android.util.TypedValue;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.alibaba.android.arouter.facade.annotation.Route;
import com.mobile.auth.gatewayauth.AuthRegisterViewConfig;
import com.mobile.auth.gatewayauth.AuthUIConfig;
import com.mobile.auth.gatewayauth.CustomInterface;
import com.mobile.auth.gatewayauth.PhoneNumberAuthHelper;
import com.mobile.auth.gatewayauth.PreLoginResultListener;
import com.mobile.auth.gatewayauth.TokenResultListener;
import com.mobile.auth.gatewayauth.model.InitResult;
import com.yidianling.user.R;

@Route(path = "/user/aliAuthDemo")
public class AliAuthDemoActivity extends Activity {
    private PhoneNumberAuthHelper mAlicomAuthHelper;
    private TokenResultListener mTokenListener;
    private Button mVaildBtn, mLoginBtn;
    private TextView mRetTV;
    private InitResult mAutCheckResult;
    private SparseArray<PermissionCallback> mPerMissionCallbackCache;
    private int mCurrentPermissionRequestCode = 0;
    private ProgressDialog mProgressDialog;
    private String token;
    private TextView mDynamicView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.user_activity_ali_auth_demo);
        mVaildBtn = (Button) findViewById(R.id.vaild_button);
        mLoginBtn = (Button) findViewById(R.id.login_button);
        mRetTV = (TextView) findViewById(R.id.operator_name_tv);
        init();
    }

    private void initDynamicView() {
        mDynamicView = new TextView(getApplicationContext());
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
        layoutParams.setMargins(0, dp2px(this, 450), 0, 0);
        mDynamicView.setText("-----  自定义view  -----");
        mDynamicView.setTextColor(0xff999999);
        mDynamicView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 13.0F);
        mDynamicView.setLayoutParams(layoutParams);
    }

    public static int dp2px(Context context, float dipValue) {
        try {
            final float scale = context.getResources().getDisplayMetrics().density;
            return (int) (dipValue * scale + 0.5f);
        } catch (Exception e) {
            return (int) dipValue;
        }
    }

    private void init() {
        /*
         *   1.init get token callback Listener
         */
        mTokenListener = new TokenResultListener() {
            @Override
            public void onTokenSuccess(final String ret) {
                mDynamicView = null;
                AliAuthDemoActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        /*
                         *   setText just show the result for get token。
                         *   use ret to verfiy number。
                         */
                        hideLoadingDialog();
                        token = ret;
                        mRetTV.setText("成功:\n" + ret);
                        mAlicomAuthHelper.quitAuthActivity();
                    }
                });
            }

            @Override
            public void onTokenFailed(final String ret) {
                mDynamicView = null;
                AliAuthDemoActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        /*
                         *  setText just show the result for get token
                         *  do something when getToken failed, such as use sms verify code.
                         */
                        hideLoadingDialog();
                        mRetTV.setText("失败:\n" + ret);
                        mAlicomAuthHelper.quitAuthActivity();
                    }
                });
            }
        };

        /*
         *   2.init AlicomAuthHelper with tokenListener
         */
        mAlicomAuthHelper = PhoneNumberAuthHelper.getInstance(this, mTokenListener);

        /*
         *   3.set debugMode when app is in debug mode, sdk will print log in debug mode
         */
//        if (isApkInDebug(this)) {
        mAlicomAuthHelper.setDebugMode(true);
//        }

        /*
         *   4.ask permission from user, this step is not necessary
         *   just do when your app is needed
         */
        if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            requestPermission(new String[]{Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, new PermissionCallback() {
                @Override
                public void onPermissionGranted(boolean isRequestUser) {
                    /*
                     *   5.sdk init
                     */
                    mAutCheckResult = mAlicomAuthHelper.checkAuthEnvEnable();
                }

                @Override
                public void onPermissionDenied(boolean isRequestUser) {
                    Toast.makeText(AliAuthDemoActivity.this, "请允许相关权限", Toast.LENGTH_LONG).show();
                }
            });
        } else {
            /*
             *   5.sdk init
             */
            mAutCheckResult = mAlicomAuthHelper.checkAuthEnvEnable();
        }

        mVaildBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showLoadingDialog("正在请求认证token");
                mAlicomAuthHelper.getAuthToken(5000);
            }
        });

        mLoginBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                initDynamicView();
                mAlicomAuthHelper.addAuthRegistViewConfig("my_tv", new AuthRegisterViewConfig.Builder()
                        .setView(mDynamicView)
                        .setRootViewId(AuthRegisterViewConfig.RootViewId.ROOT_VIEW_ID_BODY)
                        .setCustomInterface(new CustomInterface() {
                            @Override
                            public void onClick(Context context) {
                                Toast.makeText(context, "点击自定义控件", Toast.LENGTH_LONG).show();
                            }
                        }).build());
                showLoadingDialog("正在请求登录Token");
                mAlicomAuthHelper.getLoginToken(5000);
            }
        });

        /*
         *   7.user sdk init result to do someting
         *   this step is also not necessary
         *   if you do this step, user experience maybe better
         */
        if (mAutCheckResult != null) {
            //judge the phone condition can use 4g auth
            if (!mAutCheckResult.isCan4GAuth()) {
                mVaildBtn.setClickable(false);
                mRetTV.setText("请开启移动网络后重试!");
            }
        }

        /*
         *   8.config authorization page ui to adapte app ui theme
         */
        mAlicomAuthHelper.setAuthUIConfig(new AuthUIConfig.Builder()
                .setAppPrivacyOne("自定义协议", "https://www.aliyun.com/product/dypns")
                .setLogoImgPath("ic_launcher")
                .setPrivacyState(true)
                .setCheckboxHidden(true)
                .create());

        mAlicomAuthHelper.preLogin(5, new PreLoginResultListener() {
            @Override
            public void onTokenSuccess(final String s) {
                AliAuthDemoActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        /*
                         *  推荐在登录页初始化的时候调用
                         *  如果没有合适的调用时机
                         *  不调用此接口也没关系
                         *  千万不要APP冷启动初始化就调用!!!!
                         *  最好判断用户是否登录,若已登录不要使用此接口!!!!
                         */
                        mRetTV.setText("预取号成功:" + s);
                    }
                });
            }

            @Override
            public void onTokenFailed(final String s, final String s1) {
                /*
                 *  预取号调用失败
                 *  不用太关注,还是可以直接在用户点击"登录"时,调用getLoginToken
                 */
                mRetTV.setText("预取号失败:" + s + s1);
            }
        });

    }

    @Override
    protected void onDestroy() {
        /*
         *   8.remember on destory
         */
        mAlicomAuthHelper.onDestroy();
        super.onDestroy();
    }

    /*
     *  Dynamic request application permissions
     */
    protected void requestPermission(String[] permissions, PermissionCallback callback) {
        int result = PackageManager.PERMISSION_GRANTED;
        for (String s : permissions) {
            if (ContextCompat.checkSelfPermission(this, s) != PackageManager.PERMISSION_GRANTED)
                result = PackageManager.PERMISSION_DENIED;
        }

        if (result == PackageManager.PERMISSION_GRANTED && callback != null) {
            callback.onPermissionGranted(false);
        } else {
            if (Build.VERSION.SDK_INT >= 23) {
                if (mPerMissionCallbackCache == null)
                    mPerMissionCallbackCache = new SparseArray<PermissionCallback>();
                mPerMissionCallbackCache.put(mCurrentPermissionRequestCode, callback);
                requestPermissions(permissions, mCurrentPermissionRequestCode++);
            } else if (callback != null) {
                callback.onPermissionDenied(false);
            }
        }
    }

    public interface PermissionCallback {
        void onPermissionGranted(boolean isRequestUser);

        void onPermissionDenied(boolean isRequestUser);
    }

    public boolean isApkInDebug(Context context) {
        try {
            ApplicationInfo info = context.getApplicationInfo();
            return (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
        } catch (Exception e) {
            return false;
        }
    }

    public void showLoadingDialog(String hint) {
        if (mProgressDialog == null) {
            mProgressDialog = new ProgressDialog(this);
            mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        }
        mProgressDialog.setMessage(hint);
        mProgressDialog.setCancelable(true);
        mProgressDialog.show();
    }

    public void hideLoadingDialog() {
        if (mProgressDialog != null)
            if (mProgressDialog.isShowing()) {
                mProgressDialog.dismiss();
            }
    }


}