package com.quenice.idcard.view;

import android.annotation.TargetApi;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.graphics.Color;
import android.hardware.Camera;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.quenice.idcard.OcrRecogTask;
import com.quenice.idcard.R;
import com.quenice.idcard.ThreadManager;
import com.quenice.idcard.utils.CardScreenUtil;
import com.quenice.idcard.utils.ManageIDCardRecogResult;

import kernal.idcard.android.Frame;
import kernal.idcard.android.RecogService;
import kernal.idcard.android.ResultMessage;
import kernal.idcard.camera.CardOcrRecogConfigure;
import kernal.idcard.camera.IScanReturnMessage;
import kernal.idcard.camera.IdCardType;
import kernal.idcard.camera.OcrIdCardRecogParams;
import kernal.idcard.camera.ScanICamera;

/**
 * @author A@H
 * @describle 自定义扫描识别View实现了实时预览方法
 */
public class ScanCardsView extends RelativeLayout implements Camera.PreviewCallback, ScanICamera {
    CameraPreview mPreview;
    TextView text_idCardType, text_tips;
    Handler mHandler;
    protected  Camera mCamera;
    private boolean mSpotAble;//保持预览识别中线程单个执行
    private volatile boolean isFirstCreate = true;
    private Intent recogIntent;
    private IScanReturnMessage iScanReturnMessage;
    private int nMainIDX;
    private int nSubID;
    private RecogService.recogBinder recogBinder;
    private OcrIdCardRecogParams ocrIdCardRecogParams;
    private OcrRecogTask ocrRecogTask;
    private ViewfinderView viewfinderView;
    private Frame frame;
    private int ConfirmSideSuccess;
    private int nCropType = 1;
    private volatile boolean isTakePic = false;
    private boolean isOpendetectLightspot = false;
    private int orientation;
    public static int[] IdcardTypes;
    private String[] picPath;
    private ResultMessage resultMessage;
    String errorMessage = "";
    Toast toast;

    /**
     * 实时预览，定时获取检测边线结果值
     */
    private Handler PreViewHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (frame != null) {
                if (ConfirmSideSuccess == -139) {
                    ViewfinderView.FRAMECOLOR = Color.rgb(238, 65, 86);
                    text_tips.setText(getContext().getString(getResources().getIdentifier("please_place",
                            "string", getContext().getPackageName())) + text_idCardType.getText().toString());
                    if (nCropType == 1) {
                        viewfinderView.setFourLines(frame, null);
                    }
                    PreViewHandler.sendEmptyMessageDelayed(100, 1500);
                } else if (ConfirmSideSuccess == -145) {
                    ViewfinderView.FRAMECOLOR = Color.rgb(238, 65, 86);
                    if (nCropType == 1) {
                        viewfinderView.setFourLines(frame, null);
                    }
                    text_tips.setText(getContext().getString(getResources().getIdentifier("too_far_away",
                            "string", getContext().getPackageName())) + text_idCardType.getText().toString());
                    PreViewHandler.sendEmptyMessageDelayed(100, 1500);
                } else {
                    text_tips.setText(null);
                    ViewfinderView.FRAMECOLOR = Color.rgb(77, 223, 68);
                    if (nCropType == 1) {
                        viewfinderView.setFourLines(frame, null);
                    }
                    PreViewHandler.sendEmptyMessageDelayed(100, 1500);
                }

            }

        }
    };
    /**
     * 光斑检测提示
     */
    private Handler spotDectionHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(toast==null){

                toast= Toast.makeText(getContext(),
                        getContext().getString(R.string.detectLightspot),
                        Toast.LENGTH_SHORT);
            }else{
                toast.setText(getContext().getString(R.string.detectLightspot));

            }
            toast.show();

        }
    };
    /**
     * 识别成功更新UI
     */
    private Handler recogSucessHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            ViewfinderView.FRAMECOLOR = Color.rgb(77, 223, 68);
            viewfinderView.setFourLines(frame, null);
            text_tips.setText("");
            isTakePic = false;
            iScanReturnMessage.scanOCRIdCardSuccess(resultMessage, picPath);
        }
    };

    private Handler recogErrorHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 0:
                    iScanReturnMessage.scanOCRIdCardError(errorMessage);
                    break;
                case 1:
                    ViewfinderView.FRAMECOLOR = Color.rgb(238, 65, 86);
                    text_tips.setText(getContext().getString(getResources().getIdentifier("please_place",
                            "string", getContext().getPackageName())) + text_idCardType.getText().toString());
                    if (nCropType == 1) {
                        viewfinderView.setFourLines(frame, null);
                    }
                    if(mCamera!=null&&mSpotAble){
                        mCamera.setOneShotPreviewCallback(ScanCardsView.this);
                    }
                    break;

            }


        }
    };

    public ScanCardsView(Context context) {
        this(context, null);
    }

    public ScanCardsView(Context context, AttributeSet attributeSet) {
        this(context, attributeSet, 0);
    }

    public ScanCardsView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mHandler = new Handler();
        initOcr();
        initView(context, attrs);
    }

    /**
     * 初始化布局
     *
     * @param context
     * @param attrs
     */
    @TargetApi(16)
    private void initView(Context context, AttributeSet attrs) {

        mPreview = new CameraPreview(getContext());
        mPreview.setId(R.id.cards_camera_preview);
        orientation = CardScreenUtil.getScreenOrientation(context);

        //证件类型
        LayoutParams textLayoutParams = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        textLayoutParams.addRule(CENTER_VERTICAL);
        text_idCardType = new TextView(getContext());
        text_idCardType.setText(IdCardType.getIdName(getContext(), nMainIDX, nSubID));
        text_idCardType.setGravity(Gravity.CENTER);
        text_idCardType.setTextColor(Color.RED);
        text_idCardType.setTextSize(18);
        //错误提示
        text_tips = new TextView(getContext());
        LayoutParams texttipLayoutParams = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        texttipLayoutParams.addRule(ALIGN_PARENT_BOTTOM);
        texttipLayoutParams.bottomMargin = CardScreenUtil.dp2px(getContext(), 80);
        text_tips.setTextSize(14);
        text_tips.setTextColor(Color.RED);
        text_tips.setGravity(Gravity.CENTER);
        //扫描框
        if (nMainIDX != 3000) {
            viewfinderView = new ViewfinderView(getContext(), nCropType, 0);
        } else {
            viewfinderView = new ViewfinderView(getContext(), nCropType, 1);
        }
        viewfinderView.setIdcardType(nMainIDX);
        LayoutParams viewfindParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        //viewfindParams.addRule(RelativeLayout.ALIGN_TOP, mPreview.getId());
       // viewfindParams.addRule(RelativeLayout.ALIGN_BOTTOM, mPreview.getId());
        this.addView(mPreview);
        this.addView(text_idCardType, textLayoutParams);
        this.addView(viewfinderView, viewfindParams);
        this.addView(text_tips, texttipLayoutParams);


    }


    /**
     * 初始化识别
     */
    private void initOcr() {
        initRecogService();
      /*  if (IdcardTypes != null && IdcardTypes.length > 1) {
            RecogService.listLoadXMLIdCardType.clear();
            for (int i = 0; i < IdcardTypes.length; i++) {
                if (IdcardTypes[i] == 2 || IdcardTypes[i] == 3) {
                    RecogService.listLoadXMLIdCardType.add(2);
                    RecogService.listLoadXMLIdCardType.add(3);
                } else {
                    RecogService.listLoadXMLIdCardType.add(IdcardTypes[i]);
                }
            }
        }*/
        recogIntent = new Intent(getContext(), RecogService.class);
        getContext().bindService(recogIntent, recogConn, Service.BIND_AUTO_CREATE);
    }

    /**
     * 识别服务静态数值赋值
     */
    private void initRecogService() {
        nMainIDX = CardOcrRecogConfigure.getInstance().nMainId;
        nSubID = CardOcrRecogConfigure.getInstance().nSubID;
        nCropType = CardOcrRecogConfigure.getInstance().nCropType;
        RecogService.isOnlyReadSDAuthmodeLSC = false;
        if (nMainIDX == 3000) {
            RecogService.nMainID = 1034;
        } else {
            RecogService.nMainID = nMainIDX;
        }
        RecogService.isRecogByPath = false;
    }

    /**
     * 实时预览，对每一帧数据进行处理
     * @param data
     * @param camera
     */
    @Override
    public void onPreviewFrame(final byte[] data, Camera camera) {
        if (mSpotAble) {
            if (isFirstCreate) {
         //WriteUtil.writeLog("预览图和屏幕分辨率的比率为:"+mPreview.getScale());
                ocrIdCardRecogParams = new OcrIdCardRecogParams.Build()
                        //设置预览的宽度
                        .setPreWidth(mPreview.getPreViewSize().x)
                        //设置预览的高度
                        .setPreHeight(mPreview.getPreViewSize().y)
                        //
                        .setScanICamera(ScanCardsView.this)
                        //设置识别服务
                        .setRecogBinder(recogBinder)
                        //设置屏幕大小与预览大小的比
                        .setscale((1 / mPreview.getScale()))
                        //设置图片的方向
                        .setPicOrientation(CardScreenUtil.getPicOrientation(getContext()))
                        .create();
                ocrRecogTask = new OcrRecogTask(getContext(), ocrIdCardRecogParams);
                //设置扫描识别的敏感区域
                ocrRecogTask.setNv21Point(getNV21Point());
            }
            // 传递识别数据，设置是否是拍照
            ocrRecogTask.setData(data).setTakePic(isTakePic);
            ThreadManager.getThreadPool().execute(ocrRecogTask);
        }
    }

    @Override
    public void setIScan(IScanReturnMessage iScanReturnMessage) {
        this.iScanReturnMessage = iScanReturnMessage;
    }

    /**
     * 关闭摄像头
     */
    @Override
    public void stopCamera() {
        try {
            PreViewHandler.removeCallbacksAndMessages(null);
            spotDectionHandler.removeCallbacksAndMessages(null);
            recogSucessHandler.removeCallbacksAndMessages(null);
            recogErrorHandler.removeCallbacksAndMessages(null);
            if(toast!=null){
                toast.cancel();
            }
            if (mCamera != null) {
                mSpotAble = false;
                mPreview.stopCameraPreview();
                mPreview.setCamera(null, null);
                mCamera.release();
                mCamera = null;
            }
        } catch (Exception e) {


        }
    }

    /**
     * 管理光斑检测
     * @param isOpendetectLightspot
     */
    public void managerSpotDection(boolean isOpendetectLightspot) {
        this.isOpendetectLightspot = isOpendetectLightspot;
        if(ocrRecogTask!=null){
            ocrRecogTask.setOpendetectLightspot(isOpendetectLightspot);
        }

    }

    /**
     * 管理闪光灯
     *
     * @param
     */
    @Override
    public void managerFlashLight(boolean isOpenFlash) {
        if (isOpenFlash) {
            mPreview.openFlashlight();
        } else {
            mPreview.closeFlashlight();
        }
    }

    /**
     * 开启后置相机
     */
    @Override
    public void startCamera() {
        startCameraById(Camera.CameraInfo.CAMERA_FACING_BACK);
    }

    /**
     * 开启指定相机
     *
     * @param var
     */
    @Override
    public void startCameraById(int var) {
        if (mCamera != null) {
            return;
        }
        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
        for (int cameraId = 0; cameraId < Camera.getNumberOfCameras(); cameraId++) {
            Camera.getCameraInfo(cameraId, cameraInfo);
            if (cameraInfo.facing == var) {
                try {
                    mCamera = Camera.open(var);
                    mPreview.setCamera(mCamera, this);
                    starOcr();
                } catch (Exception e) {
                    iScanReturnMessage.openCameraError(e.toString());
                }
                break;
            }
        }
    }

    /**
     * 切换证件类型
     */
    public void switchIDCardType(int nMainIDX, int nSubID) {
        CardOcrRecogConfigure.getInstance().setnMainId(nMainIDX).setnSubID(nSubID);
        initRecogService();
        viewfinderView.setIdcardType(nMainIDX);
        viewfinderView.setFourLines(new Frame(), "");
        text_idCardType.setText(IdCardType.getIdName(getContext(), nMainIDX, nSubID));

    }

    /**
     * 开启预览识别
     */
    private void starOcr() {
        mSpotAble = true;
        mHandler.removeCallbacks(mOneShotPreviewCallbackTask);
        mHandler.post(mOneShotPreviewCallbackTask);
        PreViewHandler.removeCallbacks(mPreViewUpdateUiTask);
        PreViewHandler.post(mPreViewUpdateUiTask);
    }


    public ServiceConnection recogConn = new ServiceConnection() {
        @Override
        public void onServiceDisconnected(ComponentName name) {
            recogBinder = null;
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            recogBinder = (RecogService.recogBinder) service;
            if (recogBinder != null) {
                if (recogBinder.getReturnAuthority() != 0) {
                    iScanReturnMessage.authOCRIdCardError("授权失败" + recogBinder.getReturnAuthority());
                }
            }
        }
    };



    /**
     * 根据屏幕上预览框的坐标点计算出图片上的坐标点
     *
     * @return
     */
    int[] getNV21Point() {
        int[] NV21Point = new int[4];
         float scale=mPreview.getScale();

        if (CardScreenUtil.ORIENTATION_PORTRAIT == CardScreenUtil.getScreenOrientation(getContext()) && !ViewfinderView.isSameScreen) {
            NV21Point[0] = (int) (viewfinderView.getFrame().top * scale);
            NV21Point[1] = (int) (viewfinderView.getFrame().left * scale);
            NV21Point[2] = (int) (viewfinderView.getFrame().bottom * scale);
            NV21Point[3] = (int) (viewfinderView.getFrame().right * scale);
        } else {
            NV21Point[0] = (int) (viewfinderView.getFrame().left *  scale);
            NV21Point[1] = (int) (viewfinderView.getFrame().top *   scale);
            NV21Point[2] = (int) (viewfinderView.getFrame().right * scale);
            NV21Point[3] = (int) (viewfinderView.getFrame().bottom *scale);
        }
        return NV21Point;
    }

    /**
     * 实现循环回调
     */
    @Override
    public void addPreviewCallBack() {
        isFirstCreate = false;
        if (mCamera != null && mSpotAble) {
            try {
                mCamera.setOneShotPreviewCallback(ScanCardsView.this);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 取消识别任务，解绑识别服务
     */
    @Override
    public void destroyService() {
        ThreadManager.getThreadPool().cancel(ocrRecogTask);
        IdcardTypes = null;
        if (recogBinder != null) {
            getContext().unbindService(recogConn);
            recogBinder = null;
        }
    }

    /**
     * 实时更新界面
     *
     * @param frame
     * @param ConfirmSideSuccess
     */
    @Override
    public void UpdateFrame(Frame frame, int ConfirmSideSuccess,int detectLightspot) {
        this.frame = frame;
        this.ConfirmSideSuccess = ConfirmSideSuccess;
        if (isOpendetectLightspot&&ConfirmSideSuccess>=0&&detectLightspot==0) {
            spotDectionHandler.sendEmptyMessage(0);
        }
        if (nCropType == 1) {
            viewfinderView.setFourLines(frame, null);
        }
    }

    /**
     * 证件识别成功
     *
     * @param resultMessage
     * @param picPath
     */
    @Override
    public void recogSucessUpdateUi(ResultMessage resultMessage, String[] picPath) {
        this.resultMessage=resultMessage;
        this.picPath = picPath;
        PreViewHandler.removeCallbacksAndMessages(null);
        spotDectionHandler.removeCallbacksAndMessages(null);
        isTakePic = false;
        recogSucessHandler.sendEmptyMessage(0);

    }

    /**
     * 证件识别失败
     *
     * @param resultMessage
     */
    @Override
    public void recogErrorUpdateUi(ResultMessage resultMessage) {

        if (isTakePic) {
            isTakePic = false;
            PreViewHandler.removeCallbacksAndMessages(null);
            errorMessage = ManageIDCardRecogResult.managerErrorRecogResult(getContext(), resultMessage);
            recogErrorHandler.sendEmptyMessage(0);

        } else {
            if(resultMessage.ReturnRecogIDCard!=-6){
                PreViewHandler.removeCallbacksAndMessages(null);
                errorMessage = ManageIDCardRecogResult.managerErrorRecogResult(getContext(), resultMessage);
                recogErrorHandler.sendEmptyMessage(0);
                return;
            }
            recogErrorHandler.sendEmptyMessage(1);

        }
    }

    /**
     * 拍照识别
     */
    @Override
    public void takePicRecog() {
        isTakePic = true;
    }

    @Override
    public void importPicRecog(String picPath) {
        OcrRecogTask.importPicPath= picPath;
        isTakePic = true;
        RecogService.isRecogByPath = true;
        ConfirmSideSuccess = -1;
     /*   viewfinderView.setFourLines(new Frame(), null);
        text_tips.setText("");*/
    }

    /**
     * 循环监听扫描检测边线返回值
     */
    private Runnable mPreViewUpdateUiTask = new Runnable() {
        @Override
        public void run() {
            PreViewHandler.sendEmptyMessageDelayed(100, 1000);
        }
    };
    /**
     * 设置预览回调
     */
    private Runnable mOneShotPreviewCallbackTask = new Runnable() {
        @Override
        public void run() {
            if (mCamera != null && mSpotAble) {
                try {
                    mCamera.setOneShotPreviewCallback(ScanCardsView.this);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    };


    @Override
    public void stopPreview() {
        if (mCamera != null) {
            mCamera.stopPreview();
        }
    }
}
