package com.cmcm.greendamexplorer.core.engine;

import java.io.File;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.os.Environment;
import android.os.StatFs;
import android.provider.MediaStore;

import com.cmcm.greendamexplorer.dao.DaoFactory;
import com.cmcm.greendamexplorer.dao.impl.FavoriteDao;
import com.cmcm.greendamexplorer.entity.Favorite;
import com.cmcm.greendamexplorer.entity.SimplePackgeInfo;
import com.cmcm.greendamexplorer.utils.TextUtil;

public class ResourceManager {
    private static ResourceManager mManager = null;
    private Context mContext = DeploymentOperation.getAppContext();
    public static final String DATABASES_DIR = "/data/data/com.cmcm.greendamexplorer.activity/databases";
    public static List<String> mExternalStoragepaths = new ArrayList<String>(); // 存储卡数量
    public static String mExternalStoragePath = "/";
    public static String mDownloadPath = null;
    public static long mToalBytes = 0;
    public static long mUsedBytes = 0;
    public static long mFreeBytes = 0;

    private static FavoriteDao mDao = DaoFactory.getFavoriteDao(DeploymentOperation.getAppContext());

    static {
        File sdDir = null;
        boolean sdCardExist = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); // 判断sd卡是否存在
        if (sdCardExist) {
            sdDir = Environment.getExternalStorageDirectory();
            mExternalStoragePath = sdDir.toString();
            mExternalStoragepaths.add(mExternalStoragePath);
        }
        
        calcStorageSize();

        mDownloadPath = Environment.getDownloadCacheDirectory().getAbsolutePath();
    }

    private ResourceManager() {
    }

    public static ResourceManager getInstance() {

        if (mManager == null) {
            mManager = new ResourceManager();
        }
        return mManager;
    }

    /**
     * 
     * 获取图片地址列表
     * 
     * @return list
     */
    public static ArrayList<String> getImagesPathFromMedia(Context context) {
        ArrayList<String> list = new ArrayList<String>();
        Cursor cursor = null;
        try {
            cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[] { "_id", "_data" }, null, null,
                    null);
            while (cursor.moveToNext()) {
                list.add("file://" + cursor.getString(1));// 将图片路径添加到list中
            }
        } catch (Exception e) {
            e.printStackTrace();
            if (cursor != null) {
                cursor.close();
            }
        }
        return list;
    }

    public static SimplePackgeInfo getApkPackgageInfo(String archiveFilePath) {

        PackageManager pm = DeploymentOperation.getAppContext().getPackageManager();
        PackageInfo info = pm.getPackageArchiveInfo(archiveFilePath, PackageManager.GET_ACTIVITIES);

        SimplePackgeInfo pkgInfo = null;
        if (info != null) {

            ApplicationInfo appInfo = info.applicationInfo;
            String appName = pm.getApplicationLabel(appInfo).toString();
            String packageName = appInfo.packageName; // 得到安装包名称
            String version = info.versionName; // 得到版本信息
            Drawable icon = pm.getApplicationIcon(appInfo);// 得到图标信息

            pkgInfo = new SimplePackgeInfo(icon, appName, version, packageName);
        }

        return pkgInfo;
    }

    // 获取用户应用
    public List<PackageInfo> getCustomApps() {
        List<PackageInfo> apps = new ArrayList<PackageInfo>();
        PackageManager pm = mContext.getPackageManager();
        // 获取手机内所有应用
        List<PackageInfo> paklist = pm.getInstalledPackages(0);
        for (int i = 0; i < paklist.size(); i++) {
            PackageInfo pak = (PackageInfo) paklist.get(i);
            if ((pak.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) {
                apps.add(pak);
            }
        }
        return apps;
    }

    // 获取系统应用
    public List<PackageInfo> getSystemApps() {
        List<PackageInfo> apps = new ArrayList<PackageInfo>();
        PackageManager pm = mContext.getPackageManager();
        // 获取手机内所有应用
        List<PackageInfo> paklist = pm.getInstalledPackages(0);
        for (int i = 0; i < paklist.size(); i++) {
            PackageInfo pak = (PackageInfo) paklist.get(i);
            if ((pak.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0) {
                apps.add(pak);
            }
        }
        return apps;
    }

    // 获取所有应用
    public List<PackageInfo> getAllApps() {
        PackageManager pm = mContext.getPackageManager();
        List<PackageInfo> paklist = pm.getInstalledPackages(0);
        return paklist;
    }

    public static List<Favorite> getAllFavorites() {
        List<Favorite> favorites = new ArrayList<Favorite>();

        favorites = mDao.findAllFavorite();
        return favorites;
    }

    public static void clearAllFavorite() {
        mDao.clearAll();
        DeploymentOperation.initialFavoriteDatabase();
    }

    public static void calcStorageSize() {
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            File filePath = Environment.getExternalStorageDirectory(); // 获得sd卡的路径
            StatFs stat = new StatFs(filePath.getPath()); // 创建StatFs对象
            
            long blockSize = stat.getBlockSize(); // 获取block的size
            float totalBlocks = stat.getBlockCount(); // 获取block的总数
            
            mToalBytes = (long) (blockSize * totalBlocks) ;
            long availableBlocks = stat.getAvailableBlocks(); // 获取可用块大小
            
            
            mUsedBytes= (long) ((totalBlocks - availableBlocks) * blockSize);
            mFreeBytes = mToalBytes - mUsedBytes;
            
            System.out.println("存储空间" + TextUtil.getSizeSting(mToalBytes) + ",已用" +  TextUtil.getSizeSting(mUsedBytes) + "剩余:" + TextUtil.getSizeSting(mFreeBytes));
        } else {
            System.out.println("存储卡不存在:存储空间" + TextUtil.getSizeSting(mToalBytes) + ",已用" +  TextUtil.getSizeSting(mUsedBytes) + "剩余:" + TextUtil.getSizeSting(mFreeBytes));
        }
    }

    public static void removeItem(String path) {
        FavoriteDao dao = DaoFactory.getFavoriteDao(DeploymentOperation.getAppContext());
        dao.deleteFavorite(path);
    }
}