package com.quenice.idcard.view;

import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Point;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import com.quenice.idcard.utils.CameraConfigurationManager;
import com.quenice.idcard.utils.CardScreenUtil;

/**
 * @author A@H
 * @describle 自定义预览View,主要是相机预览的开启与关闭，对焦方式以及闪光灯
 */
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    private static final String TAG = CameraPreview.class.getSimpleName();
    private Camera mCamera;
    private boolean mPreviewing = true;
    private boolean mSurfaceCreated = false;
    private Camera.PreviewCallback mpreviewCallback;
    private CameraConfigurationManager mCameraConfigurationManager;

    public CameraPreview(Context context) {
        super(context);
    }

    public void setCamera(Camera camera, Camera.PreviewCallback previewCallback) {
        mCamera = camera;
        mpreviewCallback=previewCallback;
        if (mCamera != null) {
            mCameraConfigurationManager = new CameraConfigurationManager(getContext());
            mCameraConfigurationManager.initFromCameraParameters(mCamera);
            getHolder().addCallback(this);
            if (mPreviewing) {
                   requestLayout();
            } else {
                  showCameraPreview();
          }
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        mSurfaceCreated = true;
    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
        if (surfaceHolder.getSurface() == null) {
            return;
        }
        stopCameraPreview();
        post(new Runnable() {
            @Override
            public void run() {
                showCameraPreview();
            }
        });
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        mSurfaceCreated = false;
        stopCameraPreview();
    }

    public void showCameraPreview() {
        if (mCamera != null) {
            try {
                mPreviewing = true;
                mCamera.setPreviewDisplay(getHolder());
                mCameraConfigurationManager.setDesiredCameraParameters(mCamera);
                mCamera.setOneShotPreviewCallback(mpreviewCallback);
                mCamera.startPreview();
                mCamera.autoFocus(autoFocusCB);
            } catch (Exception e) {
                Log.e(TAG, e.toString(), e);
            }
        }
    }

    public void stopCameraPreview() {
        if (mCamera != null) {
            try {
                removeCallbacks(doAutoFocus);
                mPreviewing = false;
                mCamera.cancelAutoFocus();
                mCamera.setOneShotPreviewCallback(null);
                mCamera.stopPreview();

            } catch (Exception e) {
                Log.e(TAG, e.toString(), e);
            }
        }
    }

    public void openFlashlight() {
        if (flashLightAvailable()) {
            mCameraConfigurationManager.openFlashlight(mCamera);
        }
    }

    public void closeFlashlight() {
        if (flashLightAvailable()) {
            mCameraConfigurationManager.closeFlashlight(mCamera);
        }
    }



    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
        int height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
        if (mCameraConfigurationManager != null && mCameraConfigurationManager.getCameraResolution() != null) {
            Point cameraResolution = mCameraConfigurationManager.getCameraResolution();
            // 取出来的cameraResolution高宽值与屏幕的高宽顺序是相反的
            int cameraPreviewWidth = cameraResolution.x;
            int cameraPreviewHeight = cameraResolution.y;
            if (width * 1f / height < cameraPreviewWidth * 1f / cameraPreviewHeight) {
                float ratio = cameraPreviewHeight * 1f / cameraPreviewWidth;
                width = (int) (height / ratio + 0.5f);
            } else {
                float ratio = cameraPreviewWidth * 1f / cameraPreviewHeight;
                height = (int) (width / ratio + 0.5f);
            }
        }
        super.onMeasure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
    }


    private boolean flashLightAvailable() {
        return mCamera != null && mPreviewing && mSurfaceCreated && getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
    }

    private Runnable doAutoFocus = new Runnable() {
        @Override
        public void run() {
            if (mCamera != null && mPreviewing && mSurfaceCreated) {
                try {
                    mCamera.autoFocus(autoFocusCB);
                } catch (Exception e) {
                }
            }
        }
    };

    Camera.AutoFocusCallback autoFocusCB = new Camera.AutoFocusCallback() {
        @Override
        public void onAutoFocus(boolean success, Camera camera) {
            if (success) {
                postDelayed(doAutoFocus, 1500);
            } else {
                postDelayed(doAutoFocus, 500);
            }
        }
    };

    public Point getPreViewSize() {
        if (mCameraConfigurationManager != null) {
            return mCameraConfigurationManager.getmPreviewResolution();
        }
        return null;
    }

    public float getScale() {
        float scale=1.0f;
        if (mCameraConfigurationManager != null) {
            float width=0;
            float height=0;
            if(ViewfinderView.width==0||ViewfinderView.height==0){
                width=(float)CardScreenUtil.getScreenResolution(getContext()).x;
                height=(float)CardScreenUtil.getScreenResolution(getContext()).y;
            }else{
                width=ViewfinderView.width;
                height=ViewfinderView.height;
            }
             float Wscale=((float)mCameraConfigurationManager.getCameraResolution().x /width);
             float Hscale=((float)mCameraConfigurationManager.getCameraResolution().y /height);
              scale=(Wscale<Hscale)?Wscale:Hscale;
              if(CardScreenUtil.getScreenOrientation(getContext())==CardScreenUtil.ORIENTATION_PORTRAIT){
                 ViewfinderView.portraitWidth=(int)(mCameraConfigurationManager.getCameraResolution().x/scale);
              }
            return scale;
        }
        return scale;
    }

    public float getHscale(){
        float Hscale=((float)mCameraConfigurationManager.getCameraResolution().y /(float) CardScreenUtil.getScreenResolution(getContext()).y);
        return Hscale;
    }


}