package com.megvii.idcardlib.view;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;

import com.megvii.idcardlib.R;
import com.megvii.idcardquality.bean.IDCardAttr;

/**
 * Created by binghezhouke on 15-8-12.
 */
public class IDCardNewIndicator extends View {
	private Rect mShowDrawRect = null;
	private Rect mDrawRect = null;
	private Paint mDrawPaint = null;
	private Paint mDrawRightPaint = null;
	private float IDCARD_RATIO = 856.0f / 540.0f;
	private float CONTENT_RATIO = 0.8f;
	private float SHOW_CONTENT_RATIO = CONTENT_RATIO * 13.0f / 16.0f;

	private float RIGHT_RATIO = 0.2f;
	private RectF rightRectf = null;
	private Rect mTmpRect = null;
	private Rect mTmpRect_test = null;
	private Bitmap rightBitmap;
	private String rightText;
	private int right_width = 0;
	private int right_height = 0;
	private int backColor = 0x00000000;

	private void init() {
		rightRectf = new RectF();
		mShowDrawRect = new Rect();
		mDrawRect = new Rect();
		mTmpRect = new Rect();
		mTmpRect_test = new Rect();
		mDrawRightPaint = new Paint();
		mDrawRightPaint.setColor(0XFFFFFFFF);
		mDrawPaint = new Paint();
		mDrawPaint.setDither(true);
		mDrawPaint.setAntiAlias(true);
		mDrawPaint.setStrokeWidth(10);
		mDrawPaint.setStyle(Paint.Style.STROKE);
		mDrawPaint.setColor(0xff0000ff);
	}

	public void setBackColor(Activity activity, int backColor) {
		if (this.backColor != backColor) {
			this.backColor = backColor;
			activity.runOnUiThread(new Runnable() {
				@Override
				public void run() {
					IDCardNewIndicator.this.invalidate();
				}
			});
		}
	}

	public void setRightImage(boolean isFront) {
		if (isFront) {
			rightText = "请将身份证正";
			rightBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sfz_front);
		} else {
			rightText = "请将身份证背";
			rightBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sfz_back);
		}
	}

	public IDCardNewIndicator(Context context) {
		super(context);
		init();
	}

	public IDCardNewIndicator(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	public IDCardNewIndicator(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);
		init();
	}

	// 只考虑横屏
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		int width = MeasureSpec.getSize(widthMeasureSpec);
		int height = MeasureSpec.getSize(heightMeasureSpec);

		right_width = (int) (width * RIGHT_RATIO);
		right_height = (int) (right_width / IDCARD_RATIO);

		// 实际身份证位置的中心点
		int centerY = height >> 1;
		int centerX = width >> 1;

		int content_width = (int) ((width - right_width) * CONTENT_RATIO);
		int content_height = (int) (content_width / IDCARD_RATIO);

		mDrawRect.left = centerX - content_width / 2;
		mDrawRect.top = centerY - content_height / 2;
		mDrawRect.right = content_width + mDrawRect.left;
		mDrawRect.bottom = content_height + mDrawRect.top;

		int content_show_width = (int) ((width - right_width) * SHOW_CONTENT_RATIO);
		int content_show_height = (int) (content_show_width / IDCARD_RATIO);

		mShowDrawRect.left = (int)(centerX - content_show_width / 2.0f);
		mShowDrawRect.top = centerY - content_show_height / 2;
		mShowDrawRect.right = content_show_width + mShowDrawRect.left;
		mShowDrawRect.bottom = content_show_height + mShowDrawRect.top;

		rightRectf.top = mShowDrawRect.top;
		rightRectf.left = mDrawRect.right;
		rightRectf.right = width - 20;
		rightRectf.bottom = rightRectf.width() / IDCARD_RATIO + rightRectf.top;
	}

	@Override
	protected void onDraw(Canvas canvas) {
		// background
		mDrawPaint.setStyle(Paint.Style.FILL);
		mDrawPaint.setColor(backColor);

		drawViewfinder(canvas);
		//onDrawRight(canvas);
	}

	private boolean mIsVertical;
	private IDCardAttr.IDCardSide mIdCardSide;

	public void setCardSideAndOrientation(boolean mIsVertical, IDCardAttr.IDCardSide mIDCardSide) {
		this.mIsVertical = mIsVertical;
		this.mIdCardSide = mIDCardSide;
	}

	private void drawViewfinder(Canvas canvas) {
		// top
		mTmpRect.set(0, 0, getWidth(), mShowDrawRect.top);
		canvas.drawRect(mTmpRect, mDrawPaint);
		// bottom
		mTmpRect.set(0, mShowDrawRect.bottom, getWidth(), getHeight());
		canvas.drawRect(mTmpRect, mDrawPaint);
		// left
		mTmpRect.set(0, mShowDrawRect.top, mShowDrawRect.left, mShowDrawRect.bottom);
		canvas.drawRect(mTmpRect, mDrawPaint);
		// right
		mTmpRect.set(mShowDrawRect.right, mShowDrawRect.top, getWidth(), mShowDrawRect.bottom);
		canvas.drawRect(mTmpRect, mDrawPaint);

		// rect
		mDrawPaint.setStyle(Paint.Style.STROKE);
		mDrawPaint.setColor(0xff5fc0d2);
		mDrawPaint.setStrokeWidth(5);
		int length = mShowDrawRect.height() / 16;
		// left top
		canvas.drawLine(mShowDrawRect.left, mShowDrawRect.top, mShowDrawRect.left + length, mShowDrawRect.top,
				mDrawPaint);
		canvas.drawLine(mShowDrawRect.left, mShowDrawRect.top, mShowDrawRect.left, mShowDrawRect.top + length,
				mDrawPaint);

		// right top
		canvas.drawLine(mShowDrawRect.right, mShowDrawRect.top, mShowDrawRect.right - length, mShowDrawRect.top,
				mDrawPaint);
		canvas.drawLine(mShowDrawRect.right, mShowDrawRect.top, mShowDrawRect.right, mShowDrawRect.top + length,
				mDrawPaint);

		// left bottom
		canvas.drawLine(mShowDrawRect.left, mShowDrawRect.bottom, mShowDrawRect.left + length, mShowDrawRect.bottom,
				mDrawPaint);
		canvas.drawLine(mShowDrawRect.left, mShowDrawRect.bottom, mShowDrawRect.left, mShowDrawRect.bottom - length,
				mDrawPaint);

		// right bottom
		canvas.drawLine(mShowDrawRect.right, mShowDrawRect.bottom, mShowDrawRect.right - length, mShowDrawRect.bottom,
				mDrawPaint);
		canvas.drawLine(mShowDrawRect.right, mShowDrawRect.bottom, mShowDrawRect.right, mShowDrawRect.bottom - length,
				mDrawPaint);

		int bitmapId = 0;
		if (mIdCardSide == IDCardAttr.IDCardSide.IDCARD_SIDE_FRONT)
			bitmapId = R.drawable.sfz_front;
		else if (mIdCardSide == IDCardAttr.IDCardSide.IDCARD_SIDE_BACK)
			bitmapId = R.drawable.sfz_back;
		Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(), bitmapId);
		Rect mSrcRect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
		Rect mDesRect = new Rect(mShowDrawRect.left, mShowDrawRect.top, mShowDrawRect.left + mShowDrawRect.width(), mShowDrawRect.top + mShowDrawRect.height());
		canvas.drawBitmap(bitmap, mSrcRect, mDesRect, null);
	}
	
	private void onDrawRight(Canvas canvas) {
		canvas.drawBitmap(rightBitmap, null, rightRectf, null);
		int textSize = right_width / 6;
		mDrawRightPaint.setTextSize(textSize * 4 / 5);
		canvas.drawText(rightText + "面", rightRectf.left, rightRectf.bottom + textSize, mDrawRightPaint);
		canvas.drawText("置于框内", rightRectf.left, rightRectf.bottom + textSize * 2, mDrawRightPaint);
	}

	public RectF getPosition() {
		RectF rectF = new RectF();
		rectF.left = mDrawRect.left / (float) getWidth();
		rectF.top = mDrawRect.top / (float) getHeight();
		rectF.right = mDrawRect.right / (float) getWidth();
		rectF.bottom = mDrawRect.bottom / (float) getHeight();
		return rectF;
	}
	public Rect getMargin() {
		Rect rect = new Rect();
		rect.left = mDrawRect.left;
		rect.top = mDrawRect.top;
		rect.right = getWidth() - mDrawRect.right;
		rect.bottom = getHeight() - mDrawRect.bottom;
		return rect;
	}
}