/*******************************************************************************
 * Copyright (c) 2005, 2011 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.io.File;

import org.apache.tools.ant.Task;
import org.apache.tools.ant.util.FileUtils;
import org.eclipse.ant.internal.core.IAntCoreConstants;
import org.eclipse.ant.internal.ui.editor.AntEditorCompletionProcessor;
import org.xml.sax.Attributes;

public class AntAntNode extends AntTaskNode {

	private String fFile;

	public AntAntNode(Task task, Attributes attributes) {
		super(task);
		StringBuilder label = new StringBuilder("ant "); //$NON-NLS-1$
		fFile = attributes.getValue(IAntCoreConstants.DIR);
		if (fFile != null) {
			if (!FileUtils.isAbsolutePath(fFile)) {
				File basedir = task.getProject().getBaseDir();
				if (basedir != null) {
					fFile = basedir.getAbsolutePath() + File.separatorChar + fFile;
				}
			}
			label.append(fFile);
			label.append(File.separatorChar);
		} else {
			File basedir = task.getProject().getBaseDir();
			if (basedir != null) {
				fFile = basedir.getAbsolutePath();
			}
		}
		String fileName = attributes.getValue(IAntModelConstants.ATTR_ANT_FILE);
		if (fileName == null) {
			fileName = "build.xml"; //$NON-NLS-1$
		}
		label.append(fileName);
		if (fFile == null || FileUtils.isAbsolutePath(fileName)) {
			fFile = fileName;
		} else {
			fFile += File.separatorChar + fileName;
		}

		String more = attributes.getValue(IAntModelConstants.ATTR_TARGET);
		if (more != null) {
			label.append(' ');
			label.append(more);
		}
		setBaseLabel(label.toString());
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ant.internal.ui.model.AntElementNode#getReferencedElement(int)
	 */
	@Override
	public String getReferencedElement(int offset) {
		if (fFile != null) {
			String textToSearch = getAntModel().getText(getOffset(), offset - getOffset());
			if (textToSearch != null && textToSearch.length() != 0) {
				String attributeString = AntEditorCompletionProcessor.getAttributeStringFromDocumentStringToPrefix(textToSearch);
				if (IAntModelConstants.ATTR_ANT_FILE.equals(attributeString)) {
					return fFile;
				}
			}
		}
		return null;
	}
}
