/*******************************************************************************
 * Copyright (c) 2012, 2013 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.ant.internal.ui.model;

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

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.RuntimeConfigurable;
import org.apache.tools.ant.Task;
import org.eclipse.ant.core.AntSecurityException;
import org.eclipse.ant.internal.core.IAntCoreConstants;
import org.eclipse.ant.internal.ui.preferences.AntEditorPreferenceConstants;

/**
 * Supports the Ant augment task, which over-writes (augments) existing nodes based on their id
 * 
 * @see "http://ant.apache.org/manual/Tasks/augment.html"
 */
public class AntAugmentTaskNode extends AntTaskNode {

	String attrId = null;

	public AntAugmentTaskNode(Task task, String label) {
		super(task, label);
		// we need to cache the id as it is removed from the wrapping attribute list when the AugemntReference is configured
		RuntimeConfigurable wrapper = task.getRuntimeConfigurableWrapper();
		attrId = (String) wrapper.getAttributeMap().get(IAntCoreConstants.ID);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ant.internal.ui.model.AntTaskNode#configure(boolean)
	 */
	@Override
	public boolean configure(boolean validateFully) {
		if (fConfigured) {
			return false;
		}
		// only configure if the user cares about the problems
		try {
			getTask().maybeConfigure();
			fConfigured = true;
			return true;
		}
		catch (BuildException be) {
			handleBuildException(be, AntEditorPreferenceConstants.PROBLEM_TASKS);
		}
		catch (AntSecurityException se) {
			// either a system exit or setting of system property was attempted
			handleBuildException(new BuildException(AntModelMessages.AntTaskNode_0), AntEditorPreferenceConstants.PROBLEM_SECURITY);
		}
		catch (IllegalStateException ise) {
			// this is thrown when the id to augment does not exist
			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=396219
			handleBuildException(new BuildException(ise), AntEditorPreferenceConstants.PROBLEM_TASKS);
		}
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ant.internal.ui.model.AntTaskNode#containsOccurrence(java.lang.String)
	 */
	@Override
	public boolean containsOccurrence(String identifier) {
		if (identifier != null) {
			boolean prop = identifier.startsWith("${") && identifier.endsWith("}"); //$NON-NLS-1$ //$NON-NLS-2$
			// the 'id' is the only attribute of an augment
			if (!prop) {
				return identifier.equals(attrId);
			}
			return attrId != null && identifier.indexOf(attrId) > -1;
		}
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ant.internal.ui.model.AntTaskNode#computeIdentifierOffsets(java.lang.String)
	 */
	@Override
	public List<Integer> computeIdentifierOffsets(String identifier) {
		// augment nodes can only contain an occurrence of the id of the task
		// they augment, compute the offset based on the the index of the id + the node offset
		if (attrId != null && identifier != null && identifier.length() > 0) {
			String text = getAntModel().getText(getOffset(), getLength());
			if (text == null || text.length() == 0) {
				return null;
			}
			ArrayList<Integer> list = new ArrayList<>();
			int idx = text.indexOf(attrId);
			if (idx > -1) {
				list.add(Integer.valueOf(getOffset() + idx));
			}
			return list;
		}
		return null;
	}
}
