/**
 * Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
 * 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:
 * Thales Corporate Services S.A.S - initial API and implementation
 */
package org.eclipse.egf.application.activity;

import java.util.List;

import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.egf.application.internal.activator.EGFApplicationPlugin;
import org.eclipse.egf.application.internal.activity.ActivityRunner;
import org.eclipse.egf.application.internal.l10n.ApplicationMessages;
import org.eclipse.egf.core.domain.RuntimePlatformResourceSet;
import org.eclipse.egf.core.domain.TargetPlatformResourceSet;
import org.eclipse.egf.model.fcore.Activity;
import org.eclipse.emf.codegen.util.CodeGenUtil;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.common.util.UniqueEList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.equinox.app.IApplication;
import org.eclipse.equinox.app.IApplicationContext;
import org.eclipse.osgi.util.NLS;

public class ActivityApplication implements IApplication {

    public Object start(IApplicationContext context) throws Exception {
        // Retrieve arguments
        String[] strings = (String[]) context.getArguments().get(IApplicationContext.APPLICATION_ARGS);
        // Usual tests
        if (strings == null || strings.length < 2) {
            System.err.println(ApplicationMessages.ActivityApplication_Arguments_Usage);
            return IApplicationConfigurationConstants.EXIT_ERROR;
        }
        // Decode arguments
        boolean hasActivitiesArgument = hasActivitiesArgument(strings);
        if (hasActivitiesArgument == false) {
            System.err.println(ApplicationMessages.ActivityApplication_Arguments_Usage);
            return IApplicationConfigurationConstants.EXIT_ERROR;
        }
        List<URI> uris = getActivityURIs(strings);
        // Nothing to process
        if (uris.isEmpty()) {
            return IApplication.EXIT_OK;
        }
        boolean isRuntime = isRuntime(strings);
        ResourceSet resourceSet = null;
        if (isRuntime) {
            resourceSet = new RuntimePlatformResourceSet();
        } else {
            resourceSet = new TargetPlatformResourceSet();
        }
        // Build a list of activities if any
        List<Activity> activities = new UniqueEList<Activity>();
        for (int i = 0; i < uris.size(); i++) {
            URI uri = uris.get(i);
            EObject eObject = null;
            // Load it in our Editing Domain
            try {
                eObject = resourceSet.getEObject(uri, true);
            } catch (Throwable t) {
                EGFApplicationPlugin.getDefault().logError(new CoreException(EGFApplicationPlugin.getDefault().newStatus(IStatus.ERROR, NLS.bind(ApplicationMessages.ActivityApplication_EObject_Loading_Error, i, uri), t)));
                continue;
            }
            // Check if we face an Activity
            if (eObject == null || eObject instanceof Activity == false) {
                EGFApplicationPlugin.getDefault().logError(new CoreException(EGFApplicationPlugin.getDefault().newStatus(IStatus.ERROR, NLS.bind(ApplicationMessages.ActivityApplication_Invalid_Activity_Argument, i, uri), null)));
                continue;
            }
            // to be runned activities
            activities.add((Activity) eObject);
        }
        // Nothing to process
        if (activities.isEmpty()) {
            return IApplication.EXIT_OK;
        }
        // Run
        return runHelper(activities);
    }

    public void stop() {
        // Subclasses may override
    }

    public static Object runHelper(final List<Activity> activities) throws Exception {
        final IWorkspace workspace = ResourcesPlugin.getWorkspace();
        try {
            IWorkspaceRunnable runnable = new IWorkspaceRunnable() {

                public void run(IProgressMonitor monitor) throws CoreException {
                    try {
                        ActivityRunner runner = new ActivityRunner(activities);
                        runner.run(monitor);
                    } finally {
                        monitor.done();
                    }
                }
            };
            workspace.run(runnable, new CodeGenUtil.EclipseUtil.StreamProgressMonitor(System.out));
        } catch (Exception e) {
            throw e;
        } finally {
            try {
                workspace.save(true, new NullProgressMonitor());
            } catch (Exception e) {
                EGFApplicationPlugin.getDefault().logError(e);
            }
        }
        return IApplication.EXIT_OK;
    }

    protected boolean isRuntime(String[] objects) {
        for (String string : objects) {
            if (IApplicationConfigurationConstants.RUNTIME_PROGRAM_ARGUMENTS.equals(string)) {
                return true;
            }
        }
        return false;
    }

    protected boolean hasActivitiesArgument(String[] objects) {
        for (String string : objects) {
            if (IApplicationConfigurationConstants.ACTIVITIES_PROGRAM_ARGUMENTS.equals(string)) {
                return true;
            }
        }
        return false;
    }

    protected List<URI> getActivityURIs(String[] objects) {
        List<URI> uris = new UniqueEList<URI>();
        boolean next = false;
        int position = 0;
        for (String string : objects) {
            if (IApplicationConfigurationConstants.ACTIVITIES_PROGRAM_ARGUMENTS.equals(string)) {
                next = true;
            } else if (IApplicationConfigurationConstants.RUNTIME_PROGRAM_ARGUMENTS.equals(string)) {
                next = false;
            } else if (next) {
                URI uri = null;
                position += 1;
                try {
                    // Build a uri
                    uri = URI.createURI(string);
                } catch (Throwable t) {
                    EGFApplicationPlugin.getDefault().logError(new CoreException(EGFApplicationPlugin.getDefault().newStatus(IStatus.ERROR, NLS.bind(ApplicationMessages.ActivityApplication_Invalid_URI_Argument, position, string), t)));
                }
                if (uri != null) {
                    uris.add(uri);
                }
            }
        }
        return uris;
    }
}
