package com.megvii.idcardlib.util;

import android.content.Context;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.TextView;

import com.megvii.idcardlib.R;
import com.megvii.livenessdetection.Detector;
import com.megvii.livenessdetection.Detector.DetectionType;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;

/**
 * 实体验证工具类
 */
public class IDetection {

	private View rootView;
	private Context mContext;

	public View[] mAnimViews;
	private int num = 3;// 动作数量
	private HashMap<Integer, Drawable> mDrawableCache;
	public int mCurShowIndex = -1;// 现在底部展示试图的索引值
	public ArrayList<Detector.DetectionType> mDetectionSteps;// 活体检测动作列表

	public IDetection(Context mContext, View view) {
		this.mContext = mContext;
		this.rootView = view;
		mDrawableCache = new HashMap<Integer, Drawable>();
	}

	public void animationInit() {
		int[] reses = { R.drawable.liveness_head_pitch, R.drawable.liveness_head_yaw,
				R.drawable.liveness_mouth_open_closed, R.drawable.liveness_eye_open_closed };
		for (int oneRes : reses) {
			mDrawableCache.put(oneRes, (mContext.getResources().getDrawable(oneRes)));
		}
	}

	public void viewsInit() {
		mAnimViews = new View[2];
		mAnimViews[0] = (rootView.findViewById(R.id.liveness_layout_first_layout));
		mAnimViews[1] = (rootView.findViewById(R.id.liveness_layout_second_layout));
		for (View tmpView : mAnimViews) {
			tmpView.setVisibility(View.INVISIBLE);
		}
	}

	public void changeType(final Detector.DetectionType detectiontype, long timeout) {
		Animation animationIN = AnimationUtils.loadAnimation(mContext, R.anim.liveness_rightin);
		Animation animationOut = AnimationUtils.loadAnimation(mContext, R.anim.liveness_leftout);

		if (mCurShowIndex != -1) // 已经存在layout 需要移除之
		{
			mAnimViews[mCurShowIndex].setVisibility(View.INVISIBLE);
			mAnimViews[mCurShowIndex].setAnimation(animationOut);
		} else {
			mAnimViews[0].setVisibility(View.INVISIBLE);
			mAnimViews[0].startAnimation(animationOut);
		}

		mCurShowIndex = mCurShowIndex == -1 ? 0 : (mCurShowIndex == 0 ? 1 : 0);
		initAnim(detectiontype, mAnimViews[mCurShowIndex]);
		mAnimViews[mCurShowIndex].setVisibility(View.VISIBLE);
		mAnimViews[mCurShowIndex].startAnimation(animationIN);
	}

	TextView detectionNameText;
	String detectionNameStr;

	private void initAnim(Detector.DetectionType detectiontype, View layoutView) {
		ImageView tmpImageView = (ImageView) layoutView.findViewById(R.id.detection_step_image);
		tmpImageView.setImageDrawable(getDrawRes(detectiontype));

		((AnimationDrawable) tmpImageView.getDrawable()).start();
		detectionNameText = (TextView) layoutView.findViewById(R.id.detection_step_name);
		detectionNameStr = getDetectionName(detectiontype);
		detectionNameText.setText(detectionNameStr);
	}

	public void checkFaceTooLarge(boolean isLarge) {
		if (detectionNameStr != null && detectionNameText != null) {
			if (isLarge && !detectionNameText.getText().toString().equals(mContext.getString(R.string.face_too_large))) {
				detectionNameText.setText(R.string.face_too_large);
			} else if(!isLarge && detectionNameText.getText().toString().equals(mContext.getString(R.string.face_too_large))){
				detectionNameText.setText(detectionNameStr);
			}
		}
	}

	private Drawable getDrawRes(Detector.DetectionType detectionType) {
		int resID = -1;
		switch (detectionType) {
		case POS_PITCH:
		case POS_PITCH_UP:
		case POS_PITCH_DOWN:
			resID = R.drawable.liveness_head_pitch;
			break;
		case POS_YAW_LEFT:
		case POS_YAW_RIGHT:
		case POS_YAW:
			resID = R.drawable.liveness_head_yaw;
			break;
		case MOUTH:
			resID = R.drawable.liveness_mouth_open_closed;
			break;
		case BLINK:
			resID = R.drawable.liveness_eye_open_closed;
			break;
		}
		Drawable cachedDrawAble = mDrawableCache.get(resID);
		if (cachedDrawAble != null)
			return cachedDrawAble;
		else {
			Drawable drawable = mContext.getResources().getDrawable(resID);
			mDrawableCache.put(resID, (drawable));
			return drawable;
		}
	}

	private String getDetectionName(Detector.DetectionType detectionType) {
		String detectionName = null;
		switch (detectionType) {
		case POS_PITCH:
			detectionName = mContext.getString(R.string.meglive_pitch);
			break;
		case POS_YAW:
			detectionName = mContext.getString(R.string.meglive_yaw);
			break;
		case MOUTH:
			detectionName = mContext.getString(R.string.meglive_mouth_open_closed);
			break;
		case BLINK:
			detectionName = mContext.getString(R.string.meglive_eye_open_closed);
			break;
		case POS_YAW_LEFT:
			detectionName = mContext.getString(R.string.meglive_pos_yaw_left);
			break;
		case POS_YAW_RIGHT:
			detectionName = mContext.getString(R.string.meglive_pos_yaw_right);
			break;
		}
		return detectionName;
	}

	/**
	 * 初始化检测动作
	 */
	public void detectionTypeInit() {
		ArrayList<DetectionType> tmpTypes = new ArrayList<Detector.DetectionType>();
		tmpTypes.add(Detector.DetectionType.BLINK);// 眨眼
		tmpTypes.add(Detector.DetectionType.MOUTH);// 张嘴
		tmpTypes.add(Detector.DetectionType.POS_PITCH);// 缓慢点头
		tmpTypes.add(Detector.DetectionType.POS_YAW);// 左右摇头
		Collections.shuffle(tmpTypes);// 打乱顺序
		mDetectionSteps = new ArrayList<DetectionType>(num);
		for (int i = 0; i < num; i++) {
			mDetectionSteps.add(tmpTypes.get(i));
		}
	}

	public void onDestroy() {
		rootView = null;
		mContext = null;
		if (mDrawableCache != null) {
			mDrawableCache.clear();
		}
	}
}