package eu.dnetlib.xml.database;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import jargs.gnu.CmdLineParser;

/**
 * Commandline client for xml database offline operations.
 * 
 * @author marko
 * 
 */
public class DatabaseClient {

	private static void printUsage() {
		System.err.println("Usage: ...");
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("eu/dnetlib/xml/database/applicationContext.xml");

		Args parsedArgs = parseArgs(args);

		String clientName = parsedArgs.isOnline() ? "onlineDatabaseClient" : "offlineDatabaseClient";

		AbstractDatabaseClient client = (AbstractDatabaseClient) context.getBean(clientName, AbstractDatabaseClient.class);

		try {
			try {
				client.prepare(context, parsedArgs);
				client.dispatch(parsedArgs.getMethod(), parsedArgs);

				System.out.println("finished");
			} catch (IllegalArgumentException e) {
				System.out.println(e.getMessage());
				printUsage();
				System.exit(2);
			}
		} finally {
			context.close();
		}
	}

	private static Args parseArgs(String[] args) {
		CmdLineParser parser = new CmdLineParser();
		CmdLineParser.Option online = parser.addBooleanOption('o', "online");
		CmdLineParser.Option method = parser.addStringOption('m', "method");
		CmdLineParser.Option dbDir = parser.addStringOption('d', "db");
		CmdLineParser.Option backupDir = parser.addStringOption('b', "backup-dir");
		CmdLineParser.Option loadDir = parser.addStringOption('i', "load-dir");
		CmdLineParser.Option backupFile = parser.addStringOption('f', "backup-file");
		
		try {
			parser.parse(args);
		} catch (CmdLineParser.OptionException e) {
			System.err.println(e.getMessage());
			printUsage();
			System.exit(2);
		}

		Args res = new Args();
		res.setOnline((Boolean) parser.getOptionValue(online, Boolean.FALSE));
		res.setMethod((String) parser.getOptionValue(method));
		res.setDbDir((String) parser.getOptionValue(dbDir));
		res.setBackupDir((String) parser.getOptionValue(backupDir));
		res.setLoadDir((String) parser.getOptionValue(loadDir));
		res.setBackupFile((String) parser.getOptionValue(backupFile));
		
		return res;
	}

}
