package com.nimble.androidnative.customcamera;

import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.SeekBar;

import com.otaliastudios.cameraview.CameraException;
import com.otaliastudios.cameraview.CameraListener;
import com.otaliastudios.cameraview.CameraUtils;
import com.otaliastudios.cameraview.CameraView;
import com.otaliastudios.cameraview.Gesture;
import com.otaliastudios.cameraview.GestureAction;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Objects;
import java.util.concurrent.Executors;

/**
 * 项目名称: nimble_smartSite
 * 类描述: 有句话描述当前类
 * 创建人: Tail
 * 创建时间: 2020-9-21
 * 修改人:
 * 修改时间:
 * 修改备注
 */

public class Camera3Activity extends AppCompatActivity {
    //CameraView对象
    private CameraView camera;
    //保存图片的文件夹地址
    private String filePath;
    private ProgressBar mPb;
    private VerticalSeekBar vsb;

    private Handler mHandler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(DesignUtils.getId(this, "activity_camera_3", "layout"));

        filePath = getIntent().getStringExtra("path");

        if (TextUtils.isEmpty(filePath)) {
            filePath = Objects.requireNonNull(this.getExternalFilesDir(null)).getPath() + File.separator +
                    +System.currentTimeMillis() + "_pic.jpg";
        }
        Log.d("Camera3Activity", "onCreate: " + filePath);

        //实例化对象
        camera = findViewById(DesignUtils.getId(this, "camera", "id"));
        camera.setLifecycleOwner(this);
        camera.mapGesture(Gesture.TAP, GestureAction.FOCUS_WITH_MARKER); // Tap to focus!

        mPb = findViewById(DesignUtils.getId(this, "loadingBar", "id"));

        ImageView shutter = findViewById(DesignUtils.getId(this, "img_camera2", "id"));
        //设置快门的监听
        shutter.setOnClickListener(view -> takephoto());

        ImageView ivBack = findViewById(DesignUtils.getId(this, "iv_back2", "id"));
        vsb=findViewById(DesignUtils.getId(this,"vsb_controller","id"));
        ivBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });

        vsb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                camera.setZoom(((float) i/100f));
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });

        initCamera();
    }

    //拍照的方法
    private void takephoto() {
        mPb.setVisibility(View.VISIBLE);
        camera.capturePicture();
    }

    private void initCamera() {
        //初始化相机 设置相机拍照后的处理
        camera.addCameraListener(new CameraListener() {
            @Override
            public void onPictureTaken(byte[] jpeg) {
                super.onPictureTaken(jpeg);

                CameraUtils.decodeBitmap(jpeg, new CameraUtils.BitmapCallback() {
                    @Override
                    public void onBitmapReady(Bitmap bitmap) {
                        Log.d("Camera3Activity", "takeSuccess:  拍照成功");
                        takeSuccess(bitmap);
                    }
                });
            }

            @Override
            public void onCameraError(@NonNull CameraException exception) {
                mPb.setVisibility(View.GONE);
            }
        });


    }


    public void takeSuccess(Bitmap bitmap) {
        //拍照成功后进行保存
        //创建文件,要保存png，这里后缀就是png，要保存jpg，后缀就用jpg
        //以拍摄时间为图片名进行命名
        Executors.newSingleThreadExecutor().execute(new Runnable() {
            @Override
            public void run() {
                File file = new File(filePath);
                try {
                    //文件输出流
                    FileOutputStream fileOutputStream = new FileOutputStream(file);
                    //压缩图片，如果要保存png，就用Bitmap.CompressFormat.PNG，要保存jpg就用Bitmap.CompressFormat.JPEG,质量是100%，表示不压缩
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 80, fileOutputStream);
                    //写入，这里会卡顿，因为图片较大
                    fileOutputStream.flush();
                    //记得要关闭写入流
                    fileOutputStream.close();
                    Log.d("Camera3Activity", "takeSuccess:  图片存储成功");
                    //成功的提示，写入成功后，请在对应目录中找保存的图片
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            startIntent();
                        }
                    });
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                    //失败的提示
                    Log.e("Camera3Activity", "takeSuccess: ", e);
                } catch (IOException e) {
                    e.printStackTrace();
                    //失败的提示
                    Log.e("Camera3Activity", "takeSuccess: ", e);
                }finally {
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            mPb.setVisibility(View.GONE);
                        }
                    });
                }
            }
        });

    }

    private void startIntent() {
        Intent intent = new Intent();
        intent.putExtra("IMG_PATH", filePath);
        this.setResult(-1, intent);
        finish();
    }


    //动态权限申请
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        boolean valid = true;
        for (int grantResult : grantResults) {
            valid = valid && grantResult == PackageManager.PERMISSION_GRANTED;
        }
        if (valid && !camera.isStarted()) {
            camera.start();
        }
    }

    //根据activity生命周期 将来启动或者销毁相机
    @Override
    protected void onResume() {
        super.onResume();
        if (!camera.isStarted()) {
            camera.start();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        camera.stop();
        //退出界面 比如点击home时 停掉相机 以onResume重启

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //销毁相机释放资源
        camera.destroy();
    }


}
