/*******************************************************************************
 * Copyright (c) 2014 Bosch Software Innovations GmbH and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Eclipse Distribution License v1.0 which accompany this distribution.
 *
 * The Eclipse Public License is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * The Eclipse Distribution License is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 * Bosch Software Innovations GmbH - Please refer to git log
 *
 *******************************************************************************/
package org.eclipse.vorto.codegen.api.tasks.eclipse;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.vorto.codegen.api.IProjectGenerator;
import org.eclipse.vorto.codegen.api.tasks.ICodeGeneratorTask;
import org.eclipse.vorto.codegen.api.tasks.eclipse.ProjectFileOutputter;
import org.eclipse.vorto.functionblock.FunctionblockModel;

/**
 * Code Generator which generates an Eclipse project
 * 
 *
 * 
 */
public class EclipseProjectGenerator implements IProjectGenerator {

	private ConfigurationContainer configuration;

	private List<ICodeGeneratorTask> tasks = new ArrayList<ICodeGeneratorTask>();

	private IProject project;

	private LocationWrapper locationW;

	public EclipseProjectGenerator(LocationWrapper location,
			ConfigurationContainer configuration, ICodeGeneratorTask... tasks) {
		this.locationW = location;
		this.configuration = configuration;
		this.tasks.addAll(Arrays.asList(tasks));
	}

	public EclipseProjectGenerator(String projectName,
			ConfigurationContainer configuration, ICodeGeneratorTask[] tasks) {
		String rootWorkspace = ResourcesPlugin.getWorkspace().getRoot()
				.getLocation().toString();
		this.locationW = new LocationWrapper(rootWorkspace, projectName);
		this.configuration = configuration;
		this.tasks.addAll(Arrays.asList(tasks));
	}

	public void generate(FunctionblockModel model, IProgressMonitor monitor) {
		project = getWorkspace().getProject(locationW.getProjectName());

		if (!project.exists()) {
			try {
				project = createProjectInWorkspace(monitor);
				project.open(monitor);
				configuration.configure(project);
				this.tasks.addAll(configuration.getGeneratorTasks());
			} catch (CoreException e) {
				e.printStackTrace();
			}
		}

		if (!project.isOpen()) {
			try {
				project.open(monitor);
			} catch (CoreException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		for (ICodeGeneratorTask task : tasks) {
			task.generate(model, new ProjectFileOutputter(project));
		}

	}

	private IProject createProjectInWorkspace(IProgressMonitor monitor)
			throws CoreException {
		IWorkspace workspace = ResourcesPlugin.getWorkspace();
		IProjectDescription desc = workspace.newProjectDescription(locationW
				.getProjectName());

		desc.setLocation(locationW.getValidPath());

		if (!isDefaultWorkLocation(workspace)) {
			project.create(desc, new SubProgressMonitor(monitor, 1));
		} else {
			project.create(new SubProgressMonitor(monitor, 1));
		}
		return project;
	}

	private boolean isDefaultWorkLocation(IWorkspace workspace) {
		String defaultWorkspace = workspace.getRoot().getLocation().toString();
		return StringUtils.equals(defaultWorkspace, locationW.getPath());
	}

	@Override
	public IProject getProject() {
		return project;
	}

	private IWorkspaceRoot getWorkspace() {
		return ResourcesPlugin.getWorkspace().getRoot();
	}

}
