/**
 * 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.platform.gadgets.services;

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

import org.exoplatform.application.gadget.Gadget;
import org.exoplatform.application.gadget.GadgetRegistryService;
import org.exoplatform.application.registry.ApplicationCategory;
import org.exoplatform.application.registry.ApplicationRegistryService;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.container.component.RequestLifeCycle;
import org.exoplatform.container.xml.InitParams;
import org.exoplatform.portal.config.UserACL;
import org.exoplatform.portal.config.model.ApplicationType;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.picocontainer.Startable;

/**
 * @author <a href="mailto:anouar.chattouna@exoplatform.com">Anouar
 *         Chattouna</a>
 * @version $Revision$
 */
public class PopulateGadgetRegisryService implements Startable {

  private static final String DEFAULT_GADGETS_CATEGORY_NAME = "Gadgets";
  private static String CATEGORY_NAME;
  private static String GADGETS_CATEGORY_ACCESS_PERMISSION;
  private static final Log LOG = ExoLogger.getExoLogger(PopulateGadgetRegisryService.class);
  private GadgetRegistryService gadgetRegistryService = null;
  private ApplicationRegistryService applicationRegistryService = null;
  private List<Gadget> gadgets;

  public PopulateGadgetRegisryService(GadgetRegistryService gadgetRegistryService,
      ApplicationRegistryService applicationRegistryService, InitParams initParams) {
    CATEGORY_NAME = initParams.getValueParam("gadgetsCategoryName").getValue();
    if (CATEGORY_NAME == null) {
      CATEGORY_NAME = DEFAULT_GADGETS_CATEGORY_NAME;
      LOG.warn("Failed to retrieve " + initParams.getValueParam("gadgetsCategoryName").getName()
          + " init param. Default category name will be used: " + DEFAULT_GADGETS_CATEGORY_NAME);
    }
    GADGETS_CATEGORY_ACCESS_PERMISSION = initParams.getValueParam("gadgetsCategoryAccessPermission").getValue();
    if (GADGETS_CATEGORY_ACCESS_PERMISSION == null) {
      GADGETS_CATEGORY_ACCESS_PERMISSION = UserACL.EVERYONE;
      LOG.warn("Failed to retrieve " + initParams.getValueParam("gadgetsCategoryAccessPermission").getName()
          + " init param. Default access permission will be used: " + UserACL.EVERYONE);
    }
    gadgets = initParams.getObjectParamValues(Gadget.class);
    this.gadgetRegistryService = gadgetRegistryService;
    this.applicationRegistryService = applicationRegistryService;
  }

  /**
   * Saves the gadget read from configuration file in the appropriate
   * application category.
   */
  public void start() {
    for (Gadget gadget : gadgets) {
      RequestLifeCycle.begin(PortalContainer.getInstance());
      try {
        // save the gadget via the GadgetRegistryService
        // check if the gadget was saved elsewhere
        if (gadgetRegistryService.getGadget(gadget.getName()) == null) {
          gadgetRegistryService.saveGadget(gadget);
        }
        ArrayList<String> permissions = new ArrayList<String>();
        String[] permissionEntry = GADGETS_CATEGORY_ACCESS_PERMISSION.split(",");
        for (String entry : permissionEntry) {
          permissions.add(entry);
        }
        // creates the registry application
        org.exoplatform.application.registry.Application registryApplication = new org.exoplatform.application.registry.Application();
        registryApplication.setApplicationName(gadget.getName());
        registryApplication.setType(ApplicationType.GADGET);
        registryApplication.setDisplayName(gadget.getTitle());
        registryApplication.setContentId(gadget.getName());
        String description = (gadget.getDescription() == null || gadget.getDescription().length() < 1) ? gadget.getName()
            : gadget.getDescription();
        registryApplication.setDescription(description);
        registryApplication.setAccessPermissions(permissions);
        registryApplication.setCategoryName(CATEGORY_NAME);
        if (applicationRegistryService.getApplicationCategory(CATEGORY_NAME) == null) {
          // creates the application category
          ApplicationCategory category = new ApplicationCategory();
          category.setName(CATEGORY_NAME);
          category.setDisplayName(CATEGORY_NAME);
          category.setDescription(CATEGORY_NAME);
          category.setAccessPermissions(permissions);
          applicationRegistryService.save(category, registryApplication);
        } else {
          applicationRegistryService.save(applicationRegistryService.getApplicationCategory(CATEGORY_NAME), registryApplication);
        }
      } catch (Exception e) {
        LOG.error("Error while saving gadget: " + gadget.getName() + " with " + CATEGORY_NAME + " application category. ", e);
        throw new RuntimeException(e);
      } finally {
        RequestLifeCycle.end();
      }
    }
  }

  public void stop() {}

}
