/**
 * The contents of this file are subject to the license and copyright
 * detailed in the LICENSE and NOTICE files at the root of the source
 * tree and available online at
 *
 * http://www.dspace.org/license/
 */
package org.dspace.app.xmlui.aspect.administrative.authorization;

import java.sql.SQLException;
import java.util.ArrayList;

import org.dspace.app.xmlui.cocoon.AbstractDSpaceTransformer;
import org.dspace.app.xmlui.wing.Message;
import org.dspace.app.xmlui.wing.WingException;
import org.dspace.app.xmlui.wing.element.Body;
import org.dspace.app.xmlui.wing.element.Division;
import org.dspace.app.xmlui.wing.element.Item;
import org.dspace.app.xmlui.wing.element.List;
import org.dspace.app.xmlui.wing.element.PageMeta;
import org.dspace.app.xmlui.wing.element.Text;
import org.dspace.content.Collection;
import org.dspace.content.Community;

/**
 * @author Alexey Maslov
 */
public class AuthorizationMain extends AbstractDSpaceTransformer   
{	
	private static final Message T_title = 
		message("xmlui.administrative.authorization.AuthorizationMain.title");
	private static final Message T_authorize_trail =
		message("xmlui.administrative.authorization.general.authorize_trail");
	
	private static final Message T_main_head =
		message("xmlui.administrative.authorization.AuthorizationMain.main_head");
	
	private static final Message T_actions_head =
		message("xmlui.administrative.authorization.AuthorizationMain.actions_head");
    private static final Message T_actions_item_lookup =
		message("xmlui.administrative.authorization.AuthorizationMain.actions_item_lookup");
    
    private static final Message T_bad_name =
		message("xmlui.administrative.authorization.AuthorizationMain.bad_name");
    private static final Message T_search_help =
		message("xmlui.administrative.authorization.AuthorizationMain.search_help");
    private static final Message T_submit_find =
		message("xmlui.administrative.authorization.AuthorizationMain.submit_find");
    
    private static final Message T_actions_advanced =
		message("xmlui.administrative.authorization.AuthorizationMain.actions_advanced");
    private static final Message T_actions_advanced_link =
		message("xmlui.administrative.authorization.AuthorizationMain.actions_advanced_link");
    
    private static final Message T_containerList_head =
		message("xmlui.administrative.authorization.AuthorizationMain.containerList_head");
    private static final Message T_containerList_para =
		message("xmlui.administrative.authorization.AuthorizationMain.containerList_para");
	
	private static final Message T_dspace_home =
		message("xmlui.general.dspace_home");
	
	private static final Message T_untitled =
		message("xmlui.general.untitled");
	
	
	
	public void addPageMeta(PageMeta pageMeta) throws WingException
    {
        pageMeta.addMetadata("title").addContent(T_title);
        pageMeta.addTrailLink(contextPath + "/", T_dspace_home);
        pageMeta.addTrailLink(contextPath + "/admin/authorize", T_authorize_trail);
    }
	
	public void addBody(Body body) throws WingException, SQLException 
	{
		/* Get and setup our parameters */
        String query = decodeFromURL(parameters.getParameter("query",null));
        String baseURL = contextPath+"/admin/epeople?administrative-continue="+knot.getId();
        
        String errorString = parameters.getParameter("errors",null);
		ArrayList<String> errors = new ArrayList<String>();
		if (errorString != null)
		{
			for (String error : errorString.split(","))
            {
                errors.add(error);
            }
		}
        
        Division main = body.addInteractiveDivision("authorization-main",contextPath+"/admin/authorize",Division.METHOD_POST,"primary administrative authorization");
		main.setHead(T_main_head);
		//main.addPara(T_main_para);		
		
		
		// DIVISION: authorization-actions
        Division actions = main.addDivision("authorization-actions");
        actions.setHead(T_actions_head);
        
        List actionsList = actions.addList("actions");
        actionsList.addLabel(T_actions_item_lookup);
        Item actionItem = actionsList.addItem();
        Text queryField = actionItem.addText("identifier");
        if (query != null)
        {
            queryField.setValue(query);
        }
        if (errors.contains("identifier"))
        {
            queryField.addError(T_bad_name);
        }
        queryField.setHelp(T_search_help);
        actionItem.addButton("submit_edit").setValue(T_submit_find);
        actionsList.addLabel(T_actions_advanced);
        actionsList.addItemXref(baseURL+"&submit_wildcard", T_actions_advanced_link);
		
        // DIVISION: authorization-containerList
        Division containers = main.addDivision("authorization-containerList");
        containers.setHead(T_containerList_head);
        containers.addPara(T_containerList_para);
        
        List containerList = containers.addList("containerList");
        this.containerListBuilder(baseURL,containerList,null);
        
		main.addHidden("administrative-continue").setValue(knot.getId());
	}
	
	
	/* A recursive helper method to build the community/collection hierarchy list */
	private void containerListBuilder (String baseURL, List parentList, Community currentCommunity) 
		throws SQLException, WingException
	{
		if (currentCommunity == null) {
			for (Community topLevel : Community.findAllTop(context)) {
				containerListBuilder(baseURL,parentList,topLevel);
			}
		}
		else {
			parentList.addItem().addHighlight("bold").addXref(baseURL+"&submit_edit&community_id="+currentCommunity.getID(), currentCommunity.getMetadata("name"));
			List containerSubList = null;
			for (Collection subCols : currentCommunity.getCollections()) 
			{
				if (containerSubList == null)
                {
                    containerSubList = parentList.addList("subList" + currentCommunity.getID());
                }
				String name = subCols.getMetadata("name");
				if (name == null || name.length() == 0)
                {
                    containerSubList.addItemXref(baseURL + "&submit_edit&collection_id=" + subCols.getID(), T_untitled);
                }
				else
                {
                    containerSubList.addItemXref(baseURL + "&submit_edit&collection_id=" + subCols.getID(), name);
                }
        	}
			for (Community subComs : currentCommunity.getSubcommunities()) 
			{
				if (containerSubList == null)
                {
                    containerSubList = parentList.addList("subList" + currentCommunity.getID());
                }
				containerListBuilder(baseURL,containerSubList,subComs);
			}
		}
	}
	
	
	
	
	
	
	
}
