/*******************************************************************************
 * Copyright (c) 2014 Christian Pontesegger and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *     Christian Pontesegger - initial API and implementation
 *******************************************************************************/
package org.eclipse.ease.helpgenerator;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;

import javax.lang.model.SourceVersion;

import org.eclipse.ease.helpgenerator.docletapi.Jep221ModuleDoclet;

import jdk.javadoc.doclet.DocletEnvironment;
import jdk.javadoc.doclet.Reporter;

public class V9ModuleDoclet implements jdk.javadoc.doclet.Doclet {

	public static final String OPTION_PROJECT_ROOT = "-root";
	public static final String OPTION_LINK = "-link";
	public static final String OPTION_LINK_OFFLINE = "-linkoffline";
	public static final String OPTION_FAIL_ON_HTML_ERRORS = "-failOnHTMLError";
	public static final String OPTION_FAIL_ON_MISSING_DOCS = "-failOnMissingDocs";

	private AbstractModuleDoclet fModuleDoclet = null;

	@Override
	public void init(Locale locale, Reporter reporter) {
		fModuleDoclet = new Jep221ModuleDoclet(reporter);
	}

	@Override
	public String getName() {
		return getClass().getSimpleName();
	}

	@Override
	public Set<? extends jdk.javadoc.doclet.Doclet.Option> getSupportedOptions() {
		final HashSet<Option> options = new HashSet<>();

		options.add(new Option(OPTION_PROJECT_ROOT, "Root folder of the plugin (the folder containing the .project file)", "<path>", 1));
		options.add(new Option(OPTION_FAIL_ON_HTML_ERRORS, "Fail the documentation process when HTML comments are not well formed. Defaults to true.",
				"<boolean>", 1));
		options.add(new Option(OPTION_FAIL_ON_MISSING_DOCS,
				"Fail the documentation process when classes/methods/parameters do miss documentation. Defaults to true.", "<boolean>", 1));
		options.add(new Option(OPTION_LINK,
				"Link used classes to existing API documentation. Provide base URI of JavaDoc, eg https://docs.oracle.com/javase/8/docs/api/", "<URL>", 1));
		options.add(new Option(OPTION_LINK_OFFLINE,
				"Link used classes to existing API documentation using a given package file. Provide base URI of JavaDoc as first link, URI of package-list file as second link. Only the package-list file needs to be accessible during documentation creation.",
				"<URL, URL>", 2));

		return options;
	}

	@Override
	public SourceVersion getSupportedSourceVersion() {
		return SourceVersion.RELEASE_9;
	}

	@Override
	public boolean run(DocletEnvironment environment) {
		((Jep221ModuleDoclet) fModuleDoclet).setDocletEnvironment(environment);
		return ((Jep221ModuleDoclet) fModuleDoclet).run();
	}

	private class Option implements jdk.javadoc.doclet.Doclet.Option {

		private final String fIdentifier;
		private final String fDescription;
		private final String fParameters;
		private final int fArgumentCount;

		public Option(String identifier, String description, String parameters, int argumentCount) {
			fIdentifier = identifier;
			fDescription = description;
			fParameters = parameters;

			fArgumentCount = argumentCount;
		}

		@Override
		public int getArgumentCount() {
			return fArgumentCount;
		}

		@Override
		public String getDescription() {
			return fDescription;
		}

		@Override
		public Kind getKind() {
			return Kind.STANDARD;
		}

		@Override
		public List<String> getNames() {
			return Arrays.asList(fIdentifier);
		}

		@Override
		public String getParameters() {
			return fParameters;
		}

		@Override
		public boolean process(String option, List<String> arguments) {
			fModuleDoclet.setParameter(option, new ArrayList<>(arguments.subList(0, getArgumentCount())));
			return true;
		}
	}
}
