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;

public class EditTitleAction extends TitleAction {

	/* The Logger */
	private static final Logger logger = Logger.getLogger(EditTitleAction.class);
	
	private static final String ERROR_UNMAPPEDFILES_LISTFAILURE
		= "error.title.unmappedFiles.listFailure";
	
	private static final String FORWARD_EDIT_FORM = "edit";
	private static final String FORWARD_SAVE_SUCCESS = "success";

	public ActionForward edit(ActionMapping actionMapping, ActionForm actionForm,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		TitleForm form = (TitleForm) actionForm;
		
		populateForm(form, false);

		populateFormListOptions(form, request);
		
		return actionMapping.findForward(FORWARD_EDIT_FORM);
	}

	public ActionForward save(ActionMapping actionMapping, ActionForm actionForm,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		TitleForm form = (TitleForm) actionForm;
		try {
			Title dbTitle = TitleFacade.findTitle(form.getId());
		
			save(form, dbTitle);
		} catch (ValidationException ve) {
			logger.error("The title failed validation.", 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.populateFormListOptions(form, request);
			return actionMapping.findForward(FORWARD_EDIT_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);
			
			populateFormListOptions(form, request);
			return actionMapping.findForward(FORWARD_EDIT_FORM);
		}
		
		return actionMapping.findForward(FORWARD_SAVE_SUCCESS);
	}

	private void populateFormListOptions(TitleForm form, HttpServletRequest request) throws Exception {
		form.setTypes(TitleFacade.getSpecifications());
		form.setAssetDBs(TitleFacade.getTitleProviderInstances(form.getType()));

		//if this title is editable, set unmappedFiles
		if(form.isEditable()) {
			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);
		}
	}
}
