package ${package}.flux.modules.actions.group;

/*
 * Copyright 2001-2017 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License")
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import org.apache.commons.configuration.Configuration;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.fulcrum.security.entity.Group;
import org.apache.fulcrum.security.util.EntityExistsException;
import org.apache.fulcrum.security.util.UnknownEntityException;
import org.apache.fulcrum.yaafi.framework.util.StringUtils;
import org.apache.turbine.annotation.TurbineConfiguration;
import org.apache.turbine.annotation.TurbineService;
import org.apache.turbine.pipeline.PipelineData;
import org.apache.turbine.services.security.SecurityService;
import org.apache.turbine.util.RunData;
import org.apache.velocity.context.Context;

import ${package}.flux.modules.actions.FluxAction;

/**
 * Action to manage groups in Turbine.
 * 
 */
public class FluxGroupAction extends FluxAction {

	private static Log log = LogFactory.getLog(FluxGroupAction.class);
	private static String GROUP_ID = "group";

	/** Injected service instance */
	@TurbineService
	private SecurityService security;

	/** Injected configuration instance */
	@TurbineConfiguration
	private Configuration conf;

	/**
	 * ActionEvent responsible for inserting a new user into the Turbine security
	 * system.
	 * 
	 * @param data
	 *            Turbine information.
	 * @param context
	 *            Context for web pages.
	 * @exception Exception
	 *                a generic exception.
	 */
	public void doInsert(PipelineData pipelineData, Context context) throws Exception {
		RunData data = getRunData(pipelineData);

		String name = data.getParameters().getString(GROUP_ID);
		if (!StringUtils.isEmpty(name)) {

			try {
				// create the group
				Group group = security.getGroupInstance();
				group.setName(name);
				security.addGroup(group);
			} catch (EntityExistsException eee) {

				context.put("name", name);
				context.put("errorTemplate", "group,GroupAlreadyExists.vm");

				/*
				 * We are still in insert mode. So keep this value alive.
				 */
				data.getParameters().add("mode", "insert");
				setTemplate(data, "group,GroupForm.vm");
			} catch (Exception e) {
				log.error("Something bad happened");
			}
		} else {
			log.error("Cannot add empty group name");
		}

	}

	/**
	 * Update a group name
	 * 
	 * @param data
	 *            Turbine information.
	 * @param context
	 *            Context for web pages.
	 * @exception Exception
	 *                a generic exception.
	 */
	public void doUpdate(PipelineData pipelineData, Context context) throws Exception {
		RunData data = getRunData(pipelineData);
		String groupName = data.getParameters().getString("oldName");
		if (!StringUtils.isEmpty(groupName)) {
			Group group = security.getGroupByName(groupName);
			String name = data.getParameters().getString(GROUP_ID);
			if (group != null && !StringUtils.isEmpty(name)) {
				try {
					security.renameGroup(group, name);
				} catch (UnknownEntityException uee) {
					/*
					 * Should do something here but I still think we should use the an id so that
					 * this can't happen.
					 */
				}
			} else {
				log.error("Cannot update group to empty name");
			}
		} else {
			log.error("Cannot update group to empty name");
		}
	}

	/**
	 * ActionEvent responsible for removing a user.
	 * 
	 * @param data
	 *            Turbine information.
	 * @param context
	 *            Context for web pages.
	 * @exception Exception
	 *                a generic exception.
	 */
	public void doDelete(PipelineData pipelineData, Context context) throws Exception {

		RunData data = getRunData(pipelineData);

		try {
			Group group = security.getGroupByName(data.getParameters().getString(GROUP_ID));
			if ( group != null ) {
				security.removeGroup(group);
			} else {
				data.setMessage("Could not find group to remove");
			}
		} catch (UnknownEntityException uee) {
			/*
			 * Should do something here but I still think we should use the an id so that
			 * this can't happen.
			 */
			log.error(uee);
		}
	}

	/**
	 * Implement this to add information to the context.
	 *
	 * @param data
	 *            Turbine information.
	 * @param context
	 *            Context for web pages.
	 * @exception Exception
	 *                a generic exception.
	 */
	public void doPerform(PipelineData pipelineData, Context context) throws Exception {
		RunData data = getRunData(pipelineData);
		log.info("Running do perform!");
		data.setMessage("Can't find the requested action!");
	}
}
