package com.mjsheng.myappstore.download;

import android.content.Context;
import android.os.Build;
import android.os.Environment;
import android.os.storage.StorageManager;

import com.blankj.utilcode.util.PathUtils;

import java.io.File;
import java.lang.reflect.Array;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.DecimalFormat;

public class StorageUtils {


    //  获取存储空间 false 内置sd卡路径，true 外置sd卡路径
    public static File getStoragePath(Context mContext, boolean isSDcard) {
        StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
        Class<?> storageVolumeClazz = null;
        try {
            storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
            Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
            Method getPath = storageVolumeClazz.getMethod("getPath");
            Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
            Object result = getVolumeList.invoke(mStorageManager);
            final int length = Array.getLength(result);
            for (int i = 0; i < length; i++) {
                Object storageVolumeElement = Array.get(result, i);
                String path = (String) getPath.invoke(storageVolumeElement);
                boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
                if (isSDcard == removable) {
                    File file = new File(path);
                    if (file.exists()) {
                        return file;
                    }else {
                        if (!isSDcard) {
                            return Environment.getExternalStorageDirectory();
                        } else {
                            File file1 = new File("root/storage/sdcard1");
                            if (file1.exists()){
                                return file1;
                            }else {
                                File file2 = new File("storage/sdcard1");
                                if (file2.exists()){
                                    return file2;
                                }else {
                                    File file3 = new File("/storage/emulated/0");
                                    if (file3.exists()){
                                        return file3;
                                    }else {
                                        return null;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }



    public static String getFileCache(Context context, String s) {
        return getExternalFilesDir(context, s).getAbsolutePath();
    }

    public static String getFileRoot(Context context) {
        return getExternalFilesDir(context, "Download").getAbsolutePath();
    }

    public static File getExternalFilesDir(Context context, String s) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
            File path = context.getExternalFilesDir(s);
            if (path != null) {
                return path;
            }
        }
        final String cacheDir = "/Android/data/" + context.getPackageName() + "/files/" + s;
        return new File(Environment.getExternalStorageDirectory().getPath() + cacheDir);
    }


    // 检测文件是否存在
    public static boolean isFileIsExists(String filePath){
        try{
            File f=new File(filePath);
            if(!f.exists()){
                return false;
            }
        }catch (Exception e) {
            return false;
        }
        return true;
    }


    public static String size(long size) {
        if (size / (1024 * 1024) > 0) {
            float tmpSize = (float) (size) / (float) (1024 * 1024 );
            DecimalFormat df = new DecimalFormat("#.##");
            return "" + df.format(tmpSize) + "GB";
        } else if (size / 1024 > 0) {
            float tmpSize = (float) (size) / (float) 1024 ;
            DecimalFormat df = new DecimalFormat("#.##");
            return "" + df.format(tmpSize) + "MB";
        } else if (size  > 0) {
            return "" + (size ) + "KB";
        } else {
            return "" + (size) + "KB";
        }
    }

}
