package com.tandbergtv.watchpoint.pmm.web.actions.title;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

import com.tandbergtv.watchpoint.pmm.entities.Title;
import com.tandbergtv.watchpoint.pmm.util.validation.ValidationException;
import com.tandbergtv.watchpoint.pmm.util.validation.ValidationMessage;
import com.tandbergtv.watchpoint.pmm.web.formbeans.title.TitleForm;
import com.tandbergtv.watchpoint.pmm.web.util.HTMLOption;
import com.tandbergtv.watchpoint.pmm.web.util.TitleFacade;
import com.tandbergtv.watchpoint.pmm.web.util.TitleHelper;

public class CreateTitleAction extends TitleAction {
	private static final Logger logger = Logger.getLogger(CreateTitleAction.class);

	private static final String ERROR_UNMAPPEDFILES_LISTFAILURE
		= "error.title.unmappedFiles.listFailure";
	
	private static final String FORWARD_CREATE_FORM = "create";
	private static final String FORWARD_SAVE_SUCCESS = "success";

	public ActionForward create(ActionMapping actionMapping, ActionForm actionForm,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		TitleForm form = (TitleForm) actionForm;
		
		// Initialize the list options that show for the form
		this.initializeListOptions(form, request);

		//if there are any types
		if(form.getTypes() != null && !form.getTypes().isEmpty()) {
			//if no type selected, set selected type = first type
			if(form.getType() == null)
				form.setType(form.getTypes().get(0).getValue());
			
			//fill title data based on type
			form.setTitlesData(TitleHelper.getTitlesDataForSpec(form.getType()));
		}
		
		return actionMapping.findForward(FORWARD_CREATE_FORM);
	}
	
	public ActionForward save(ActionMapping actionMapping, ActionForm actionForm,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		TitleForm form = (TitleForm) actionForm;

		try {
			Title newEmptyTitle = TitleFacade.createTitlesForSpecification(form.getType());
		
			save(form, newEmptyTitle);
		} catch (ValidationException ve) {
			List<ValidationMessage> validationMessages = ve.getValidationMessages();
			ActionMessages actionMessages = new ActionMessages();
			for (ValidationMessage message : validationMessages) {
				String key = message.getCode();
				Object[] values = message.getProperties().toArray();
				ActionMessage actionMessage = new ActionMessage(key, values);
				actionMessages.add("Title Validation", actionMessage);
			}

			this.saveMessages(request, actionMessages);
			this.initializeListOptions(form, request);
			return actionMapping.findForward(FORWARD_CREATE_FORM);
		} catch(Exception e) {
			logger.error("Failed to save the title", e);

			//add the exception message to error messages
			ActionMessages errors = new ActionMessages();
			errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(e.getMessage(), false));
			addErrors(request, errors);

			initializeListOptions(form, request);
			return actionMapping.findForward(FORWARD_CREATE_FORM);
		}

		return actionMapping.findForward(FORWARD_SAVE_SUCCESS);
	}

	/* Set the form list options */
	private void initializeListOptions(TitleForm form, HttpServletRequest request) {
		//set the specifications
		form.setTypes(TitleFacade.getSpecifications());

		//set unmappedFiles
		List<HTMLOption> unmappedFiles = new ArrayList<HTMLOption>(0);
		try {
			unmappedFiles = TitleFacade.getUnmappedFiles(); 
		} catch(Exception e) {
			logger.error("Exception while getting list of unmapped assets", e);
			
			//add to validation messages
			ActionMessages actionMessages = new ActionMessages();
			ActionMessage actionMessage = new ActionMessage(ERROR_UNMAPPEDFILES_LISTFAILURE);
			actionMessages.add(ActionMessages.GLOBAL_MESSAGE, actionMessage);
			addErrors(request, actionMessages);
		}
		form.setUnmappedFiles(unmappedFiles);
	}
}
