package com.matrixbi.utils;

import java.io.IOException;
import java.io.Serializable;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;

import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieRepository;
import org.kie.api.builder.Message.Level;
import org.kie.api.io.KieResources;
import org.kie.api.io.Resource;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.StatelessKieSession;

public class KieSessionFactory implements Serializable {

	private static final long serialVersionUID = 1385358191849318526L;
	
	
	static StatelessKieSession statelessKieSession;

	public static StatelessKieSession getKieSession(String filename) {
		if (statelessKieSession == null)
			statelessKieSession = getNewKieSession(filename);
		
		return statelessKieSession;
	}

	public String readFile(String filename, Charset encoding) {
		String res = "";
		try {
			byte[] encoded = Files.readAllBytes(Paths.get(filename));
			res = new String(encoded, encoding);
		} catch (IOException e) {
			System.out.println("Error reading rules file " + filename);
			e.printStackTrace();
		}
		return res;
	}

	public static StatelessKieSession getNewKieSession(String drlFileName) {
		KieServices kieServices = KieServices.Factory.get();
		
		KieResources kieResources = kieServices.getResources();
		KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
		KieRepository kieRepository = kieServices.getRepository();

		Resource resource = kieResources.newFileSystemResource(drlFileName);
		kieFileSystem.write(resource);

		KieBuilder kb = kieServices.newKieBuilder(kieFileSystem);

		kb.buildAll();

		if (kb.getResults().hasMessages(Level.ERROR)) {
			throw new RuntimeException("Build Errors:\n" + kb.getResults().toString());
		}

		KieContainer kContainer = kieServices.newKieContainer(kieRepository.getDefaultReleaseId());
		
		return kContainer.newStatelessKieSession();
	}
}