package com.sample;

import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.definition.type.FactType;
import org.drools.io.ResourceFactory;
import org.drools.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.runtime.StatefulKnowledgeSession;

/**
 * This is a sample class to launch a rule.
 */
public class DroolsTest {

	public static final void main(String[] args) throws Exception {

		// load up the knowledge base
		KnowledgeBase kbase = readKnowledgeBase();
		StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

		// go !
		FactType rateType = kbase.getFactType( "com.sample", "Rate" );
		FactType saleType = kbase.getFactType( "com.sample", "Sale" );

		{
			Object rate = rateType.newInstance();
			rateType.set( rate, "minUnits", 0 );
			rateType.set( rate, "maxUnits", 1000 );
			rateType.set( rate, "revenuePercent", 10 );
			ksession.insert(rate);
		}
		{
			Object rate = rateType.newInstance();
			rateType.set( rate, "minUnits", 1001 );
			rateType.set( rate, "maxUnits", 2000 );
			rateType.set( rate, "revenuePercent", 20 );
			ksession.insert(rate);
		}
		{
			Object sale = saleType.newInstance();
			saleType.set( sale, "units", 500 );
			ksession.insert(sale);
		}
		{
			Object sale = saleType.newInstance();
			saleType.set( sale, "units", 1500 );
			ksession.insert(sale);
		}
		
		ksession.fireAllRules();
	}

	private static KnowledgeBase readKnowledgeBase() throws Exception {
		KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
		kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), ResourceType.DRL);
		KnowledgeBuilderErrors errors = kbuilder.getErrors();
		if (errors.size() > 0) {
			for (KnowledgeBuilderError error: errors) {
				System.err.println(error);
			}
			throw new IllegalArgumentException("Could not parse knowledge.");
		}
		KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
		kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
		return kbase;
	}

}