/**
 * Copyright (C) 2009 eXo Platform SAS.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */

package org.exoplatform.dashboard.webui.component;

import javax.portlet.PortletMode;
import javax.portlet.PortletPreferences;

import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.portal.webui.workspace.UIPortalApplication;
import org.exoplatform.web.application.ApplicationMessage;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.application.portlet.PortletRequestContext;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIContainer;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.exception.MessageException;
import org.exoplatform.webui.form.UIForm;
import org.exoplatform.webui.form.UIFormStringInput;

@ComponentConfig(template = "system:/groovy/webui/form/UIForm.gtmpl", lifecycle = UIFormLifecycle.class, events = { @EventConfig(listeners = UIDashboardEditForm.SaveActionListener.class) })
public class UIDashboardEditForm extends UIForm {

    public static final String TOTAL_COLUMNS = "totalColumns";

    public static final int MAX_COLUMNS = 4;

    public static final int DEFAULT_COLUMNS = 3;

    public UIDashboardEditForm() {
        addUIFormInput(new UIFormStringInput(TOTAL_COLUMNS, TOTAL_COLUMNS, null));
    }

    public static class SaveActionListener extends EventListener<UIDashboardEditForm> {
        public final void execute(final Event<UIDashboardEditForm> event) throws Exception {
            UIDashboardEditForm uiForm = event.getSource();
            UIFormStringInput uiInput = uiForm.getUIStringInput(TOTAL_COLUMNS);

            String label = uiForm.getLabel(uiInput.getName());
            if (label == null) {
                label = uiInput.getName();
            }
            label = label.trim();
            if (label.charAt(label.length() - 1) == ':') {
                label = label.substring(0, label.length() - 1);
            }
            Object[] args = { label, String.valueOf(1), String.valueOf(MAX_COLUMNS) };

            PortletRequestContext pcontext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance();
            PortletPreferences pref = pcontext.getRequest().getPreferences();
            String lastValue = pref.getValue(TOTAL_COLUMNS, "" + DEFAULT_COLUMNS);

            if (uiInput.getValue() == null || uiInput.getValue().length() == 0) {
                uiInput.setValue(lastValue);
                throw new MessageException(new ApplicationMessage("EmptyFieldValidator.msg.empty-input", args));
            }

            int totalCols = 0;
            try {
                totalCols = Integer.parseInt(uiInput.getValue());
                if (totalCols < 1 || totalCols > MAX_COLUMNS)
                    throw new Exception();
            } catch (Exception e) {
                uiInput.setValue(lastValue);
                throw new MessageException(new ApplicationMessage("NumberRangeValidator.msg.Invalid-number", args));
            }

            UIDashboardContainer uiDashboardContainer = ((UIContainer) uiForm.getParent()).getChild(UIDashboard.class)
                    .getChild(UIDashboardContainer.class);
            uiDashboardContainer.setColumns(totalCols);
            uiDashboardContainer.save();
            if (Util.getUIPortalApplication().getModeState() == UIPortalApplication.NORMAL_MODE)
                pcontext.setApplicationMode(PortletMode.VIEW);
        }
    }
}
