/*
 * ConsoleInstall.java
 *
 * Originally written by Slava Pestov for the jEdit installer project. This work
 * has been placed into the public domain. You may use this work in any way and
 * for any purpose you wish.
 *
 * THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, NOT EVEN THE
 * IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, ASSUMES
 * _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE RESULTING FROM THE USE, MODIFICATION,
 * OR REDISTRIBUTION OF THIS SOFTWARE.
 */

package installer;

import java.io.*;
import java.util.Vector;

/*
 * Performs text-only installation.
 */
public class ConsoleInstall
{
	public ConsoleInstall()
	{
		installer = new Install();

		String appName = installer.getProperty("app.name");
		String appVersion = installer.getProperty("app.version");

		BufferedReader in = new BufferedReader(new InputStreamReader(
			System.in));

		System.out.println("*** " + appName + " " + appVersion + " installer");

		OperatingSystem os = OperatingSystem.getOperatingSystem();

		String installDir = os.getInstallDirectory(appName,appVersion);

		System.out.print("Installation directory: [" + installDir + "] ");
		System.out.flush();

		String _installDir = readLine(in);
		if(_installDir.length() != 0)
			installDir = _installDir;

		OperatingSystem.OSTask[] osTasks = os.getOSTasks(installer);

		for(int i = 0; i < osTasks.length; i++)
		{
			OperatingSystem.OSTask osTask = osTasks[i];
			String label = osTask.getLabel();
			// label == null means no configurable options
			if(label != null)
			{
				String dir = osTask.getDirectory();
				System.out.print(label + " [" + dir + "] ");
				System.out.flush();

				dir = readLine(in);
				osTask.setEnabled(true);
				if(dir.length() != 0)
				{
					if(dir.equals("off"))
						osTask.setEnabled(false);
					else
						osTask.setDirectory(dir);
				}
			}
		}

		int compCount = installer.getIntegerProperty("comp.count");
		Vector components = new Vector(compCount);

		System.out.println("*** Program components to install");
		for(int i = 0; i < compCount; i++)
		{
			String fileset = installer.getProperty("comp." + i + ".fileset");

			String osDep = installer.getProperty("comp." + i + ".os");
			if(osDep != null)
			{
				if(!os.getClass().getName().endsWith(osDep))
				{
					continue;
				}
			}

			System.out.print("Install "
				+ installer.getProperty("comp." + i + ".name")
				+ " ("
				+ installer.getProperty("comp." + i + ".disk-size")
				+ "Kb) [Y/n]? ");

			String line = readLine(in);
			if(line.length() == 0 || line.charAt(0) == 'y'
				|| line.charAt(0) == 'Y')
				components.addElement(fileset);
		}

		System.out.println("*** Starting installation...");
		ConsoleProgress progress = new ConsoleProgress();
		InstallThread thread = new InstallThread(
			installer,progress,installDir,osTasks,
			0 /* XXX */,components);
		thread.start();
	}

	// private members
	private Install installer;

	private String readLine(BufferedReader in)
	{
		try
		{
			String line = in.readLine();
			if(line == null)
			{
				System.err.println("\nEOF in input!");
				System.exit(1);
				// can't happen
				throw new InternalError();
			}
			return line;
		}
		catch(IOException io)
		{
			System.err.println("\nI/O error: " + io);
			System.exit(1);
			// can't happen
			throw new InternalError();
		}
	}
}
