package com.gram.landlord_client.util;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.v4.content.FileProvider;
import com.gram.landlord_client.activity.MainActivity;
import com.orhanobut.logger.Logger;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class AvatarChangeUtil {
    //裁剪图
    private static final String CROP = "CROP";
    //压缩图
    private static final String COMPRESS = "COMPRESS";
    //FileProvider Authority
    public static final String FILEPROVIDER="com.gram.gram_landlord.fileprovider";

    /**
     * 判断系统及拍照
     */
    public static void takePicture(Activity activity) {
        Uri pictureUri;
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //对目标uri临时授权
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        File pictureFile = createImageFile(activity, null);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            pictureUri = FileProvider.getUriForFile(activity,
                    FILEPROVIDER, pictureFile);
        } else {
            pictureUri = Uri.fromFile(pictureFile);
        }
        //去拍照
        intent.putExtra(MediaStore.EXTRA_OUTPUT, pictureUri);
        ((MainActivity) activity).setCameraUri(pictureUri);
        if(intent.resolveActivity(activity.getPackageManager()) != null) {
            activity.startActivityForResult(intent, MainActivity.REQUEST_IMAGE_CAPTURE);
        }
    }

    /**
     * 从图库选图片
     */
    public static void selectPicture(Activity activity) {
        Intent intent = new Intent();
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
        } else {
            intent.setAction(Intent.ACTION_GET_CONTENT);
        }
        intent.setType("image/*");
        if(intent.resolveActivity(activity.getPackageManager()) != null) {
            activity.startActivityForResult(intent, MainActivity.REQUEST_IMAGE_GET);
        } else {
            ToastUtil.showCenterToast("未找到图片查看器");
        }
    }

    /**
     * 处理ACTION_OPEN_DOCUMENT:图像选择器中Uri不被裁剪程序识别的问题
     */
    @TargetApi(19)
    public static String formatUri(Activity activity, Uri uri) {
        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
        // DocumentProvider
        if (isKitKat && DocumentsContract.isDocumentUri(activity, uri)) {
            // ExternalStorageProvider
            if ("com.android.externalstorage.documents".equals(uri.getAuthority())) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/"
                            + split[1];
                }
            }
            // DownloadsProvider
            else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"),
                        Long.valueOf(id));

                return getDataColumn(activity, contentUri, null, null);
            }
            // MediaProvider
            else if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }

                final String selection = "_id=?";
                final String[] selectionArgs = new String[]{split[1]};

                return getDataColumn(activity, contentUri, selection,
                        selectionArgs);
            }
        }
        // MediaStore (and general)
        else if ("content".equalsIgnoreCase(uri.getScheme())) {

            // Return the remote address
            if ("com.google.android.apps.photos.content".equals(uri.getAuthority()))
                return uri.getLastPathSegment();

            return getDataColumn(activity, uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }

        return null;
    }

    private static String getDataColumn(Activity activity, Uri uri, String selection, String[] selectionArgs) {
        Cursor cursor = null;
        final String column = "_data";
        final String[] projection = {column};

        try {
            cursor = activity.getContentResolver().query(uri, projection,
                    selection, selectionArgs, null);
            if (cursor != null && cursor.moveToFirst()) {
                final int index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }

    /**
     * 创建图片文件,名称不重复。
     * @remark 图片注解,比如crop就是裁剪图、compress就是压缩图
     */
    private static File createImageFile(Activity activity, @Nullable String remark) {
        File imageFile = null;
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date());
        String imageFileName = "AVATAR" + timeStamp + remark;
        //应用内部目录
        File pictureDir = activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        if(pictureDir != null) {
            File storageDir = new File(pictureDir.getAbsolutePath() + "/pictures");
            try {
                imageFile = File.createTempFile(imageFileName, ".jpg", storageDir);
            } catch (IOException e) {
                Logger.e(e.getMessage());
            }
        }
        return imageFile;
    }

    /**
     * 头像图片裁剪
     */
    public static void crop(Activity activity, Uri uri) {
        File pictureCropFile = createImageFile(activity, CROP);
        Uri imgCropUri = Uri.fromFile(pictureCropFile);
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop", "true");
        //缩略图的比例是1:1
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("outputX", 500);
        intent.putExtra("outputY", 500);
        intent.putExtra("return-data", false);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imgCropUri);
        ((MainActivity) activity).setCropUri(imgCropUri);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        activity.startActivityForResult(intent, MainActivity.REQUEST_IMAGE_CROP);
    }

    /**
     * 图片压缩,sizeLimit单位为KB
     */
    public static Uri compress(Activity activity, Uri uri, long sizeLimit) {
        File pictureCompressFile = createImageFile(activity, COMPRESS);
        try {
            Bitmap bitmap = BitmapFactory.decodeStream(activity.getContentResolver().openInputStream(uri));
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int quality = 100;
            bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);
            while(baos.toByteArray().length / 1024 > sizeLimit) {
                baos.reset();
                quality -= 10;
                bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);
            }
            Bitmap compressedBitmap = BitmapFactory.decodeStream(
                    new ByteArrayInputStream(baos.toByteArray()), null, null);

            FileOutputStream fos = new FileOutputStream(pictureCompressFile);
            if(compressedBitmap != null) {
                compressedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            }
            fos.flush();
            fos.close();
            return Uri.fromFile(pictureCompressFile);
        } catch (FileNotFoundException e) {
            Logger.e(e.getMessage());
        } catch (IOException e) {
            Logger.e(e.getMessage());
        }
        return null;
    }

    /**
     * 将字节数组转换为Bitmap
     */
    public static Bitmap bytes2Bitmap(byte[] b) {
        if(b.length != 0) return BitmapFactory.decodeByteArray(b,0,b.length);
        else return null;
    }

    /**
     * 将Bitmap转换为字节数组,默认为PNG格式
     */
    public static byte[] bitmap2Bytes(Bitmap bm) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
        return baos.toByteArray();
    }

    /**
     * 根据uri获取bitmap
     */
    public static Bitmap getBitmapFromUri(Context context, Uri uri) {
        if(uri == null) return null;
        Bitmap bm;
        try {
            bm = MediaStore.Images.Media.getBitmap(context.getContentResolver(), uri);
            return bm;
        } catch (IOException e) {
            Logger.e(e.getMessage());
            return null;
        }
    }

}