/*******************************************************************************
 * Copyright (c) 2014 TwelveTone LLC and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Steven Spungin <steven@spungin.tv> - initial API and implementation
 *******************************************************************************/
package aeri.rcp;

import static aeri.rcp.DemoSingleServerWorkflow.*;
import static org.eclipse.e4.core.contexts.ContextInjectionFactory.make;
import static org.eclipse.epp.logging.aeri.core.SystemControl.registerHandlers;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.UUID;

import org.apache.commons.lang3.SystemUtils;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.e4.ui.workbench.lifecycle.PostContextCreate;
import org.eclipse.epp.logging.aeri.core.IModelFactory;
import org.eclipse.epp.logging.aeri.core.IServerConnection;
import org.eclipse.epp.logging.aeri.core.ISystemSettings;
import org.eclipse.epp.logging.aeri.core.SystemControl;
import org.eclipse.epp.logging.aeri.core.filters.DecoratingDebugFilter;
import org.eclipse.epp.logging.aeri.core.filters.NoErrorStatusFilter;
import org.eclipse.epp.logging.aeri.core.filters.RecentlySeenFilter;
import org.eclipse.epp.logging.aeri.core.filters.SystemEnabledFilter;
import org.eclipse.epp.logging.aeri.core.util.LogListener;

import com.google.common.base.Predicate;
import com.google.common.base.Predicates;

import aeri.rcp.handlers.NotifyConfigureSystemHandler;
import aeri.rcp.handlers.NotifyLogEventHandler;
import aeri.rcp.handlers.NotifyServerResponseHandler;

/**
 * This is a stub implementation containing e4 LifeCycle annotated methods.<br />
 * There is a corresponding entry in <em>plugin.xml</em> (under the <em>org.eclipse.core.runtime.products' extension point</em>) that
 * references this class.
 **/
@SuppressWarnings("restriction")
public class E4LifeCycle {

    @PostContextCreate
    void postContextCreate(IEclipseContext workbenchContext) {
        // Initialize the system's DI context as child of the normal workbench to allow (potential) access to OSGI services, application
        // services etc. Not used here.
        IEclipseContext context = SystemControl.getSystemContext();
        context.setParent(workbenchContext);

        // register a couple of standard handlers - usually referenced in the workflow class
        registerHandlers(NotifyLogEventHandler.class, NotifyConfigureSystemHandler.class, NotifyServerResponseHandler.class);

        // configure the system settings (hardcoded here)
        context.set(ISystemSettings.class, createSettings());

        // register the (dummy console log) server where all events should be sent to
        context.set(IServerConnection.class, createServer());

        context.set(DemoNotificationSupport.class.getName(), make(DemoNotificationSupport.class, context));
        context.set(CTX_STATE_REVIEW_IN_PROGRESS, false);
        context.declareModifiable(CTX_STATE_REVIEW_IN_PROGRESS);
        context.set(CTX_STATE_SETUP_IN_PROGRESS, false);
        context.declareModifiable(CTX_STATE_SETUP_IN_PROGRESS);
        context.set(CTX_STATE_NOTIFICATION_IN_PROGRESS, false);
        context.declareModifiable(CTX_STATE_NOTIFICATION_IN_PROGRESS);
        // create the controller and (implicitly with this call) register it with the IEventBroker
        context.set(DemoSingleServerWorkflow.class, make(DemoSingleServerWorkflow.class, context));
        context.get(DemoSingleServerWorkflow.class);

        // Register the log listener:
        LogListener listener = new LogListener(createStatusFilters(), context.get(IEventBroker.class));
        Platform.addLogListener(listener);
        // optional: put it into the system context for later reference:
        context.set(LogListener.class, listener);

    }

    private ISystemSettings createSettings() {
        ISystemSettings settings = IModelFactory.eINSTANCE.createSystemSettings();
        settings.setAnonymousId(getStableSystemId());
        settings.setReporterName(SystemUtils.USER_NAME);
        // XXX for demo purpose. Effectively disables the RecentlySeenFilter
        settings.setDebugEnabled(true);
        return settings;
    }

    private String getStableSystemId() {
        try {
            InetAddress ip = InetAddress.getLocalHost();
            NetworkInterface network = NetworkInterface.getByInetAddress(ip);
            byte[] mac = network.getHardwareAddress();
            return UUID.nameUUIDFromBytes(mac).toString();
        } catch (Exception e) {
            return "error";
        }
    }

    private Predicate<IStatus> createStatusFilters() {

        Predicate<? super IStatus>[] statusPredicates = DecoratingDebugFilter.decorate(
                // @formatter:off
                new NoErrorStatusFilter(),
                new SystemEnabledFilter(),
                new RecentlySeenFilter()
                // @formatter:on
        );
        Predicate<IStatus> statusFilters = Predicates.and(statusPredicates);
        return statusFilters;
    }

    private IServerConnection createServer() {
        return new DemoServerConnection();
    }
}
