
package com.reactlibrary;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.Base64;
import android.util.Log;

import com.baidu.idl.face.platform.FaceConfig;
import com.baidu.idl.face.platform.FaceEnvironment;
import com.baidu.idl.face.platform.FaceSDKManager;
import com.baidu.idl.face.platform.LivenessTypeEnum;
import com.baidu.idl.face.platform.listener.IInitCallback;
import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.PermissionListener;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

public class RNReactNativeBaiduLiveDetectModule extends ReactContextBaseJavaModule implements ActivityEventListener {

  private final ReactApplicationContext reactContext;
  private Promise mPromise;
  public RNReactNativeBaiduLiveDetectModule(ReactApplicationContext reactContext)  {
    super(reactContext);
    this.reactContext = reactContext;
    reactContext.addActivityEventListener(this);
  }

  @Override
  public String getName() {
    return "RNReactNativeBaiduLiveDetect";
  }



  @ReactMethod
  public void startVerify(Promise promise){
    setFaceConfig();
    this.mPromise=promise;
    Intent intent = new Intent(getCurrentActivity(),FaceLivenessExpActivity.class);
    getCurrentActivity().startActivityForResult(intent,Config.LIVENESS_COMPLETED);

  }
//  public List<LivenessTypeEnum> getDefaultLivingAction() {
//    List<LivenessTypeEnum> defaultLivingAction = new ArrayList<>();
//    defaultLivingAction.add(LivenessTypeEnum.Eye);
//    defaultLivingAction.add(LivenessTypeEnum.Mouth);
//    defaultLivingAction.add(LivenessTypeEnum.HeadRight);
//    defaultLivingAction.add(LivenessTypeEnum.HeadLeft);
//    defaultLivingAction.add(LivenessTypeEnum.HeadUp);
//    defaultLivingAction.add(LivenessTypeEnum.HeadDown);
////    defaultLivingAction.add(LivenessTypeEnum.);
//    return defaultLivingAction;
//  }

  private String savePicture(String base64DataStr) {
    // 1.去掉base64中的前缀
//    String base64Str = base64DataStr.substring(base64DataStr.indexOf(",") + 1, base64DataStr.length());
    // 获取手机相册的路径地址
//    String galleryPath= ImageFileUtil.getSaveFile(getReactApplicationContext()).getAbsolutePath();
    //创建文件来保存，第二个参数是文件名称，可以根据自己来命名
    File file =  ImageFileUtil.getSaveFile(getReactApplicationContext());
    String fileName = file.toString();
    // 3. 解析保存图片
    byte[] data = Base64.decode(base64DataStr, Base64.DEFAULT);

    for (int i = 0; i < data.length; i++) {
      if (data[i] < 0) {
        data[i] += 256;
      }
    }
    OutputStream os = null;
    try {
      os = new FileOutputStream(fileName);
      os.write(data);
      os.flush();
      os.close();
    } catch (Exception e) {
      e.printStackTrace();
      return "";
    } finally {
      //通知相册更新
      Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
      Uri uri = Uri.fromFile(file);
      intent.setData(uri);
      reactContext.sendBroadcast(intent);
      return fileName;
    }
  }


  private void setFaceConfig(){
    FaceSDKManager.getInstance().initialize(reactContext, Config.licenseID,Config.licenseFileName,new IInitCallback() {
      @Override
      public void initSuccess() {

      }

      @Override
      public void initFailure(final int errCode, final String errMsg) {
          Log.v("errMsg",errMsg);
      }
    });

    FaceConfig config = FaceSDKManager.getInstance().getFaceConfig();
    // SDK初始化已经设置完默认参数（推荐参数），您也根据实际需求进行数值调整
    config.setLivenessTypeList(config.getLivenessTypeList());
    config.setLivenessRandomCount(4);
    config.setLivenessRandom(true);
    // 设置可检测的最小人脸阈值
    config.setMinFaceSize(FaceEnvironment.VALUE_MIN_FACE_SIZE);
    // 设置可检测到人脸的阈值
    config.setNotFaceValue(FaceEnvironment.VALUE_NOT_FACE_THRESHOLD);
    // 设置闭眼阈值
    config.setEyeClosedValue(FaceEnvironment.VALUE_CLOSE_EYES);
    // 设置图片缓存数量
    config.setCacheImageNum(FaceEnvironment.VALUE_CACHE_IMAGE_NUM);
    config.setScale(FaceEnvironment.VALUE_SCALE);
    // 抠图宽高的设定，为了保证好的抠图效果，建议高宽比是4：3
    config.setCropHeight(FaceEnvironment.VALUE_CROP_HEIGHT);
    config.setCropWidth(FaceEnvironment.VALUE_CROP_WIDTH);
    // 抠图人脸框与背景比例
    config.setEnlargeRatio(FaceEnvironment.VALUE_CROP_ENLARGERATIO);
    // 加密类型，0：Base64加密，上传时image_sec传false；1：百度加密文件加密，上传时image_sec传true
    config.setSecType(FaceEnvironment.VALUE_SEC_TYPE);
    // 检测超时设置
    config.setTimeDetectModule(FaceEnvironment.TIME_DETECT_MODULE);
    // 检测框远近比率
    config.setFaceFarRatio(FaceEnvironment.VALUE_FAR_RATIO);
    config.setFaceClosedRatio(FaceEnvironment.VALUE_CLOSED_RATIO);

//    config.setCheckFaceQuality(true);
//    config.setFaceDecodeNumberOfThreads(2);


    FaceSDKManager.getInstance().setFaceConfig(config);
  }

  @Override
  public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
    System.out.println(requestCode);
    System.out.println(resultCode);
    if(resultCode==Config.LIVENESS_COMPLETED){
      WritableMap result = Arguments.createMap();
      String imageBase64 = data.getStringExtra("bestImage");
      String status = data.getStringExtra("status");
      String message = data.getStringExtra("message");
      String path = savePicture(imageBase64);
      result.putString("bestImage",imageBase64);
      result.putString("path",path);
      result.putString("status",status);
      result.putString("message",message);

      mPromise.resolve(result);
    }
  }

  @Override
  public void onNewIntent(Intent intent) {

  }

}
