package com.example.verificationcodejavademo.widget;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;

import com.example.verificationcodejavademo.R;
import com.example.verificationcodejavademo.model.CaptchaCheckIt;
import com.example.verificationcodejavademo.model.WordCaptchaGetIt;
import com.example.verificationcodejavademo.network.BaseObserver;
import com.example.verificationcodejavademo.network.RetrofitUtils;
import com.example.verificationcodejavademo.network.RxHelper;
import com.example.verificationcodejavademo.utils.AESUtil;
import com.example.verificationcodejavademo.utils.ImageUtil;

import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;

import okhttp3.MediaType;
import okhttp3.RequestBody;

/**
 * Date:2020/5/19
 * author:wuyan
 */
public class WordCaptchaDialog extends Dialog {
    private String baseImageBase64;//背景图片
    private String token;
    private Context mContext;
    private TextView tvDelete;
    private ImageView tvRefresh;
    private WordImageView wordView;
    private TextView bottomTitle;
    private Handler handler = new Handler();
    private String key;


    public WordCaptchaDialog(@NonNull Context context) {
        super(context, R.style.dialog);
        this.mContext = context;
        setContentView(R.layout.dialog_word_captcha);
        getWindow().setGravity(Gravity.CENTER);
        getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        WindowManager windowManager = ((Activity) mContext).getWindowManager();
        Display display = windowManager.getDefaultDisplay();
        ViewGroup.LayoutParams lp = getWindow().getAttributes();
        lp.width = display.getWidth() * 9 / 10;
        getWindow().setAttributes((WindowManager.LayoutParams) lp);
        setCanceledOnTouchOutside(false);//点击外部Dialog不消失
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        initView();
        loadCaptcha();

        tvDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });
        tvRefresh.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                loadCaptcha();
            }
        });
    }

    private void initView() {
        tvDelete = findViewById(R.id.tv_delete);
        tvRefresh = findViewById(R.id.tv_refresh);
        wordView = findViewById(R.id.wordView);
        bottomTitle = findViewById(R.id.bottomTitle);

        Bitmap bitmap = ImageUtil.getBitmap(getContext(), R.drawable.bg_default);
        wordView.setUp(bitmap);
    }

    private void loadCaptcha() {
        bottomTitle.setText("数据加载中......");
        bottomTitle.setTextColor(Color.BLACK);
        Map<String, Object> params = new HashMap<>();
        params.put("captchaType", "clickWord");
        JSONObject jsonObject = new JSONObject(params);
        RequestBody body = RequestBody.create(MediaType.parse("application/json"), jsonObject.toString());
        Log.i("wuyan", "body:" + jsonObject);
        RetrofitUtils.getServerApi().getWordCaptchaAsync(body).compose(RxHelper.observableIO2Main(mContext)).subscribe(new BaseObserver<WordCaptchaGetIt>(mContext, true) {
            @Override
            public void onSuccess(WordCaptchaGetIt data) {
                baseImageBase64 = data.getOriginalImageBase64();
                token = data.getToken();
                key = data.getSecretKey();
                String wordStr = "";
                int j = 0;
                for (int i = 0; i < data.getWordList().size(); i++) {
                    j++;
                    wordStr += data.getWordList().get(i);
                    if (j < data.getWordList().size()) {
                        wordStr += ",";
                    }
                }
                wordView.setSize(data.getWordList().size());
                bottomTitle.setText("请依此点击【" + wordStr + "】");
                bottomTitle.setTextColor(Color.BLACK);
                wordView.setUp(
                        ImageUtil.base64ToBitmap(baseImageBase64)
                );
                initEvent();
            }

            @Override
            public void onFailure(Throwable e, String errorMsg) {
                bottomTitle.setText("加载失败,请刷新");
                bottomTitle.setTextColor(Color.RED);
                wordView.setSize(-1);
                Toast.makeText(mContext, errorMsg, Toast.LENGTH_SHORT).show();
            }
        });

    }

    private void checkCaptcha(String cryptedStr) {
        Map<String, Object> params = new HashMap<>();
        params.put("captchaType", "clickWord");
        params.put("token", token);
        params.put("pointJson", AESUtil.encode(cryptedStr, key));
        JSONObject jsonObject = new JSONObject(params);
        RequestBody body = RequestBody.create(MediaType.parse("application/json"), jsonObject.toString());
        Log.i("wuyan", "body:" + jsonObject);
        RetrofitUtils.getServerApi().checkAsync(body).compose(RxHelper.observableIO2Main(mContext)).subscribe(new BaseObserver<CaptchaCheckIt>(mContext, false) {
            @Override
            public void onSuccess(CaptchaCheckIt data) {
                bottomTitle.setText("验证成功");
                bottomTitle.setTextColor(Color.GREEN);
                wordView.ok();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        loadCaptcha();
                        dismiss();
                    }
                }, 1000);
                if (mOnResultsListener!=null){
                    String result=token+"---"+cryptedStr;
                    mOnResultsListener.onResultsClick(AESUtil.encode(result,key));
                }
            }

            @Override
            public void onFailure(Throwable e, String errorMsg) {
                bottomTitle.setText("验证失败");
                bottomTitle.setTextColor(Color.RED);
                wordView.fail();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        //刷新验证码
                        loadCaptcha();
                    }
                }, 1000);
            }
        });

    }

    private void initEvent() {
        wordView.setWordListenner(new WordImageView.WordListenner() {
            @Override
            public void onWord(String cryptedStr) {
                checkCaptcha(cryptedStr);
            }
        });
    }

    private OnResultsListener mOnResultsListener;

    public interface OnResultsListener {
        void onResultsClick(String result);
    }

    public void setOnResultsListener(OnResultsListener mOnResultsListener) {
        this.mOnResultsListener = mOnResultsListener;
    }
}