/*
 * Copyright 2016 Red Hat, Inc. and/or its affiliates.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.kie.aries.blueprint.factorybeans;

import org.kie.api.KieBase;
import org.kie.api.builder.ReleaseId;
import org.kie.api.definition.KiePackage;
import org.kie.api.definition.process.Process;
import org.kie.api.definition.rule.Query;
import org.kie.api.definition.rule.Rule;
import org.kie.api.definition.type.FactType;
import org.kie.api.event.kiebase.KieBaseEventListener;
import org.kie.api.runtime.Environment;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.KieSessionConfiguration;
import org.kie.api.runtime.StatelessKieSession;
import org.kie.aries.blueprint.namespace.BlueprintContextHelper;

import java.util.Collection;
import java.util.Set;

public class KieBaseResolver extends AbstractKieObjectsResolver implements KieBase {

    private final String id;

    private KieBase kieBase;

    public KieBaseResolver( ReleaseId releaseId, String id ) {
        super( releaseId );
        this.id = id;
    }

    @Override
    public Object init(BlueprintContextHelper context ) {
        return getKieBase();
    }

    private synchronized KieBase getKieBase() {
        if (kieBase == null) {
            kieBase = resolveKBase( id, releaseId );
        }
        return kieBase;
    }

    @Override
    public Collection<KiePackage> getKiePackages() {
        return getKieBase().getKiePackages();
    }

    @Override
    public KiePackage getKiePackage( String packageName ) {
        return getKieBase().getKiePackage( packageName );
    }

    @Override
    public void removeKiePackage( String packageName ) {
        getKieBase().removeKiePackage( packageName );
    }

    @Override
    public Rule getRule( String packageName, String ruleName ) {
        return getKieBase().getRule( packageName, ruleName );
    }

    @Override
    public void removeRule( String packageName, String ruleName ) {
        getKieBase().removeRule( packageName, ruleName );
    }

    @Override
    public Query getQuery( String packageName, String queryName ) {
        return getKieBase().getQuery( packageName, queryName );
    }

    @Override
    public void removeQuery( String packageName, String queryName ) {
        getKieBase().removeQuery( packageName, queryName );
    }

    @Override
    public void removeFunction( String packageName, String functionName ) {
        getKieBase().removeFunction( packageName, functionName );
    }

    @Override
    public FactType getFactType( String packageName, String typeName ) {
        return getKieBase().getFactType( packageName, typeName );
    }

    @Override
    public Process getProcess( String processId ) {
        return getKieBase().getProcess( processId );
    }

    @Override
    public void removeProcess( String processId ) {
        getKieBase().removeProcess( processId );
    }

    @Override
    public Collection<Process> getProcesses() {
        return getKieBase().getProcesses();
    }

    @Override
    public KieSession newKieSession( KieSessionConfiguration conf, Environment environment ) {
        return getKieBase().newKieSession(conf, environment);
    }

    @Override
    public KieSession newKieSession() {
        return getKieBase().newKieSession();
    }

    @Override
    public Collection<? extends KieSession> getKieSessions() {
        return getKieBase().getKieSessions();
    }

    @Override
    public StatelessKieSession newStatelessKieSession( KieSessionConfiguration conf ) {
        return getKieBase().newStatelessKieSession(conf);
    }

    @Override
    public StatelessKieSession newStatelessKieSession() {
        return getKieBase().newStatelessKieSession();
    }

    @Override
    public Set<String> getEntryPointIds() {
        return getKieBase().getEntryPointIds();
    }

    @Override
    public void addEventListener( KieBaseEventListener listener ) {
        getKieBase().addEventListener( listener );
    }

    @Override
    public void removeEventListener( KieBaseEventListener listener ) {
        getKieBase().removeEventListener( listener );
    }

    @Override
    public Collection<KieBaseEventListener> getKieBaseEventListeners() {
        return getKieBase().getKieBaseEventListeners();
    }
}