package org.drools.examples;

import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.Reader;

import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.StatefulSession;
import org.drools.audit.WorkingMemoryFileLogger;
import org.drools.compiler.PackageBuilder;
import org.drools.event.DebugAgendaEventListener;
import org.drools.event.DebugWorkingMemoryEventListener;
import org.drools.rule.Package;

/**
 * This is a sample file to launch a rule package from a rule source file.
 */
public class HelloWorldExample {
    public static final void main(final String[] args) throws Exception {

        //read in the source
        final Reader source = new InputStreamReader(new FileInputStream("Str.drl"));

        final PackageBuilder builder = new PackageBuilder();

        //this wil parse and compile in one step
        builder.addPackageFromDrl(source);

        // Check the builder for errors
        if (builder.hasErrors()) {
            System.out.println(builder.getErrors().toString());
            throw new RuntimeException("Unable to compile \"HelloWorld.drl\".");
        }

        //get the compiled package (which is serializable)
        final Package pkg = builder.getPackage();

        //add the package to a rulebase (deploy the rule package).
        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
        ruleBase.addPackage(pkg);

        final StatefulSession session = ruleBase.newStatefulSession();

        session.addEventListener(new DebugAgendaEventListener());
        session.addEventListener(new DebugWorkingMemoryEventListener());

        final WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger(session);
        logger.setFileName("log/helloworld");

        final Message message = new Message();
        message.setMessage("Hello World");
        message.setStatus(Message.HELLO);
        first x = new first();
        x.setMsg("Hello World");
        second y = new second();
        y.setFir(x);
        message.setSec(y);
        session.insert(message);

        session.fireAllRules();

//        logger.writeToDisk();

        session.dispose();
    }

    public static class first {
        private String msg;

        public String getMsg() {
            return msg;
        }

        public void setMsg(String msg) {
            this.msg = msg;
        }
    }

    public static class second {
        private first fir;

        public first getFir() {
            return fir;
        }

        public void setFir(first fir) {
            this.fir = fir;
        }

    }

    public static class Message {
        public static final int HELLO = 0;
        public static final int GOODBYE = 1;

        private String message;
        private int status;
        private second sec;

        public Message() {

        }

        public String getMessage() {
            return this.message;
        }

        public void setMessage(final String message) {
            this.message = message;
        }

        public int getStatus() {
            return this.status;
        }

        public void setStatus(final int status) {
            this.status = status;
        }

        public second getSec() {
            return sec;
        }

        public void setSec(second sec) {
            this.sec = sec;
        }
    }

}
