package org.appfuse.webapp.action;

import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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.Role;
import org.appfuse.model.User;
import org.appfuse.model.Weblog;
import org.appfuse.service.Manager;
import org.appfuse.webapp.form.WeblogForm;

/**
 * Action class to handle CRUD on a Weblog object
 *
 * @struts.action name="weblogForm" path="/weblogs" scope="request"
 *  validate="false" parameter="method" input="mainMenu"
 * @struts.action name="weblogForm" path="/editWeblog" scope="request"
 *  validate="false" parameter="method" input="list"
 * @struts.action name="weblogForm" path="/saveWeblog" scope="request"
 *  validate="true" parameter="method" input="edit"
 * 
 * @struts.action-forward name="edit" path="/WEB-INF/pages/weblogForm.jsp"
 * @struts.action-forward name="list" path="/WEB-INF/pages/weblogList.jsp"
 * @struts.action-forward name="search" path="/weblogs.html" redirect="true"
 */
public final class WeblogAction extends BaseAction {
    public ActionForward cancel(ActionMapping mapping, ActionForm form,
                                HttpServletRequest request,
                                HttpServletResponse response)
    throws Exception {
        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");
        }

        ActionMessages messages = new ActionMessages();
        WeblogForm weblogForm = (WeblogForm) form;

        // Exceptions are caught by ActionExceptionHandler
        Manager mgr = (Manager) getBean("manager");
        mgr.removeObject(Weblog.class, Long.valueOf(weblogForm.getWeblogId()));

        messages.add(ActionMessages.GLOBAL_MESSAGE,
                     new ActionMessage("weblog.deleted"));

        // save messages in session, so they'll survive the redirect
        saveMessages(request.getSession(), messages);

        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");
        }

        WeblogForm weblogForm = (WeblogForm) form;

        // if an id is passed in, look up the user - otherwise
        // don't do anything - user is doing an add
        if (weblogForm.getWeblogId() != null) {
            Manager mgr = (Manager) getBean("manager");
            Weblog weblog = (Weblog) mgr.getObject(Weblog.class, Long.valueOf(weblogForm.getWeblogId()));
            weblogForm = (WeblogForm) convert(weblog);
            convertLists(weblogForm);
            updateFormBean(mapping, request, weblogForm);
        }

        return mapping.findForward("edit");
    }

    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();
        WeblogForm weblogForm = (WeblogForm) form;
        boolean isNew = ("".equals(weblogForm.getWeblogId()) || weblogForm.getWeblogId() == null);

        Manager mgr = (Manager) getBean("manager");
        Weblog weblog = (Weblog) convert(weblogForm);

        convertLists(weblog);

        mgr.saveObject(weblog);

        // add success messages
        if (isNew) {
            messages.add(ActionMessages.GLOBAL_MESSAGE,
                         new ActionMessage("weblog.added"));

            // save messages in session to survive a redirect
            saveMessages(request.getSession(), messages);

            return mapping.findForward("search");
        } else {
            messages.add(ActionMessages.GLOBAL_MESSAGE,
                         new ActionMessage("weblog.updated"));
            saveMessages(request.getSession(), messages);
            
            convertLists(weblogForm);
            updateFormBean(mapping, request, weblogForm);
            
            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");
        }

        Manager mgr = (Manager) getBean("manager");
        request.setAttribute(Constants.WEBLOG_LIST, mgr.getObjects(Weblog.class));

        return mapping.findForward("list");
    }

    public ActionForward unspecified(ActionMapping mapping, ActionForm form,
                                     HttpServletRequest request,
                                     HttpServletResponse response)
            throws Exception {
        return search(mapping, form, request, response);
    }
}
