package eu.dnetlib.enabling.aas.is;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import org.springframework.context.ApplicationContext;

import eu.dnetlib.enabling.aas.utils.SpringUtils;
import eu.dnetlib.enabling.is.registry.rmi.ISRegistryException;
import eu.dnetlib.enabling.is.registry.rmi.ISRegistryService;


/**
 * Registers inside IS all profiles from directory (and subdirectories) given as parameter.
 * @author mhorst
 *
 */
public class ProfilesRegistrator {

	
	class ProfilesFilter implements java.io.FilenameFilter {

        public boolean accept(File dir, String name) {
        	return !name.equals(".svn");
        }
	}

	ISRegistryService registryService = null;
	
	public ProfilesRegistrator() {
//		load spring configuration
		ApplicationContext ctx = SpringUtils.getSpringContext(SpringUtils.DEFAULT_TEST_RESOURCE);
		registryService = (ISRegistryService) ctx.getBean(SpringUtils.BEAN_REMOTE_IS_REGISTRY);
	}
	
	public String getFileContent(File file) {
		if (file==null || !file.isFile())
			return null;
		
		try {
			StringBuffer buff = new StringBuffer();
			FileReader fr = new FileReader(file);
			BufferedReader reader = new BufferedReader(fr);
			String line = null;
			while ((line = reader.readLine())!=null) {
				buff.append(line);
			}
			return buff.toString();
			
		} catch (FileNotFoundException e) {
			System.out.println("Couldn't find file: "+file.getAbsolutePath());
			return null;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	public void processDirectory(File dir) throws ISRegistryException {
		if (dir==null) {
			System.out.println("Null directory!");
			return;
		}
		if (!dir.isDirectory()) {
			System.out.println(dir.getAbsolutePath() + " is not a directory!");
			return;
		}
		System.out.println("Processing directory " + dir.getAbsolutePath() + "...");
		File[] files = dir.listFiles(new ProfilesFilter());
		for (int i = 0; i < files.length; i++) {
			if (files[i].isDirectory()) {
				processDirectory(files[i]);
			} else {
				System.out.println("Registring profile from file " + files[i].getAbsolutePath() + " ...");
				String resourceProfile = getFileContent(files[i]);
				String profId = registryService.registerProfile(resourceProfile);
				System.out.println("Profile registered with profId: " + profId);
			}
		}
	}
	
	public static void main(String[] args) {
		if (args.length==0) {
			System.out.println("No directory containing profiles provided!");
			return;
		}
		
		ProfilesRegistrator registrator = new ProfilesRegistrator();
		try {
			for (int i = 0; i < args.length; i++) {
				String rootDir = args[i];
				File rootFile = new File(rootDir);
				if (rootFile.isDirectory()) {
					registrator.processDirectory(rootFile);
				} else {
					System.out.println("Registring profile from file " + rootFile.getAbsolutePath() + " ...");
					String resourceProfile = registrator.getFileContent(rootFile);
					String profId = registrator.getRegistryService().registerProfile(resourceProfile);
					System.out.println("Profile registered with profId: " + profId);
				}
				
			}
			System.out.println("Profiles registration finished!");
			
		} catch (ISRegistryException e) {
			e.printStackTrace();
		}
			
	}

	public ISRegistryService getRegistryService() {
		return registryService;
	}
}
