package com.sample;

import java.util.Calendar;
import java.util.GregorianCalendar;

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.io.ResourceFactory;
import org.drools.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.runtime.StatefulKnowledgeSession;

import account.SimpleAccount;

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

    public static final void main(String[] args) throws Exception {
	    // load up the knowledge base
	    KnowledgeBase kbase = readKnowledgeBase();
	    StatefulKnowledgeSession ksession = kbase
		    .newStatefulKnowledgeSession();
	    KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory
		    .newFileLogger(ksession, "datetest");

	    SimpleAccount account = getAccount();

	    System.out.println("Java date set to: " + account.getDateAccountOpened());

	    ksession.insert(account);

	    ksession.fireAllRules();
	    logger.close();
    }

    private static KnowledgeBase readKnowledgeBase() throws Exception {
	KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
		.newKnowledgeBuilder();
	kbuilder.add(ResourceFactory.newClassPathResource("DateTest.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;
    }

    private static SimpleAccount getAccount() {
	Calendar cal = getCalendar();

	SimpleAccount account = new SimpleAccount();
	account.setAccountNumber(100);
	account.setBalance(100);
	account.setBranchCode(100);
	account.setFrozen(false);
	account.setDateAccountOpened(cal.getTime());
	return account;
    }

    private static Calendar getCalendar() {
	Calendar cal = GregorianCalendar.getInstance();
	cal.set(Calendar.YEAR, 2011);
	cal.set(Calendar.MONTH, Calendar.FEBRUARY);
	cal.set(Calendar.DAY_OF_MONTH, 5);
	cal.set(Calendar.HOUR_OF_DAY, 0);
	cal.set(Calendar.MINUTE, 0);
	cal.set(Calendar.SECOND, 0);
	return cal;
    }

}