/* FileUtil.java - miscellaneous file routines.
 *
 * Copyright (c) 2012 Andrew Krizhanovsky <andrew.krizhanovsky at gmail.com>
 * Distributed under EPL/LGPL/GPL/AL/BSD multi-license.
 */

package wikokit.base.wikt.db;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;

import wikokit.base.wikipedia.sql.Connect;

import android.os.StatFs;
import android.os.Environment;
import android.util.Log;

public class FileUtil {
	
	/** Checks whether there is enough memory at SD card for the file 
	 * with the size "file_size_mb"? 
	 * @return true if it is enough
	 */
	public static boolean hasEnoughMemory(int file_size_mb) {
		
		String s = "";
		if(FileUtil.isMemoryCardAvailable()) {
			
			long mbytes = FileUtil.getSDFreeMemoryInMBytes();
			if(mbytes >  file_size_mb) {
				return true;
			} else {
				System.out.println(" It is not enough memory :(");
			}
		} else {
			System.out.println("Memory card is not available.");
		} 
		return false;
	}
	
	/** Creates directory at SD card. 
	 * E.g. /mnt/sdcard/kiwidict if path="kiwidict"
	 */
	public static boolean createDirIfNotExists(String path) {
	    boolean result = true;

	    File file = new File(Environment.getExternalStorageDirectory(), path);
	    if (!file.exists()) {
	        if (!file.mkdirs()) {
	            Log.e("FileUtil::createDirIfNotExists - ", "Problem creating Image folder");
	            result = false;
	        }
	    }
	    return result;
	}
	
	/** Checks wheather exists the file at the location at SD card/path/filename. 
	 * E.g. /mnt/sdcard/db.sqlite if dir="kiwidict" and filename="db.sqlite"
	 */
	public static boolean isFileExist(String path, String filename) {
	    
		String file_path = getFilePathAtExternalStorage(path, filename);
		File file = new File(file_path.toString());
		return file.exists();
	}
	
	/** Gets absolute file path to the file at SD card/path/filename. 
	 * E.g. /mnt/sdcard/db.sqlite if path="kiwidict" and filename="db.sqlite"
	 */
	public static String getFilePathAtExternalStorage(String path, String filename) {
	            
        StringBuilder file_path = new StringBuilder();
		file_path.append(Environment.getExternalStorageDirectory().getAbsolutePath());
		file_path.append(File.separator);
		file_path.append(path);
		file_path.append(File.separator); 
		file_path.append(filename);
		
		return file_path.toString();
	}
	
	/** Gets size of free internal memory. */
	/*public static long getFreeInternalMemoryInMBytes() {
		StatFs stat = new StatFs(Environment.getDataDirectory().getPath());
		long bytesAvailable = (long)stat.getFreeBlocks() * (long)stat.getBlockSize();;
		return bytesAvailable / 1048576;
	}*/
	
	/** Gets size of free memory at SD card in megabytes. */
	public static long getSDFreeMemoryInMBytes() {
		StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath());        
		long blockSize = statFs.getBlockSize();
		//long totalSize = statFs.getBlockCount()*blockSize;
		long availableSize = statFs.getAvailableBlocks()*blockSize;
		//long freeSize = statFs.getFreeBlocks()*blockSize;

		return availableSize / 1048576;
	}
	
	
	/** Is memory card available? */
	public static boolean isMemoryCardAvailable()
	{	
		String state = Environment.getExternalStorageState();
		if (Environment.MEDIA_MOUNTED.equals(state)) 
		{
			// We can read and write the media
			return true;
		} 
		else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) 
		{
			// We can only read the media
			return false;
		} 
		else 
		{
			// No external media
			return false;
		}
	}
	
	/* Gets file path at SD card by the directory.
     * 
     * @see http://stackoverflow.com/questions/3382996/how-to-unzip-files-programmatically-in-android
     */
    public static String getPathAtExternalStorageByDirectoryName(String dir)
    {   
        StringBuilder path = new StringBuilder();
        path.append(Environment.getExternalStorageDirectory().getAbsolutePath());
        path.append(File.separator);
        path.append(dir);

        return path.toString();
    }
    
	public static void deleteFileAtSDCard(String filename) {
	    File file = new File( FileUtil.getFilePathAtExternalStorage( 
                Connect.DB_DIR, filename));
	    file.delete();
    }

}
