package com.megvii.idcardlib.view;

//import com.megvii.idcard.sdk.IDCard.Card;
//import com.megvii.idcard.sdk.IDCard.Faculae;
//import com.megvii.idcard.sdk.IDCard.IDCardQuality;
//import com.megvii.idcard.sdk.IDCard.PointF;
//import com.megvii.idcard.sdk.IDCard.Shadow;

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 IDCardIndicator extends View {
    private Rect mShowRect = null;
    private Rect mDrawRect = null;
    private Paint mDrawPaint = null;
    private float IDCARD_RATIO = 856.0f / 540.0f;
    private float CONTENT_RATIO = 1f;
    private float SHOW_CONTENT_RATIO = CONTENT_RATIO * 13.0f / 16.0f;
    private Rect mTmpRect = null;
    private int backColor = 0x00000000;

    private void init() {
        mShowRect = new Rect();
        mDrawRect = new Rect();
        mTmpRect = new Rect();
        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() {
                    IDCardIndicator.this.invalidate();
                }
            });
        }
    }

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

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

    public IDCardIndicator(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);
        int centerX = width >> 1;
        int centerY = height >> 1;
        int content_width = 0;
        int content_height = 0;
        if (width / (float) (height) < IDCARD_RATIO) // the view is to high
        {
            content_width = (int) (width * SHOW_CONTENT_RATIO);
            content_height = (int) (content_width / IDCARD_RATIO);
        } else { // the view is too wide
            content_height = (int) (height * SHOW_CONTENT_RATIO);
            content_width = (int) (content_height * IDCARD_RATIO);
        }

        mShowRect.left = centerX - content_width / 2;
        mShowRect.top = centerY - content_height / 2;
        mShowRect.right = centerX + content_width / 2;
        mShowRect.bottom = centerY + content_height / 2;
        getActualRect(width, height);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);

    }

    private boolean mIsVertical;
    private IDCardAttr.IDCardSide mIdCardSide;

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


    public void setContentRatio(boolean mIsVertical) {
        this.mIsVertical = mIsVertical;
        if (mIsVertical)
            CONTENT_RATIO = 1.0f;
        else
            CONTENT_RATIO = 0.8f;

        SHOW_CONTENT_RATIO = CONTENT_RATIO * 13.0f / 16.0f;
        invalidate();
    }

    /**
     * 实际给算法的大小
     */
    private void getActualRect(int width, int height) {

        int content_width = 0;
        int content_height = 0;
        int centerX = width >> 1;
        int centerY = height >> 1;

        if (width / (float) (height) < IDCARD_RATIO) // the view is to high
        {
            content_width = (int) (width * CONTENT_RATIO);
            content_height = (int) (content_width / IDCARD_RATIO);
        } else { // the view is too wide
            content_height = (int) (height * CONTENT_RATIO);
            content_width = (int) (content_height * IDCARD_RATIO);
        }

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

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

        // top
        mTmpRect.set(0, 0, getWidth(), mShowRect.top);
        canvas.drawRect(mTmpRect, mDrawPaint);
        // bottom
        mTmpRect.set(0, mShowRect.bottom, getWidth(), getHeight());
        canvas.drawRect(mTmpRect, mDrawPaint);
        // left
        mTmpRect.set(0, mShowRect.top, mShowRect.left, mShowRect.bottom);
        canvas.drawRect(mTmpRect, mDrawPaint);
        // right
        mTmpRect.set(mShowRect.right, mShowRect.top, getWidth(), mShowRect.bottom);
        canvas.drawRect(mTmpRect, mDrawPaint);

        drawViewfinder(canvas);

        drawFaculae(canvas);
        super.onDraw(canvas);
    }

//	public void setiCardQuality(IDCardQuality iCardQuality) {
//		this.iCardQuality = iCardQuality;
//		faculaeWidth = mDrawRect.width();
//		faculaeHeight = mDrawRect.height();
//
//		faculaePaint = new Paint();
//		faculaePaint.setStrokeWidth(5);
//
//		this.postInvalidate();
//
//	}

    //	private IDCardQuality iCardQuality;
    private Paint faculaePaint;
    private int faculaeWidth, faculaeHeight;

    private void drawFaculae(Canvas canvas) {
//		if (faculaePaint == null || iCardQuality == null) {
//			return;
//		}
//		Shadow[] Shadows = iCardQuality.Shadows;
//		Faculae[] faculaes = iCardQuality.faculaes;
//		Card[] cards = iCardQuality.cards;
//		faculaePaint.setColor(0xffaa0000);
//		int drawOffsetH = mDrawRect.top;
//		int drawOffsetW = mDrawRect.left;
//		if (mIsVertical) {
//			drawOffsetH = mDrawRect.top;
//			drawOffsetW = mDrawRect.left;
//		}
//
//		Log.w("ceshi", "drawOffset++++++====" + drawOffsetH + ", " + mIsVertical + ", " + mDrawRect);
//
//		for (int i = 0; i < Shadows.length; i++) {
//			PointF[] vertex = Shadows[i].vertex;
//			for (int j = 0; j < vertex.length; j++) {
//				float startx = vertex[j].x * faculaeWidth;
//				float starty = vertex[j].y * faculaeHeight;
//				float endx = vertex[(j + 1) % vertex.length].x * faculaeWidth;
//				float endy = vertex[(j + 1) % vertex.length].y * faculaeHeight;
//				canvas.drawLine(startx + drawOffsetW, starty + drawOffsetH, endx + drawOffsetW, endy + drawOffsetH, faculaePaint);
//			}
//		}
//		faculaePaint.setColor(0xff00aa00);
//		for (int i = 0; i < faculaes.length; i++) {
//			PointF[] vertex = faculaes[i].vertex;
//			for (int j = 0; j < vertex.length; j++) {
//				float startx = vertex[j].x * faculaeWidth;
//				float starty = vertex[j].y * faculaeHeight;
//				float endx = vertex[(j + 1) % vertex.length].x * faculaeWidth;
//				float endy = vertex[(j + 1) % vertex.length].y * faculaeHeight;
//				canvas.drawLine(startx + drawOffsetW, starty + drawOffsetH, endx + drawOffsetW, endy + drawOffsetH, faculaePaint);
//			}
//		}
//
//		faculaePaint.setColor(0xff0000aa);
//		for (int i = 0; i < cards.length; i++) {
//			PointF[] vertex = cards[i].vertex;
//			for (int j = 0; j < vertex.length; j++) {
//				float startx = vertex[j].x * faculaeWidth;
//				float starty = vertex[j].y * faculaeHeight;
//				float endx = vertex[(j + 1) % vertex.length].x * faculaeWidth;
//				float endy = vertex[(j + 1) % vertex.length].y * faculaeHeight;
//				canvas.drawLine(startx + drawOffsetW, starty + drawOffsetH, endx + drawOffsetW, endy + drawOffsetH, faculaePaint);
//			}
//		}
    }

    private void drawViewfinder(Canvas canvas) {
        int finderColor = 0XFF00D3FF;
        mDrawPaint.setStyle(Paint.Style.STROKE);
        mDrawPaint.setColor(finderColor);
        mDrawPaint.setStrokeWidth(4);
        int length = mShowRect.height() / 16;
        // 四个蓝色的角
        // left top
        canvas.drawLine(mShowRect.left, mShowRect.top, mShowRect.left + length, mShowRect.top, mDrawPaint);
        canvas.drawLine(mShowRect.left, mShowRect.top, mShowRect.left, mShowRect.top + length, mDrawPaint);

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

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

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

        // 两个角中间的线
        mDrawPaint.setColor(0XBBFFFFFF);
        mDrawPaint.setStrokeWidth(2);
        // top
        canvas.drawLine(mShowRect.left + length, mShowRect.top, mShowRect.right - length, mShowRect.top, mDrawPaint);
        // left
        canvas.drawLine(mShowRect.left, mShowRect.top + length, mShowRect.left, mShowRect.bottom - length, mDrawPaint);
        // right
        canvas.drawLine(mShowRect.right, mShowRect.top + length, mShowRect.right, mShowRect.bottom - length,
                mDrawPaint);
        // bottom
        canvas.drawLine(mShowRect.left + length, mShowRect.bottom, mShowRect.right - length, mShowRect.bottom,
                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(mShowRect.left, mShowRect.top, mShowRect.left + mShowRect.width(), mShowRect.top + mShowRect.height());
        canvas.drawBitmap(bitmap, mSrcRect, mDesRect, null);
    }

    public RectF getShowPosition() {
        RectF rectF = new RectF();
        rectF.left = mShowRect.left / (float) getWidth();
        rectF.top = mShowRect.top / (float) getHeight();
        rectF.right = mShowRect.right / (float) getWidth();
        rectF.bottom = mShowRect.bottom / (float) getHeight();
        return rectF;
    }

    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;
    }
}