package com.reactlibrary;

import android.Manifest;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;

import com.baidu.idl.face.platform.FaceStatusNewEnum;
import com.baidu.idl.face.platform.model.ImageInfo;
import com.baidu.idl.face.platform.ui.FaceLivenessActivity;
import com.baidu.idl.face.platform.ui.utils.IntentUtils;
import com.baidu.idl.face.platform.ui.utils.VolumeUtils;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.bridge.ActivityEventListener;
import com.reactlibrary.widget.DefaultDialog;


import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class FaceLivenessExpActivity extends FaceLivenessActivity  {

    private DefaultDialog mDefaultDialog;
    private ReactInstanceManager mReactInstanceManager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        requestPermissions(99, Manifest.permission.CAMERA);
      ExampleApplication.addDestroyActivity(FaceLivenessExpActivity.this,
        "FaceDetectExpActivity");
    }

    public void requestPermissions(int requestCode, String permission) {
        if (permission != null && permission.length() > 0) {
            try {
                if (Build.VERSION.SDK_INT >= 23) {
                    // 检查是否有权限
                    int hasPer = this.checkSelfPermission(permission);
                    if (hasPer != PackageManager.PERMISSION_GRANTED) {
                        // 是否应该显示权限请求
                        boolean isShould = this.shouldShowRequestPermissionRationale(permission);
                        this.requestPermissions(new String[]{permission}, requestCode);
                    }
                } else {

                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
//    @Override
//    public void onLivenessCompletion(FaceStatusEnum status, String message, HashMap<String, String> base64ImageMap) {
//        super.onLivenessCompletion(status, message, base64ImageMap);
//        if (status == FaceStatusEnum.OK && mIsCompletion) {
//            Intent data = new Intent();
//            data.putExtra("bestImage",base64ImageMap.get("bestImage0"));
//            data.putExtra("status",String.valueOf(status));
//            data.putExtra("message",message);
//            setResult(Config.LIVENESS_COMPLETED,data);
//            finish();
////            showMessageDialog("活体检测", "检测成功");
//        } else if (status == FaceStatusEnum.Error_DetectTimeout ||
//                status == FaceStatusEnum.Error_LivenessTimeout ||
//                status == FaceStatusEnum.Error_Timeout) {
//            showMessageDialog("活体检测", "采集超时");
//        }
//    }

  @Override
  public void onLivenessCompletion(FaceStatusNewEnum status, String message,
                                   HashMap<String, ImageInfo> base64ImageCropMap,
                                   HashMap<String, ImageInfo> base64ImageSrcMap, int currentLivenessCount) {
    super.onLivenessCompletion(status, message, base64ImageCropMap, base64ImageSrcMap, currentLivenessCount);
    if (status == FaceStatusNewEnum.OK && mIsCompletion) {
      Intent data = new Intent();
      data.putExtra("bestImage",getBestImage(base64ImageCropMap, base64ImageSrcMap));
      data.putExtra("status",String.valueOf(status));
      data.putExtra("message",message);
      setResult(Config.LIVENESS_COMPLETED,data);
      finish();
//            showMessageDialog("活体检测", "检测成功");
    } else if (status == FaceStatusNewEnum.DetectRemindCodeTimeout ||
      status == FaceStatusNewEnum.FaceLivenessActionCodeTimeout){
      showMessageDialog("活体检测", "采集超时");
    }
  }

  /**
   * 获取最优图片
   * @param imageCropMap 抠图集合
   * @param imageSrcMap  原图集合
   */
  private String getBestImage(HashMap<String, ImageInfo> imageCropMap, HashMap<String, ImageInfo> imageSrcMap) {
    String bmpStr = null;
    // 将抠图集合中的图片按照质量降序排序，最终选取质量最优的一张抠图图片
    if (imageCropMap != null && imageCropMap.size() > 0) {
      List<Map.Entry<String, ImageInfo>> list1 = new ArrayList<>(imageCropMap.entrySet());
      Collections.sort(list1, new Comparator<Map.Entry<String, ImageInfo>>() {

        @Override
        public int compare(Map.Entry<String, ImageInfo> o1,
                           Map.Entry<String, ImageInfo> o2) {
          String[] key1 = o1.getKey().split("_");
          String score1 = key1[2];
          String[] key2 = o2.getKey().split("_");
          String score2 = key2[2];
          // 降序排序
          return Float.valueOf(score2).compareTo(Float.valueOf(score1));
        }
      });

      // 获取抠图中的加密或非加密的base64
//            int secType = mFaceConfig.getSecType();
//            String base64;
//            if (secType == 0) {
//                base64 = list1.get(0).getValue().getBase64();
//            } else {
//                base64 = list1.get(0).getValue().getSecBase64();
//            }
    }

    // 将原图集合中的图片按照质量降序排序，最终选取质量最优的一张原图图片
    if (imageSrcMap != null && imageSrcMap.size() > 0) {
      List<Map.Entry<String, ImageInfo>> list2 = new ArrayList<>(imageSrcMap.entrySet());
      Collections.sort(list2, new Comparator<Map.Entry<String, ImageInfo>>() {

        @Override
        public int compare(Map.Entry<String, ImageInfo> o1,
                           Map.Entry<String, ImageInfo> o2) {
          String[] key1 = o1.getKey().split("_");
          String score1 = key1[2];
          String[] key2 = o2.getKey().split("_");
          String score2 = key2[2];
          // 降序排序
          return Float.valueOf(score2).compareTo(Float.valueOf(score1));
        }
      });
      bmpStr = list2.get(0).getValue().getBase64();

      // 获取原图中的加密或非加密的base64
//            int secType = mFaceConfig.getSecType();
//            String base64;
//            if (secType == 0) {
//                base64 = mBmpStr;
//            } else {
//                base64 = list2.get(0).getValue().getBase64();
//            }
    }
    Log.v("bmpStr",bmpStr);
    return bmpStr;
  }

    private void showMessageDialog(String title, String message) {
        if (mDefaultDialog == null) {
            DefaultDialog.Builder builder = new DefaultDialog.Builder(this);
            builder.setTitle(title).
                    setMessage(message).
                    setNegativeButton("确认",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    mDefaultDialog.dismiss();
                                    finish();
                                }
                            });
            mDefaultDialog = builder.create();
            mDefaultDialog.setCancelable(true);
        }
        mDefaultDialog.dismiss();
        mDefaultDialog.show();
    }

    @Override
    public void finish() {
        super.finish();
    }

  @Override
  protected void onDestroy() {
    VolumeUtils.unRegisterVolumeReceiver(this, mVolumeReceiver);
    super.onDestroy();
  }
}
