package test;

import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;

import de.dfki.mycbr.core.DefaultCaseBase;
import de.dfki.mycbr.core.Project;
import de.dfki.mycbr.core.casebase.Instance;
import de.dfki.mycbr.core.model.Concept;
import de.dfki.mycbr.core.model.SymbolDesc;
import de.dfki.mycbr.core.retrieval.Retrieval;
import de.dfki.mycbr.core.retrieval.Retrieval.RetrievalMethod;
import de.dfki.mycbr.core.similarity.Similarity;
import de.dfki.mycbr.core.similarity.SymbolFct;
import de.dfki.mycbr.util.Pair;


public class MyCBRTest {

	public static void main (String[] args) {
		
		try {
			Project p = new Project();
			
			// Create Concept Car
			Concept car = p.createTopConcept("Car");
			
			// add symbol attribute
			HashSet<String> manufacturers = new HashSet<String>();
			String[] manufacturersArray = { "BMW", "Audi", "VW", "Ford",
					"Mercedes", "SEAT", "FIAT" };
			manufacturers.addAll(Arrays.asList(manufacturersArray));
			SymbolDesc manufacturerDesc = new SymbolDesc(car,"manufacturer",manufacturers);
			
			// add table function
			SymbolFct manuFct = manufacturerDesc.addSymbolFct("manuFct", true);
			manuFct.setSimilarity("BMW", "Audi", 0.60d);
			manuFct.setSimilarity("Audi", "VW", 0.20d);
			manuFct.setSimilarity("VW", "Ford", 0.40d);			

			// add cassebase
			DefaultCaseBase cb = p.createDefaultCB("myCaseBase");
			
			// add Case
			Instance i = car.addInstance("car1");
			Instance Instance1 = i;
			cb.addCase(Instance1);
			Instance1.addAttribute(manufacturerDesc,manufacturerDesc.getAttribute("BMW"));
			
			// set up query and retrieval
			Retrieval r = new Retrieval(car, cb);
			LinkedList<Double> results;

			i = car.addInstance("query");
			Instance q =  r.getQueryInstance();
			q.addAttribute(manufacturerDesc.getName(),manufacturerDesc.getAttribute("Audi"));
			
			r.setRetrievalMethod(RetrievalMethod.RETRIEVE_SORTED);
			r.start();
			
			List<Pair<Instance, Similarity>> result = r.getResult(); 
			results = printResult(result);


		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

	private static LinkedList<Double> printResult(List<Pair<Instance, Similarity>> result) {
		LinkedList<Double> sims = new LinkedList<Double>();
		for (Pair<Instance, Similarity> r : result) {
			System.out.println("\nSimilarity: " + r.getSecond().getValue()
					+ " to Instance: " + r.getFirst().getName());
			sims.add(r.getSecond().getValue());
		}
		return sims;
	}
}

