package com.markzhai.lyrichere.utils;

import android.net.Uri;
import android.os.Environment;
import android.webkit.MimeTypeMap;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

public final class FileUtils {

    public static final int PASTE_MODE_COPY = 0;
    public static final int PASTE_MODE_MOVE = 1;
    private static final String TAG = FileUtils.class.getName();
    private static File COPIED_FILE = null;
    private static int pasteMode = 1;

    private FileUtils() {
    }

    public static synchronized void setPasteSrcFile(File f, int mode) {
        COPIED_FILE = f;
        pasteMode = mode % 2;
    }

    public static synchronized File getFileToPaste() {
        return COPIED_FILE;
    }

    public static synchronized int getPasteMode() {
        return pasteMode;
    }

    static boolean isMusic(File file) {

        Uri uri = Uri.fromFile(file);
        String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(uri.toString()));

        if (type == null)
            return false;
        else
            return (type.toLowerCase().startsWith("audio/"));

    }

    static boolean isVideo(File file) {

        Uri uri = Uri.fromFile(file);
        String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(uri.toString()));

        if (type == null)
            return false;
        else
            return (type.toLowerCase().startsWith("video/"));
    }

    public static boolean isPicture(File file) {

        Uri uri = Uri.fromFile(file);
        String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(uri.toString()));

        if (type == null)
            return false;
        else
            return (type.toLowerCase().startsWith("image/"));
    }

    public static boolean isProtected(File path) {
        return (!path.canRead() && !path.canWrite());
    }

    public static boolean isUnzippable(File path) {
        return (path.isFile() && path.canRead() && path.getName().endsWith(".zip"));
    }


    public static boolean isRoot(File dir) {

        return dir.getAbsolutePath().equals("/");
    }


    public static boolean isSdCard(File file) {

        try {
            return (file.getCanonicalPath().equals(Environment.getExternalStorageDirectory().getCanonicalPath()));
        } catch (IOException e) {
            return false;
        }
    }

    public static Map<String, Long> getDirSizes(File dir) {
        Map<String, Long> sizes = new HashMap<String, Long>();

        try {

            Process du = Runtime.getRuntime().exec("/system/bin/du -b -d1 " + dir.getCanonicalPath(), new String[]{}, Environment.getRootDirectory());

            BufferedReader in = new BufferedReader(new InputStreamReader(
                    du.getInputStream()));
            String line = null;
            while ((line = in.readLine()) != null) {
                String[] parts = line.split("\\s+");

                String sizeStr = parts[0];
                Long size = Long.parseLong(sizeStr);

                String path = parts[1];

                sizes.put(path, size);
            }

        } catch (IOException e) {
            LogUtils.w(TAG, "Could not execute DU command for " + dir.getAbsolutePath(), e);
        }

        return sizes;

    }

    public static File getDownloadsFolder() {
        return new File("/sdcard/" + Environment.DIRECTORY_DOWNLOADS);
    }

    public static File getDcimFolder() {
        return new File("/sdcard/" + Environment.DIRECTORY_DCIM);
    }

    /* Checks if external storage is available for read and write */
    public boolean isExternalStorageWritable() {
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) {
            return true;
        }
        return false;
    }

    /* Checks if external storage is available to at least read */
    public boolean isExternalStorageReadable() {
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state) ||
                Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            return true;
        }
        return false;
    }
}