package eu.dnetlib.enabling.aas.ismock;

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.service.A2Constants;
import eu.dnetlib.enabling.aas.utils.SpringUtils;


/**
 * Class for fetching security profiles and security policies into local exist db.
 * @author mhorst
 *
 */
public class ExistDbProfilesFetcher {
	
	public static final String TYPE_SECURITY_POLICY = "security-policy";
	public static final String TYPE_SECURITY_PROFILE = "security-profile";

	class ProfilesFilter implements java.io.FilenameFilter {

        public boolean accept(File dir, String name) {
        	return !name.equals(".svn");
        }
	}
	
	MockISStore mockISStore = null;
	
	public ExistDbProfilesFetcher() {
//		load spring configuration
		ApplicationContext ctx = SpringUtils.getSpringContext(SpringUtils.DEFAULT_TEST_RESOURCE);
		mockISStore = (MockISStore) ctx.getBean("MockISStoreService");
	}
	
	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, String profType) {
		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], profType);
			} else {
				System.out.println("Writing into exist db profile from file " + files[i].getAbsolutePath() + " ...");
				String resourceProfile = getFileContent(files[i]);
				String fileName = String.valueOf(System.currentTimeMillis());
				String fileColl = null;
				if (profType.equals(TYPE_SECURITY_POLICY))
					fileColl = A2Constants.IS_COLLECTION_SECPOLICY_PATH;
				else if (profType.equals(TYPE_SECURITY_PROFILE))
					fileColl = A2Constants.IS_COLLECTION_SECPROF_PATH;
				
				if (mockISStore.insertXML(fileName, fileColl, resourceProfile))
					System.out.println("Profile successfully written in file: "+fileName+"!");
				else
					System.out.println("Problems occured when writting profile!");
			}
		}
	}
	
	
	public static void main(String[] args) {
		if (args.length<2) {
			System.out.println("Bad parameters provided!");
			System.out.println("Valid parameters: profile-type ["+TYPE_SECURITY_POLICY+" | "+TYPE_SECURITY_PROFILE+"] " +
					"directory-with-profiles");
			return;
		}
		
		ExistDbProfilesFetcher fetcher = new ExistDbProfilesFetcher();
		String profType = args[0];
		
		if (profType.equals(TYPE_SECURITY_POLICY))
			System.out.println("Writing security policies into eXist db!");
		else if (profType.equals(TYPE_SECURITY_PROFILE)) 
			System.out.println("Writing security profiles into eXist db!");
		else {
			System.out.println("Unsupported profile type provided!");
			System.out.println("Valid profiles types: "+TYPE_SECURITY_POLICY+" or "+TYPE_SECURITY_PROFILE);
			return;
		}
		
		String rootDir = args[1];		
		File rootFile = new File(rootDir);

		if (rootFile.isDirectory()) {
			fetcher.processDirectory(rootFile,profType);
		} else {
			System.out.println("Bad directory with profiles!");
			return;
		}
		System.out.println("Profiles registration finished!");
	}

	public MockISStore getMockISStore() {
		return mockISStore;
	}
	
}
