package org.greenstone.gatherer.remote;

import java.io.*;
import java.util.zip.*;


/**
 */
public class ZipCollectionConfigurations
{
    static public void main(String[] args)
    {
	if (args.length != 4) {
	    System.err.println("Usage: ZipCollectionConfigurations <zip-file> <collect-directory-path> <user-name> <user-groups>");
	    return;
	}

	String zip_file_path = args[0];
	String collect_directory_path = args[1];
	String user_name = args[2];
	String user_groups = args[3];

	if (!collect_directory_path.endsWith(File.separator)) {
	    collect_directory_path += File.separator;
	}
	File collect_directory = new File(collect_directory_path);

 	try {
	    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zip_file_path));
	    ZipTools.ZipFilter collection_etc_zip_filter = new CollectionEtcZipFilter();
	    ZipTools.ZipFilter collection_metadata_zip_filter = new CollectionMetadataZipFilter();

	    // Add the etc and metadata directories from each of the collections the user has access to
	    File[] collection_directories = collect_directory.listFiles();
	    for (int i = 0; i < collection_directories.length; i++) {
		if (collection_directories[i].isDirectory()) {
		    String collection_name = collection_directories[i].getName();
		    if (checkAccess(collection_name, user_name, user_groups)) {
			String etc_relative_path = collection_directories[i].getName() + File.separator + "etc";
			ZipTools.addFileToZip(zos, collect_directory_path, etc_relative_path, collection_etc_zip_filter);

			// The "metadata" directory may not exist (non-GLI collections)
			String metadata_relative_path = collection_directories[i].getName() + File.separator + "metadata";
			File metadata_directory = new File(collect_directory_path + File.separator + metadata_relative_path);
			if (metadata_directory.exists()) {
			    ZipTools.addFileToZip(zos, collect_directory_path, metadata_relative_path, collection_metadata_zip_filter);
			}
		    }
		}
	    }

	    zos.putNextEntry(new ZipEntry(".gli"));
	    zos.close();
	}
	catch (Exception exception) {
	    exception.printStackTrace();
	}
    }


    static private boolean checkAccess(String collection_name, String user_name, String user_groups)
    {
	String[] user_groups_array = user_groups.split(",");
	for (int i = 0; i < user_groups_array.length; i++) {
	    if (user_groups_array[i].equals("all-collections-editor")) {
		return true;
	    }
	    if (user_groups_array[i].equals("personal-collections-editor") && collection_name.startsWith(user_name + "-")) {
		return true;
	    }
	    if (user_groups_array[i].equals(collection_name + "-collection-editor")) {
		return true;
	    }
	}

	return false;
    }


    static private class CollectionEtcZipFilter
	extends ZipTools.NullZipFilter
    {
	public boolean shouldIncludeFile(String relative_file_path)
	{
	    // Only collect.cfg files are included
	    return (relative_file_path.equals("collect.cfg") || relative_file_path.endsWith(File.separator + "collect.cfg"));
	}
    }


    static private class CollectionMetadataZipFilter
	extends ZipTools.NullZipFilter
    {
	public boolean shouldIncludeFileContent(String relative_file_path)
	{
	    // We don't include content for any of the metadata set files
	    return false;
	}
    }
}
