import java.io.*;
import java.util.Enumeration;
import java.util.jar.*;
import javax.swing.JOptionPane;
import javax.swing.ProgressMonitor;

class Installer
{

	public static void main(String[] args)
	{
		

		String curDir = System.getProperty("user.dir");
		
		File minecraftDir = getMinecraftDirectory();
		
		if(minecraftDir == null)
		{
			return;
		}

		int numFiles = countFiles(new File(minecraftDir.getAbsolutePath()+"/bin/"));
		numFiles += countFiles(new File(minecraftDir.getAbsolutePath()+"/resources/"));
		filesCopied = 0;

		progressMonitor = new ProgressMonitor(null, "Installing AdventureCraft", "", 0, numFiles);
		
		try
		{
			copyDir(new File(minecraftDir.getAbsolutePath()+"/bin/"),
					new File(curDir+"/.minecraft/bin/"));
			copyDir(new File(minecraftDir.getAbsolutePath()+"/resources/"),
					new File(curDir+"/.minecraft/resources/"));
		}
		catch (Exception e)
		{
			JOptionPane.showMessageDialog(null, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
		}
		
		progressMonitor.close();
		JOptionPane.showMessageDialog(null, "Finished Installing!", "Installed", JOptionPane.INFORMATION_MESSAGE);
		
	}

	public static int countFiles(File source)
	{
		File[] children = source.listFiles();
		int numFiles = 0;
		for(File sourceChild : children)
		{
			if(sourceChild.isDirectory())
			{
				numFiles += countFiles(sourceChild);
			}
			else
			{
				numFiles += 1;
			}
		}
		return numFiles;
	}
	
	public static void copyDir(File source, File target) throws IOException
	{
		if(!target.exists())
		{
			target.mkdirs();
		}
		File[] children = source.listFiles();
		for(File sourceChild : children)
		{
			File targetFile = new File(target, sourceChild.getName());
			progressMonitor.setNote(sourceChild.getName());
			if(sourceChild.isDirectory())
			{
				copyDir(sourceChild, targetFile);
			}
			else if(sourceChild.getName().equals("minecraft.jar"))
			{
				copyJar(sourceChild, targetFile);
				filesCopied += 1;
			}
			else
			{
				copyFile(sourceChild, targetFile);
				filesCopied += 1;
			}
			progressMonitor.setProgress(filesCopied);
		}
	}
	
	public static void copyFile(File source, File target) throws IOException
	{
		if(!target.exists())
		{
			target.createNewFile();
		}
		InputStream in = null;
		OutputStream out = null;
		try
		{
			in = new FileInputStream(source);
			out = new FileOutputStream(target);
			
			int len;
			byte[] buffer = new byte[4096];
			while((len = in.read(buffer)) > 0)
			{
				out.write(buffer, 0, len);
			}
		}
		finally
		{
			if(in != null)
				in.close();
			if(out != null)
				out.close();
		}
	}
	
	public static void copyJar(File source, File target) throws IOException
	{
		if(!target.exists())
		{
			target.createNewFile();
		}
		
        // Open the jar file.
        JarFile         jar     = new JarFile(source);
        JarOutputStream outputJar = new JarOutputStream(new FileOutputStream(target));

        // Allocate a buffer for reading entry data.
        byte[] buffer = new byte[1024];
        int    bytesRead;

        for (Enumeration<JarEntry> entries = jar.entries(); entries.hasMoreElements(); )
        {
            JarEntry entry = entries.nextElement();
            if(entry.getName().startsWith("META-INF"))
            {
            	continue;
            }
            InputStream entryStream = jar.getInputStream(entry);
            outputJar.putNextEntry(entry);

            while ((bytesRead = entryStream.read(buffer)) != -1)
            {
            	outputJar.write(buffer, 0, bytesRead);
            }
        }
        
        jar.close();
        outputJar.close();
	}
	
	public static File getMinecraftDirectory()
    {
		String osName = System.getProperty("os.name").toLowerCase();
        String userHome = System.getProperty("user.home", ".");
        File minecraftDirectory;
        
        if(osName.contains("solaris") || osName.contains("linux"))
        {
            minecraftDirectory = new File(userHome, ".minecraft/");
        }
        else if(osName.contains("win"))
        {
            String applicationData = System.getenv("APPDATA");
            if(applicationData != null)
                minecraftDirectory = new File(applicationData, ".minecraft/");
            else
                minecraftDirectory = new File(userHome, ".minecraft/");
        }
        else if(osName.contains("mac"))
        {
            minecraftDirectory = new File(userHome, "Library/Application Support/minecraft");
        }
        else
        {
            minecraftDirectory = new File(userHome, "minecraft/");
        }
        if(!minecraftDirectory.exists())
        {
        	JOptionPane.showMessageDialog(null, "Couldn't find the Minecraft directory", "Error", JOptionPane.ERROR_MESSAGE);
        	return null;
        }
        return minecraftDirectory;
    }

	static int filesCopied = 0;
	static ProgressMonitor progressMonitor;
}