/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.apache.camel.test.cdi;

import org.apache.camel.cdi.CdiCamelExtension;
import org.jboss.weld.config.ConfigurationKey;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
import org.junit.runners.model.TestClass;

final class CamelCdiDeployment implements TestRule {

    private final CamelCdiContext context;

    private final Weld weld;

    CamelCdiDeployment(TestClass test, CamelCdiContext context) {
        this.context = context;

        weld = new Weld()
            // TODO: check parallel execution
            .containerId("camel-context-cdi")
            .property(ConfigurationKey.RELAXED_CONSTRUCTION.get(), true)
            .enableDiscovery()
            .beanClasses(test.getJavaClass().getDeclaredClasses())
            .addBeanClass(test.getJavaClass())
            .addExtension(new CdiCamelExtension());

        // Apply deployment customization provided by the @Beans annotation
        // if present on the test class
        if (test.getJavaClass().isAnnotationPresent(Beans.class)) {
            Beans beans = test.getJavaClass().getAnnotation(Beans.class);
            weld.addExtension(new CamelCdiTestExtension(beans));
            for (Class<?> alternative : beans.alternatives()) {
                weld.addBeanClass(alternative)
                    .addAlternative(alternative);
            }
            for (Class<?> clazz : beans.classes()) {
                weld.addBeanClass(clazz);
            }
            weld.addPackages(false, beans.packages());
        }
    }

    @Override
    public Statement apply(final Statement base, Description description) {
        return new Statement() {

            @Override
            public void evaluate() throws Throwable {
                WeldContainer container = weld.initialize();
                context.setBeanManager(container.getBeanManager());
                try {
                    base.evaluate();
                } finally {
                    container.shutdown();
                    context.unsetBeanManager();
                }
            }
        };
    }
}
