/*******************************************************************************
 * Copyright (c) 2008, 2016 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.tools.builders;

import java.util.*;

import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.swt.tools.internal.*;

public class JNIBuilder extends IncrementalProjectBuilder {

	MetaData metaData;
	MainClass[] classes;
	
	static class MainClass {
		public String mainClassName;
		public String outputDir;
		public String sourceDir;
		public boolean build;
		
		@Override
		public String toString() {
			return mainClassName + "->" + outputDir;
		}
	}
	
	public JNIBuilder() {
		metaData = new MetaData("org.eclipse.swt.internal");
		String mainClasses = metaData.getMetaData("swt_main_classes", null);
		if (mainClasses != null) {
			String[] list = mainClasses.split(",");
			classes = new MainClass[list.length / 2];
			for (int i = 0; i < list.length; i += 2) {
				MainClass clazz = classes[i/2] = new MainClass();
				clazz.mainClassName = list[i];
				clazz.outputDir = list[i+1].substring(2, list[i+1].length());
				clazz.sourceDir = clazz.outputDir.substring(0, clazz.outputDir.length() - "library/".length());
			}
		}
	}
	
	@Override
	protected IProject[] build(int kind, Map<String, String> args, final IProgressMonitor monitor) throws CoreException {
		IResourceDelta delta = getDelta(getProject());
		if (delta == null) return null;
		delta.accept(delta1 -> {
			IPath ipath = delta1.getFullPath();
			if (!"java".equals(ipath.getFileExtension())) return true;
			String path = ipath.toPortableString();
			for (int i = 0; i < classes.length; i++) {
				if (classes[i].build) continue;
				if (path.startsWith(classes[i].sourceDir)) {
					classes[i].build = true;
				}
			}
			return true;
		});
		final IWorkspaceRoot root = getProject().getWorkspace().getRoot();
		for (MainClass mainClass : classes) {
			if (mainClass.build) {
				mainClass.build = false;
				IResource library = root.findMember(mainClass.outputDir);
				JNIGeneratorApp gen = new JNIGeneratorApp();
				gen.setMainClassName(mainClass.mainClassName, library.getLocation().toPortableString());
				gen.generate();
				library.refreshLocal(IResource.DEPTH_INFINITE, null);
			}
		}
		return null;
	}

}
