package com.mints.goodmoney.utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.Drawable;

import com.mints.goodmoney.R;
import com.mints.goodmoney.common.Constant;
import com.mints.library.utils.TLog;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;

/**
 * 图片util
 *
 * @author renjl
 * @time Apr 30, 2015 5:20:37 PM
 * @explain
 */
public class ImageUtil {

    /**
     * 缩小图片
     *
     * @param bitmap
     * @param w
     * @param h
     * @return
     */
    public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) {

        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        /**
         *
         */
        Matrix matrix = new Matrix();
        float scaleWidth = (float) w / width;
        float scaleHeight = (float) h / height;
        matrix.postScale(scaleWidth, scaleHeight);
        Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height,
                matrix, true);
        return newbmp;
    }

    /**
     * drawableToBitmap
     *
     * @param drawable
     * @return
     */
    public static Bitmap drawableToBitmap(Drawable drawable) {
        int width = drawable.getIntrinsicWidth();
        int height = drawable.getIntrinsicHeight();
        Bitmap bitmap = Bitmap.createBitmap(width, height, drawable
                .getOpacity() != PixelFormat.OPAQUE ? Config.ARGB_8888
                : Config.RGB_565);
        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0, 0, width, height);
        drawable.draw(canvas);
        return bitmap;
    }

    /*
     * 得到一个圆角图片
     */
    public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {

        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
                bitmap.getHeight(), Config.ARGB_8888);
        Canvas canvas = new Canvas(output);
        final int color = 0xff424242;
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        final RectF rectf = new RectF(rect);

        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawRoundRect(rectf, roundPx, roundPx, paint);

        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);
        return output;
    }

    //
    public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) {
        final int reflectionGap = 4;
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();

        Matrix matrix = new Matrix();
        matrix.preScale(1, -1);

        Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, height / 2,
                width, height / 2, matrix, false);

        Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
                (height + height / 2), Config.ARGB_8888);

        Canvas canvas = new Canvas(bitmapWithReflection);
        canvas.drawBitmap(bitmap, 0, 0, null);
        Paint deafalutPaint = new Paint();
        canvas.drawRect(0, height, width, height + reflectionGap, deafalutPaint);

        canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);

        Paint paint = new Paint();
        LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0,
                bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff,
                0x00ffffff, TileMode.CLAMP);
        paint.setShader(shader);
        // Set the Transfer mode to be porter duff and destination in
        paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
        // Draw a rectangle using the paint with our linear gradient
        canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
                + reflectionGap, paint);

        return bitmapWithReflection;
    }

    /**
     * 将bitmap转ByteArray
     *
     * @param bmp
     * @param needRecycle
     * @return
     */
    public static byte[] bmpToByteArray(final Bitmap bmp,
                                        final boolean needRecycle) {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        bmp.compress(CompressFormat.PNG, 100, output);
        if (needRecycle) {
            bmp.recycle();
        }
        byte[] result = output.toByteArray();
        try {
            output.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }

    /**
     * 保存图片到SD卡上
     *
     * @param dw
     * @param fileNa .png结尾
     */
//    public static void saveDrawable(Drawable dw, String fileNa) {
//        try {
//            BitmapDrawable bd = (BitmapDrawable) dw;
//            Bitmap bm = bd.getBitmap();
//
//            File file = new File(Constant.ICASH_PATH + fileNa);
//            // 创建图片缓存文件夹
//            boolean sdCardExist = Environment.getExternalStorageState().equals(
//                    Environment.MEDIA_MOUNTED); // 判断sd卡是否存在
//            if (sdCardExist) {
//                File maiduo = new File(Constant.ICASH_PATH);
//                // 如果文件夹不存在
//                if (!maiduo.exists()) {
//                    // 按照指定的路径创建文件夹
//                    maiduo.mkdir();
//                    // 如果文件夹不存在
//                }
//                // 检查图片是否存在
//                if (!file.exists()) {
//                    file.createNewFile();
//                }
//            }
//
//            BufferedOutputStream bos = new BufferedOutputStream(
//                    new FileOutputStream(file));
//            bm.compress(CompressFormat.JPEG, 100, bos);
//            bos.flush();
//            bos.close();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }

    public static Bitmap getBitmap(Context context, String name) {
        Bitmap bitmap = null;
        try {
            String packageName = "/" + R.class.getName().replace('.', '/');
            packageName = packageName.substring(0, packageName.length() - 1);
            TLog.d(Constant.TAG_NAME, packageName + name + ".png");
            InputStream is = R.class.getResourceAsStream(packageName + name
                    + ".png");
            if (is == null) {
                is = R.class.getResourceAsStream(packageName + name + ".9.png");
            }
            if (is == null) {
                is = R.class.getResourceAsStream(packageName + name + ".jpg");
            }
            bitmap = BitmapFactory.decodeStream(is);
            is.close();
        } catch (Throwable t) {
            t.printStackTrace();
        }
        return bitmap;
    }


}
