/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.stanbol.enhancer.engines.celi.classification.impl;

import static junit.framework.Assert.assertEquals;
import static org.apache.stanbol.enhancer.servicesapi.rdf.Properties.DC_LANGUAGE;
import static org.apache.stanbol.enhancer.test.helper.EnhancementStructureHelper.validateAllTopicAnnotations;
import static org.junit.Assert.assertTrue;

import java.io.IOException;
import java.net.UnknownHostException;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.Hashtable;

import org.apache.clerezza.rdf.core.LiteralFactory;
import org.apache.clerezza.rdf.core.Resource;
import org.apache.clerezza.rdf.core.UriRef;
import org.apache.clerezza.rdf.core.impl.PlainLiteralImpl;
import org.apache.clerezza.rdf.core.impl.TripleImpl;
import org.apache.stanbol.enhancer.contentitem.inmemory.InMemoryContentItemFactory;
import org.apache.stanbol.enhancer.engines.celi.CeliConstants;
import org.apache.stanbol.enhancer.engines.celi.testutils.MockComponentContext;
import org.apache.stanbol.enhancer.engines.celi.testutils.TestUtils;
import org.apache.stanbol.enhancer.servicesapi.ContentItem;
import org.apache.stanbol.enhancer.servicesapi.ContentItemFactory;
import org.apache.stanbol.enhancer.servicesapi.EngineException;
import org.apache.stanbol.enhancer.servicesapi.EnhancementEngine;
import org.apache.stanbol.enhancer.servicesapi.impl.StringSource;
import org.apache.stanbol.enhancer.servicesapi.rdf.Properties;
import org.apache.stanbol.enhancer.test.helper.EnhancementStructureHelper;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.osgi.service.cm.ConfigurationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class CeliClassificationEnhancementEngineTest {
	
	static CeliClassificationEnhancementEngine classificationEngine = new CeliClassificationEnhancementEngine();

	private static final ContentItemFactory ciFactory = InMemoryContentItemFactory.getInstance();
	
	private static final Logger log = LoggerFactory.getLogger(CeliClassificationEnhancementEngine.class);
	
	private static final String TEXT = "Brigitte Bardot, née  le 28 septembre " +
			"1934 à Paris, est une actrice de cinéma et chanteuse française.";

	@BeforeClass
	public static void setUpServices() throws IOException, ConfigurationException {
		Dictionary<String, Object> properties = new Hashtable<String, Object>();
		properties.put(EnhancementEngine.PROPERTY_NAME, "celiClassification");
		properties.put(CeliConstants.CELI_TEST_ACCOUNT, "true");
	    properties.put(CeliClassificationEnhancementEngine.SERVICE_URL, "http://linguagrid.org/LSGrid/ws/dbpedia-classification");
	 	
		MockComponentContext context = new MockComponentContext(properties);
		classificationEngine.activate(context);
	}

	@AfterClass
	public static void shutdownServices() {
		classificationEngine.deactivate(null);
	}

	public static ContentItem wrapAsContentItem(final String text) throws IOException {
		return ciFactory.createContentItem(new StringSource(text));
	}

	@Test
	public void tesetEngine() throws Exception {
		ContentItem ci = wrapAsContentItem(TEXT);
		try {
	        //add a simple triple to statically define the language of the test
            //content
            ci.getMetadata().add(new TripleImpl(ci.getUri(), DC_LANGUAGE, new PlainLiteralImpl("fr")));
            //unit test should not depend on each other (if possible)
            //CeliLanguageIdentifierEnhancementEngineTest.addEnanchements(ci);
    			
			classificationEngine.computeEnhancements(ci);

	        TestUtils.logEnhancements(ci);
	         HashMap<UriRef,Resource> expectedValues = new HashMap<UriRef,Resource>();
	            expectedValues.put(Properties.ENHANCER_EXTRACTED_FROM, ci.getUri());
	            expectedValues.put(Properties.DC_CREATOR, LiteralFactory.getInstance().createTypedLiteral(
	                classificationEngine.getClass().getName()));

			int textAnnoNum = EnhancementStructureHelper.validateAllTextAnnotations(ci.getMetadata(), TEXT,expectedValues);
			assertEquals("Only a single fise:TextAnnotation is expeted", 1, textAnnoNum);
			int numTopicAnnotations = validateAllTopicAnnotations(ci.getMetadata()  , expectedValues);
			assertTrue("No TpocisAnnotations found", numTopicAnnotations > 0);
		} catch (EngineException e) {
			if (e.getCause() != null && e.getCause() instanceof UnknownHostException) {
				log.warn("Celi Service not reachable -> offline? -> deactivate test");
				return;
			}
			throw e;
		}
	}

}
