/*
 * 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.apache.karaf.cellar.log.internal.osgi;

import org.apache.karaf.cellar.core.ClusterManager;
import org.apache.karaf.cellar.core.Producer;
import org.apache.karaf.cellar.core.command.CommandStore;
import org.apache.karaf.cellar.core.command.ExecutionContext;
import org.apache.karaf.cellar.core.event.EventHandler;
import org.apache.karaf.cellar.core.event.EventProducer;
import org.apache.karaf.cellar.log.*;
import org.apache.karaf.cellar.log.management.internal.CellarLogMBeanImpl;
import org.apache.karaf.log.core.LogService;
import org.apache.karaf.util.tracker.BaseActivator;
import org.apache.karaf.util.tracker.annotation.ProvideService;
import org.apache.karaf.util.tracker.annotation.RequireService;
import org.apache.karaf.util.tracker.annotation.Services;
import org.ops4j.pax.logging.spi.PaxAppender;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.cm.ConfigurationAdmin;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Hashtable;

@Services(
        provides = {
                @ProvideService(PaxAppender.class),
                @ProvideService(EventHandler.class)
        },
        requires = {
                @RequireService(ClusterManager.class),
                @RequireService(EventProducer.class),
                @RequireService(CommandStore.class),
                @RequireService(ExecutionContext.class),
                @RequireService(ConfigurationAdmin.class),
                @RequireService(LogService.class)
        }
)
public class Activator extends BaseActivator {

    private final static Logger LOGGER = LoggerFactory.getLogger(Activator.class);

    private ServiceRegistration mbeanRegistration;

    @Override
    public void doStart() throws Exception {
        LOGGER.debug("CELLAR LOG: retrieve cluster manager service");
        ClusterManager clusterManager = getTrackedService(ClusterManager.class);
        if (clusterManager == null) {
            return;
        }

        LOGGER.debug("CELLAR LOG: retrieve producer service");
        EventProducer producer = getTrackedService(EventProducer.class);
        if (producer == null) {
            return;
        }

        LOGGER.debug("CELLAR LOG: retrieve command store service");
        CommandStore commandStore = getTrackedService(CommandStore.class);
        if (commandStore == null) {
            return;
        }

        LOGGER.debug("CELLAR LOG: retrieve execution context service");
        ExecutionContext executionContext = getTrackedService(ExecutionContext.class);
        if (executionContext == null) {
            return;
        }

        LOGGER.debug("CELLAR LOG: retrieve configuration admin service");
        ConfigurationAdmin configurationAdmin = getTrackedService(ConfigurationAdmin.class);
        if (configurationAdmin == null) {
            return;
        }

        LOGGER.debug("CELLAR LOG: retrieve log service");
        LogService logService = getTrackedService(LogService.class);
        if (logService == null) {
            return;
        }

        LOGGER.debug("CELLAR LOG: init PaxAppender");
        LogAppender paxAppender = new LogAppender();
        paxAppender.setClusterManager(clusterManager);
        Hashtable props = new Hashtable();
        props.put("org.ops4j.pax.logging.appender.name", "CellarLogAppender");
        register(PaxAppender.class, paxAppender, props);

        LOGGER.debug("CELLAR LOG: register get log command handler");
        GetLogCommandHandler getLogCommandHandler = new GetLogCommandHandler();
        getLogCommandHandler.setProducer(producer);
        getLogCommandHandler.setConfigurationAdmin(configurationAdmin);
        getLogCommandHandler.setLogService(logService);
        register(EventHandler.class, getLogCommandHandler);

        LOGGER.debug("CELLAR LOG: register get log result handler");
        GetLogResultHandler getLogResultHandler = new GetLogResultHandler();
        getLogResultHandler.setCommandStore(commandStore);
        register(EventHandler.class, getLogResultHandler);

        LOGGER.debug("CELLAR LOG: register set log command handler");
        SetLogCommandHandler setLogCommandHandler = new SetLogCommandHandler();
        setLogCommandHandler.setProducer(producer);
        setLogCommandHandler.setConfigurationAdmin(configurationAdmin);
        setLogCommandHandler.setLogService(logService);
        register(EventHandler.class, setLogCommandHandler);

        LOGGER.debug("CELLAR LOG: register set log result handler");
        SetLogResultHandler setLogResultHandler = new SetLogResultHandler();
        setLogResultHandler.setCommandStore(commandStore);
        register(EventHandler.class, setLogResultHandler);

        LOGGER.debug("CELLAR LOG: registre MBean");
        CellarLogMBeanImpl mbean = new CellarLogMBeanImpl();
        mbean.setClusterManager(clusterManager);
        mbean.setExecutionContext(executionContext);
        props = new Hashtable();
        props.put("jmx.objectname", "org.apache.karaf.cellar:type=log,name=" + System.getProperty("karaf.name"));
        mbeanRegistration = bundleContext.registerService(getInterfaceNames(mbean), mbean, props);
    }

    @Override
    public void doStop() {
        super.doStop();

        if (mbeanRegistration != null) {
            mbeanRegistration.unregister();
            mbeanRegistration = null;
        }
    }

}
