/*******************************************************************************
 * Copyright (c) 2010-2014 SAP AG and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.skalli.services.extension;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.skalli.commons.CollectionUtils;
import org.eclipse.skalli.model.EntityBase;
import org.eclipse.skalli.model.Project;
import org.eclipse.skalli.model.User;
import org.eclipse.skalli.testutil.AssertUtils;
import org.eclipse.skalli.testutil.BundleManager;
import org.eclipse.skalli.testutil.TestExtension;
import org.eclipse.skalli.testutil.TestExtension1;
import org.eclipse.skalli.testutil.TestExtensionService;
import org.eclipse.skalli.testutil.TestExtensionService1;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.ServiceRegistration;

@SuppressWarnings("nls")
public class PropertyLookupTest {

    private List<ServiceRegistration<?>> serviceRegistrations = new ArrayList<ServiceRegistration<?>>();

    @Before
    public void setup() throws Exception {
        serviceRegistrations.add(BundleManager.registerService(ExtensionService.class,  new TestExtensionService(), null));
        serviceRegistrations.add(BundleManager.registerService(ExtensionService.class,  new TestExtensionService1(), null));
        Assert.assertEquals(2, serviceRegistrations.size());
    }

    @After
    public void tearDown() {
        for (ServiceRegistration<?> serviceRegistration : serviceRegistrations) {
            serviceRegistration.unregister();
        }
    }

    private static final String PREFIX = "testext.";
    private static final String PREFIX1 = "testext1.";
    private static final String USER_PREFIX = "user.";

    @Test
    public void testMapMethods() throws Exception {
        Project project = createProject();
        Map<String,Object> props = new HashMap<String,Object>();
        props.put("userId", "hugo");
        PropertyLookup lookup = new PropertyLookup(project, props);

        Assert.assertFalse(lookup.isEmpty());
        Set<String> expectedKeys = CollectionUtils.asSet(
                EntityBase.PROPERTY_UUID, EntityBase.PROPERTY_DELETED, EntityBase.PROPERTY_PARENT_ENTITY,
                EntityBase.PROPERTY_PARENT_ENTITY_ID, EntityBase.PROPERTY_LAST_MODIFIED,
                EntityBase.PROPERTY_LAST_MODIFIED_MILLIS,
                EntityBase.PROPERTY_LAST_MODIFIED_BY, EntityBase.PROPERTY_FIRST_CHILD,
                EntityBase.PROPERTY_NEXT_SIBLING,
                Project.PROPERTY_PROJECTID, Project.PROPERTY_NAME, Project.PROPERTY_SHORT_NAME,
                Project.PROPERTY_DESCRIPTION_FORMAT, Project.PROPERTY_DESCRIPTION, Project.PROPERTY_TEMPLATEID,
                Project.PROPERTY_PARENT_PROJECT, Project.PROPERTY_LOGO_URL, Project.PROPERTY_PHASE,
                Project.PROPERTY_REGISTERED,
                PREFIX + EntityBase.PROPERTY_UUID, PREFIX + EntityBase.PROPERTY_DELETED,
                PREFIX + EntityBase.PROPERTY_PARENT_ENTITY, PREFIX + EntityBase.PROPERTY_PARENT_ENTITY_ID,
                PREFIX + EntityBase.PROPERTY_LAST_MODIFIED, PREFIX + EntityBase.PROPERTY_LAST_MODIFIED_MILLIS,
                PREFIX + EntityBase.PROPERTY_LAST_MODIFIED_BY,
                PREFIX + EntityBase.PROPERTY_FIRST_CHILD, PREFIX + EntityBase.PROPERTY_NEXT_SIBLING,
                PREFIX + TestExtension.PROPERTY_BOOL, PREFIX + TestExtension.PROPERTY_ITEMS,
                PREFIX + TestExtension.PROPERTY_STR,
                PREFIX1 + EntityBase.PROPERTY_UUID, PREFIX1 + EntityBase.PROPERTY_DELETED,
                PREFIX1 + EntityBase.PROPERTY_PARENT_ENTITY, PREFIX1 + EntityBase.PROPERTY_PARENT_ENTITY_ID,
                PREFIX1 + EntityBase.PROPERTY_LAST_MODIFIED, PREFIX1 + EntityBase.PROPERTY_LAST_MODIFIED_MILLIS,
                PREFIX1 + EntityBase.PROPERTY_LAST_MODIFIED_BY,
                PREFIX1 + EntityBase.PROPERTY_FIRST_CHILD, PREFIX1 + EntityBase.PROPERTY_NEXT_SIBLING,
                PREFIX1 + TestExtension.PROPERTY_BOOL, PREFIX1 + TestExtension.PROPERTY_ITEMS,
                PREFIX1 + TestExtension.PROPERTY_STR,
                "userId");
        Assert.assertEquals(expectedKeys.size(), lookup.size());
        AssertUtils.assertEqualsAnyOrder("keySet", expectedKeys, lookup.keySet());

        Assert.assertEquals("hugo", lookup.get("userId"));
        assertProjectLookup(lookup);
    }

    @Test
    public void testPutAll() {
        Project project = createProject();
        User user = createUser();
        Map<String,Object> props = new HashMap<String,Object>();
        props.put(User.PROPERTY_USERID, user.getUserId());
        PropertyLookup lookup = new PropertyLookup(props);
        lookup.putAllProperties(project, "");
        lookup.putAllProperties(user, USER_PREFIX);

        assertProjectLookup(lookup);
        Assert.assertEquals(user.getUserId(), lookup.get(User.PROPERTY_USERID));
        Assert.assertEquals(user.getUserId(), lookup.get(USER_PREFIX + User.PROPERTY_USERID));
        Assert.assertEquals(user.getFirstname(), lookup.get(USER_PREFIX + User.PROPERTY_FIRSTNAME));
        Assert.assertEquals(user.getLastname(), lookup.get(USER_PREFIX + User.PROPERTY_LASTNAME));
        Assert.assertEquals(user.getEmail(), lookup.get(USER_PREFIX + User.PROPERTY_EMAIL));
    }

    @SuppressWarnings("unchecked")
    private void assertProjectLookup(PropertyLookup lookup) {
        Assert.assertEquals("bla.blubb", lookup.get(Project.PROPERTY_PROJECTID));
        Assert.assertEquals("Blubber", lookup.get(Project.PROPERTY_NAME));
        Assert.assertEquals("text", lookup.get(Project.PROPERTY_DESCRIPTION_FORMAT));
        Assert.assertEquals("foobar", lookup.get(PREFIX + TestExtension.PROPERTY_STR));
        Assert.assertEquals("hubab", lookup.get(PREFIX1 + TestExtension.PROPERTY_STR));
        AssertUtils.assertEquals("get", (List<String>)lookup.get(PREFIX + TestExtension.PROPERTY_ITEMS), "a", "b", "c");
        AssertUtils.assertEquals("get", (List<String>)lookup.get(PREFIX + TestExtension.PROPERTY_ITEMS), "a", "b", "c");
        Assert.assertTrue(((List<String>)lookup.get(PREFIX1 + TestExtension1.PROPERTY_ITEMS)).isEmpty());
        Assert.assertNull(lookup.get(Project.PROPERTY_DESCRIPTION));
        Assert.assertNull(lookup.get("testext.abc"));
        Assert.assertNull(lookup.get(null));
        Assert.assertNull(lookup.get(""));
    }

    @Test
    public void testLookUp() throws Exception {
        Project project = createProject();
        Map<String,Object> props = new HashMap<String,Object>();
        props.put("userId", "hugo");
        PropertyLookup lookup = new PropertyLookup(project, props);
        Assert.assertEquals("bla.blubb", lookup.lookup(Project.PROPERTY_PROJECTID));
        Assert.assertEquals("Blubber", lookup.lookup(Project.PROPERTY_NAME));
        Assert.assertEquals("foobar", lookup.lookup("testext." + TestExtension.PROPERTY_STR));
        Assert.assertEquals("a,b,c", lookup.lookup("testext." + TestExtension.PROPERTY_ITEMS));
        Assert.assertEquals("hugo", lookup.lookup("userId"));
        Assert.assertNull(lookup.lookup(Project.PROPERTY_DESCRIPTION));
        Assert.assertNull(lookup.lookup("testext.abc"));
        Assert.assertNull(lookup.lookup(null));
        Assert.assertNull(lookup.lookup(""));
    }

    @Test
    public void testLookUpNoProject() throws Exception {
        Map<String,Object> props = new HashMap<String,Object>();
        props.put("userId", "hugo");
        PropertyLookup lookup = new PropertyLookup(null, props);
        Assert.assertEquals("hugo", lookup.lookup("userId"));
        Assert.assertNull(lookup.lookup(Project.PROPERTY_PROJECTID));
        Assert.assertNull(lookup.lookup("testext.abc"));
        Assert.assertNull(lookup.lookup(null));
        Assert.assertNull(lookup.lookup(""));
    }

    @Test
    public void testLookUpNoCustomProps() throws Exception {
        Project project = createProject();
        PropertyLookup lookup = new PropertyLookup(project);
        Assert.assertNull(lookup.lookup("userId"));
        Assert.assertEquals("bla.blubb", lookup.lookup(Project.PROPERTY_PROJECTID));
        Assert.assertNull(lookup.lookup("testext.abc"));
        Assert.assertNull(lookup.lookup(null));
        Assert.assertNull(lookup.lookup(""));
    }

    private Project createProject() {
        Project project = new Project("bla.blubb", null, "Blubber");
        TestExtension ext = new TestExtension();
        ext.setStr("foobar");
        ext.addItem("a");
        ext.addItem("b");
        ext.addItem("c");
        project.addExtension(ext);
        TestExtension1 ext1 = new TestExtension1();
        ext1.setStr("hubab");
        project.addExtension(ext1);
        return project;
    }

    private User createUser() {
        return new User("homer", "Homer", "Simpson", "homer@springfield.org");
    }
}
