/***************************************************************************
 * Copyright (C) 2003-2010 eXo Platform SAS.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Affero General Public License
 * as published by the Free Software Foundation; either version 3
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see<http://www.gnu.org/licenses/>.
 ***************************************************************************/
package org.exoplatform.forum.webui.popup;

import java.util.ArrayList;
import java.util.List;

import org.exoplatform.forum.ForumUtils;
import org.exoplatform.forum.service.PruneSetting;
import org.exoplatform.forum.webui.BaseForumForm;
import org.exoplatform.forum.webui.UIForumPortlet;
import org.exoplatform.ks.common.webui.BaseEventListener;
import org.exoplatform.ks.common.webui.UIPopupContainer;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIPopupComponent;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.Event.Phase;
import org.exoplatform.webui.form.UIFormCheckBoxInput;

/**
 * Created by The eXo Platform SAS
 * Author : Vu Duy Tu
 *          tu.duy@exoplatform.com
 * Jan 29, 2010 - 4:51:01 AM  
 */

@ComponentConfig(
    lifecycle = UIFormLifecycle.class,
    template = "app:/templates/forum/webui/popup/UIAutoPruneForm.gtmpl",
    events = {
      @EventConfig(listeners = UIAutoPruneForm.PruneSettingActionListener.class),
      @EventConfig(listeners = UIAutoPruneForm.RunPruneActionListener.class),
      @EventConfig(listeners = UIAutoPruneForm.ActivatePruneActionListener.class),
      @EventConfig(listeners = UIAutoPruneForm.CloseActionListener.class, phase = Phase.DECODE)
    }
)
@SuppressWarnings("unused")
public class UIAutoPruneForm extends BaseForumForm implements UIPopupComponent {
  private List<PruneSetting> listPruneSetting = new ArrayList<PruneSetting>();

  public UIAutoPruneForm() {
  }

  public void activate() throws Exception {
  }

  public void deActivate() throws Exception {
  }

  @SuppressWarnings("unchecked")
  private List<PruneSetting> getPruneSettings() throws Exception {
    listPruneSetting = new ArrayList<PruneSetting>();
    try {
      UIFormCheckBoxInput<Boolean> isActiveBBcode;
      for (PruneSetting pruneSetting : getForumService().getAllPruneSetting()) {
        listPruneSetting.add(pruneSetting);
        isActiveBBcode = getUIFormCheckBoxInput(getForumIdOfPrune(pruneSetting));
        if (isActiveBBcode == null) {
          isActiveBBcode = new UIFormCheckBoxInput<Boolean>(getForumIdOfPrune(pruneSetting), getForumIdOfPrune(pruneSetting), false);
          addUIFormInput(isActiveBBcode);
        }
        isActiveBBcode.setChecked(pruneSetting.isActive());
      }
    } catch (Exception e) {
      log.error("failed to get prune settings", e);
    }
    return listPruneSetting;
  }

  private String getForumIdOfPrune(PruneSetting pruneSetting) {
    String id = pruneSetting.getForumPath();
    return (ForumUtils.isEmpty(id)) ? ForumUtils.EMPTY_STR : id.substring(id.lastIndexOf(ForumUtils.SLASH));
  }

  private PruneSetting getPruneSetting(String forumId) throws Exception {
    for (PruneSetting prune : listPruneSetting) {
      if (prune.getForumPath().indexOf(forumId) > 0)
        return prune;
    }
    return new PruneSetting();
  }

  static public class RunPruneActionListener extends BaseEventListener<UIAutoPruneForm> {
    public void onEvent(Event<UIAutoPruneForm> event, UIAutoPruneForm uiForm, final String pruneId) throws Exception {
      PruneSetting pruneSetting = uiForm.getPruneSetting(pruneId);
      if (pruneSetting.getInActiveDay() == 0) {
        warning("UIAutoPruneForm.sms.not-set-activeDay");
        return;
      } else {
        UIPopupContainer popupContainer = uiForm.getAncestorOfType(UIPopupContainer.class);
        UIRunPruneForm pruneForm = uiForm.openPopup(popupContainer, UIRunPruneForm.class, 200, 0);
        pruneForm.setPruneSetting(pruneSetting);
      }
    }
  }

  static public class ActivatePruneActionListener extends BaseEventListener<UIAutoPruneForm> {
    public void onEvent(Event<UIAutoPruneForm> event, UIAutoPruneForm uiForm, final String pruneId) throws Exception {
      PruneSetting pruneSetting = uiForm.getPruneSetting(pruneId);
      boolean isActive = uiForm.getUIFormCheckBoxInput(pruneId).isChecked();
      if (pruneSetting.getInActiveDay() == 0) {
        UIPopupContainer popupContainer = uiForm.getAncestorOfType(UIPopupContainer.class);
        UIAutoPruneSettingForm pruneSettingForm = uiForm.openPopup(popupContainer, UIAutoPruneSettingForm.class, 525, 0);
        pruneSettingForm.setPruneSetting(pruneSetting);
        pruneSettingForm.setActivate(isActive);
      } else {
        pruneSetting.setActive(isActive);
        uiForm.getForumService().savePruneSetting(pruneSetting);
      }
      event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getAncestorOfType(UIForumPortlet.class));
    }
  }

  static public class PruneSettingActionListener extends BaseEventListener<UIAutoPruneForm> {
    public void onEvent(Event<UIAutoPruneForm> event, UIAutoPruneForm uiForm, final String pruneId) throws Exception {
      UIPopupContainer popupContainer = uiForm.getAncestorOfType(UIPopupContainer.class);
      UIAutoPruneSettingForm pruneSettingForm = uiForm.openPopup(popupContainer, UIAutoPruneSettingForm.class, 525, 0);
      PruneSetting pruneSetting = uiForm.getPruneSetting(pruneId);
      pruneSettingForm.setPruneSetting(pruneSetting);
    }
  }

  static public class CloseActionListener extends BaseEventListener<UIAutoPruneForm> {
    public void onEvent(Event<UIAutoPruneForm> event, UIAutoPruneForm uiForm, String objId) throws Exception {
      UIForumPortlet forumPortlet = uiForm.getAncestorOfType(UIForumPortlet.class);
      forumPortlet.cancelAction();
    }
  }
}
