/**
 * 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.portal.config;

import java.util.Arrays;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.TimeZone;

import org.exoplatform.container.PortalContainer;
import org.exoplatform.portal.config.model.Application;
import org.exoplatform.portal.config.model.Container;
import org.exoplatform.portal.config.model.ModelObject;
import org.exoplatform.portal.config.model.Page;
import org.exoplatform.portal.config.model.PortalConfig;
import org.exoplatform.portal.mop.SiteKey;
import org.exoplatform.portal.mop.Visibility;
import org.exoplatform.portal.mop.navigation.NavigationContext;
import org.exoplatform.portal.mop.navigation.NavigationService;
import org.exoplatform.portal.mop.navigation.NodeContext;
import org.exoplatform.portal.mop.navigation.NodeModel;
import org.exoplatform.portal.mop.navigation.Scope;
import org.exoplatform.portal.mop.page.PageContext;
import org.exoplatform.portal.mop.page.PageService;
import org.exoplatform.portal.pom.config.POMSession;
import org.exoplatform.portal.pom.config.POMSessionManager;

/**
 * Created by The eXo Platform SARL Author : Tung Pham thanhtungty@gmail.com Nov 13, 2007
 */
public class TestLoadedPOM extends AbstractConfigTest {

    /** . */
    private UserPortalConfigService portalConfigService;

    /** . */
    private DataStorage storage;

    /** . */
    private PageService pageService;

    /** . */
    private POMSessionManager mgr;

    /** . */
    private POMSession session;

    /** . */
    private NavigationService navService;

    public TestLoadedPOM(String name) {
        super(name);
    }

    public void setUp() throws Exception {
        super.setUp();
        begin();
        PortalContainer container = getContainer();
        portalConfigService = (UserPortalConfigService) container.getComponentInstanceOfType(UserPortalConfigService.class);
        storage = (DataStorage) container.getComponentInstanceOfType(DataStorage.class);
        pageService = (PageService) container.getComponentInstanceOfType(PageService.class);
        mgr = (POMSessionManager) container.getComponentInstanceOfType(POMSessionManager.class);
        navService = (NavigationService) container.getComponentInstanceOfType(NavigationService.class);
        session = mgr.openSession();
    }

    protected void tearDown() throws Exception {
        session.close();
        end();
        super.tearDown();
    }

    public void testLegacyGroupWithNormalizedName() throws Exception {
        SiteKey key = SiteKey.group("/test/legacy");
        NavigationContext nav = navService.loadNavigation(key);
        assertNotNull(nav);
        NodeContext<?> root = navService.loadNode(NodeModel.SELF_MODEL, nav, Scope.ALL, null);
        NodeContext<?> node = root.get(0);
        assertEquals(SiteKey.group("/test/legacy").page("register"), node.getState().getPageRef());

        Page page = storage.getPage("group::/test/legacy::register");
        assertNotNull(page);
        assertEquals("group::/test/legacy::register", page.getPageId());
        assertEquals("/test/legacy", page.getOwnerId());
    }

    public void testGroupWithNormalizedName() throws Exception {
        SiteKey key = SiteKey.group("/test/normalized");
        NavigationContext nav = navService.loadNavigation(key);
        assertNotNull(nav);
        NodeContext<?> root = navService.loadNode(NodeModel.SELF_MODEL, nav, Scope.ALL, null);
        NodeContext<?> node = root.get(0);
        assertEquals(SiteKey.group("/test/normalized").page("register"), node.getState().getPageRef());

        Page page = storage.getPage("group::/test/normalized::register");
        assertNotNull(page);
        assertEquals("group::/test/normalized::register", page.getPageId());
        assertEquals("/test/normalized", page.getOwnerId());
    }

    public void testNavigation() throws Exception {
        SiteKey key = SiteKey.portal("test");
        NavigationContext nav = navService.loadNavigation(key);
        assertNotNull(nav);

        //
        assertEquals(1, (int) nav.getState().getPriority());

        //
        NodeContext<?> root = navService.loadNode(NodeModel.SELF_MODEL, nav, Scope.ALL, null);
        assertEquals(5, root.getNodeCount());

        //
        NodeContext<?> nodeNavigation = root.get(0);
        assertEquals(0, nodeNavigation.getNodeCount());
        assertEquals("node_name", nodeNavigation.getName());
        assertEquals("node_label", nodeNavigation.getState().getLabel());
        assertEquals("node_icon", nodeNavigation.getState().getIcon());
        GregorianCalendar start = new GregorianCalendar(2000, 2, 21, 1, 33, 0);
        start.setTimeZone(TimeZone.getTimeZone("UTC"));
        assertEquals(start.getTime().getTime(), nodeNavigation.getState().getStartPublicationTime());
        GregorianCalendar end = new GregorianCalendar(2009, 2, 21, 1, 33, 0);
        end.setTimeZone(TimeZone.getTimeZone("UTC"));
        assertEquals(end.getTime().getTime(), nodeNavigation.getState().getEndPublicationTime());
        assertEquals(Visibility.TEMPORAL, nodeNavigation.getState().getVisibility());
    }

    public void testPortal() throws Exception {
        PortalConfig portal = storage.getPortalConfig("test");
        assertNotNull(portal);

        assertEquals("test", portal.getName());
        assertEquals("en", portal.getLocale());
        assertTrue(Arrays.equals(new String[] { "test_access_permissions" }, portal.getAccessPermissions()));
        assertEquals("test_edit_permission", portal.getEditPermission());
        assertEquals("test_skin", portal.getSkin());
        assertEquals("test_prop_value", portal.getProperty("prop_key"));
    }

    public void testPageWithoutPageId() throws Exception {
        Page page = storage.getPage("portal::test::test2");
        assertNotNull(page);
        assertEquals("portal::test::test2", page.getPageId());
        assertEquals("test", page.getOwnerId());
        assertEquals("portal", page.getOwnerType());
        assertEquals("test2", page.getName());
    }

    public void testPage() throws Exception {
        Page page = storage.getPage("portal::test::test1");
        assertNotNull(page);

        PageContext pageContext = pageService.loadPage(page.getPageKey());
        assertNotNull(pageContext);

        //
        assertEquals("test_title", pageContext.getState().getDisplayName());
        assertEquals("test_factory_id", pageContext.getState().getFactoryId());
        assertEquals(Arrays.<String> asList("test_access_permissions"), pageContext.getState().getAccessPermissions());
        assertEquals("test_edit_permission", pageContext.getState().getEditPermission());
        assertEquals(true, pageContext.getState().getShowMaxWindow());

        //
        List<ModelObject> children = page.getChildren();
        assertEquals(2, children.size());

        //
        Container container1 = (Container) children.get(0);
        assertEquals("container_1", container1.getName());
        assertEquals("container_1_title", container1.getTitle());
        assertEquals("container_1_icon", container1.getIcon());
        assertEquals("container_1_template", container1.getTemplate());
        assertTrue(Arrays.equals(new String[] { "container_1_access_permissions" }, container1.getAccessPermissions()));
        assertEquals("container_1_factory_id", container1.getFactoryId());
        assertEquals("container_1_description", container1.getDescription());
        assertEquals("container_1_width", container1.getWidth());
        assertEquals("container_1_height", container1.getHeight());

        //
        Application application1 = (Application) children.get(1);
        assertEquals("application_1_theme", application1.getTheme());
        assertEquals("application_1_title", application1.getTitle());
        assertTrue(Arrays.equals(new String[] { "application_1_access_permissions" }, application1.getAccessPermissions()));
        assertEquals(true, application1.getShowInfoBar());
        assertEquals(true, application1.getShowApplicationState());
        assertEquals(true, application1.getShowApplicationMode());
        assertEquals("application_1_description", application1.getDescription());
        assertEquals("application_1_icon", application1.getIcon());
        assertEquals("application_1_width", application1.getWidth());
        assertEquals("application_1_height", application1.getHeight());
        // assertEquals("portal#test:/web/BannerPortlet/banner", application1.getInstanceState().getWeakReference());
    }
}
