package org.appfuse.webapp.action;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.Globals;
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 org.appfuse.Constants;
import org.appfuse.model.Template;
import org.appfuse.service.LookupManager;
import org.appfuse.service.TemplateManager;
import org.appfuse.webapp.form.TemplateForm;


/**
 * Implementation of <strong>Action</strong> that interacts with the {@link
 * TemplateForm} and retrieves values. It interacts with the {@link
 * TemplateManager} to retrieve/persist values to the database.
 *
 * <p>
 * <a href="TemplateAction.java.html"><i>View Source</i></a>
 * </p>
 *
 * @author <a href="mailto:[email protected]">Matt Raible</a>
 * @version $Revision: 1.1 $ $Date: 2004/03/31 13:04:24 $
 *
 * @struts.action name="templateForm" path="/viewTemplates" scope="request"
 *  validate="false" parameter="action" input="mainMenu" roles="admin"
 *
 * @struts.action name="templateForm" path="/editTemplate" scope="request"
 *  validate="false" parameter="action" input="list" roles="admin"
 *
 * @struts.action name="templateForm" path="/saveTemplate" scope="request"
 *  validate="true" parameter="action" input="edit" roles="admin"
 *
 * @struts.action-forward name="list" path=".templateList"
 * @struts.action-forward name="edit" path=".templateDetail"
 * @struts.action-forward name="search" path="/editTemplate.do?action=Search"
 *  redirect="true"
 */
public final class TemplateAction extends BaseAction {
    private Log log = LogFactory.getLog(TemplateAction.class);

    public ActionForward cancel(ActionMapping mapping, ActionForm form,
                                HttpServletRequest request,
                                HttpServletResponse response)
    throws Exception {
        if (log.isDebugEnabled()) {
            log.debug("Entering 'cancel' method");
        }

        if ("contact".equalsIgnoreCase(request.getParameter("from"))) {
            // route to contact edit screen
            ActionForward edit = mapping.findForward("editContact");
            ActionForward next =
                new ActionForward(edit.getPath() + "?id=" +
                                  request.getParameter("contactId"), true);

            if (log.isDebugEnabled()) {
                log.debug("next: " + next.getPath());
            }

            return next;
        }

        return mapping.findForward("search");
    }

    public ActionForward delete(ActionMapping mapping, ActionForm form,
                                HttpServletRequest request,
                                HttpServletResponse response)
    throws Exception {
        if (log.isDebugEnabled()) {
            log.debug("Entering 'delete' method");
        }

        // Extract attributes and parameters we will need
        ActionMessages messages = new ActionMessages();
        TemplateForm templateForm = (TemplateForm) form;

        // Exceptions are caught by ActionExceptionHandler
        TemplateManager mgr = (TemplateManager) getBean("templateManager");
        mgr.removeTemplate(convert(templateForm));

        messages.add(ActionMessages.GLOBAL_MESSAGE,
                     new ActionMessage("template.deleted",
                                       templateForm.getName()));

        //saveMessages(request, messages);
        request.getSession(false).setAttribute(Globals.MESSAGE_KEY, messages);

        // return a forward to the next page
        return mapping.findForward("search");
    }

    public ActionForward edit(ActionMapping mapping, ActionForm form,
                              HttpServletRequest request,
                              HttpServletResponse response)
    throws Exception {
        if (log.isDebugEnabled()) {
            log.debug("Entering 'edit' method");
        }

        TemplateForm templateForm = (TemplateForm) form;

        // check for user doing an add
        if (templateForm.getId() == null) {
            return mapping.findForward("edit");
        }

        if (log.isDebugEnabled()) {
            log.debug("getting templateId: " + templateForm.getId());
        }

        TemplateManager mgr = (TemplateManager) getBean("templateManager");
        Template template = (Template) mgr.getTemplate(templateForm.getId());
        templateForm = (TemplateForm) convert(template);

        request.setAttribute(Constants.TEMPLATE_KEY, templateForm);

        // return a forward to next page
        return mapping.findForward("edit");
    }

    /**
     * This method is for previewing the template with an existing position
     * and contact.
     *
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    public ActionForward preview(ActionMapping mapping, ActionForm form,
                                 HttpServletRequest request,
                                 HttpServletResponse response)
    throws Exception {
        if (log.isDebugEnabled()) {
            log.debug("Entering 'preview' method");
        }

        // return a forward to next page
        return new ActionForward("/previewTemplate?name=" +
                                 request.getParameter("name"));
    }

    public ActionForward save(ActionMapping mapping, ActionForm form,
                              HttpServletRequest request,
                              HttpServletResponse response)
    throws Exception {
        if (log.isDebugEnabled()) {
            log.debug("Entering 'save' method");
        }

        // Extract attributes and parameters we will need
        ActionMessages messages = new ActionMessages();
        TemplateForm templateForm = (TemplateForm) form;
        boolean isNew = ("".equals(templateForm.getId()));

        // Exceptions are caught by ActionExceptionHandler
        TemplateManager mgr = (TemplateManager) getBean("templateManager");
        mgr.saveTemplate(convert(templateForm));
        
        // add success messages
        if (isNew) {
            messages.add(ActionMessages.GLOBAL_MESSAGE,
                         new ActionMessage("template.added",
                                           templateForm.getName()));
            request.getSession().setAttribute(Globals.MESSAGE_KEY, messages);

            return mapping.findForward("search");
        } else {
            messages.add(ActionMessages.GLOBAL_MESSAGE,
                         new ActionMessage("template.updated",
                                           templateForm.getName()));
            request.getSession().setAttribute(Globals.MESSAGE_KEY, messages);
            request.setAttribute(Constants.TEMPLATE_KEY, templateForm);
            
            return mapping.findForward("edit");
        }
    }

    public ActionForward search(ActionMapping mapping, ActionForm form,
                                HttpServletRequest request,
                                HttpServletResponse response)
    throws Exception {
        if (log.isDebugEnabled()) {
            log.debug("Entering 'search' method");
        }

        LookupManager mgr = (LookupManager) getBean("lookupManager");
        List templates = mgr.getTemplates();

        if (log.isDebugEnabled()) {
            log.debug("updating templateList in servlet context");
        }

        servlet.getServletContext().setAttribute(Constants.TEMPLATE_LIST,
                                                 templates);
        request.setAttribute(Constants.TEMPLATE_LIST, templates);
        
        // templates are already in application scope
        // return a forward to the template list
        return mapping.findForward("list");
    }
}