/*******************************************************************************
 * Copyright (c) 2004, 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.debug.model;

import java.io.File;

import org.eclipse.ant.internal.core.IAntCoreConstants;
import org.eclipse.ant.internal.launching.debug.model.AntLineBreakpoint;
import org.eclipse.ant.internal.launching.debug.model.AntProperties;
import org.eclipse.ant.internal.launching.debug.model.AntProperty;
import org.eclipse.ant.internal.launching.debug.model.AntStackFrame;
import org.eclipse.ant.internal.launching.debug.model.AntThread;
import org.eclipse.ant.internal.ui.AntUIImages;
import org.eclipse.ant.internal.ui.AntUIPlugin;
import org.eclipse.ant.internal.ui.preferences.AntObjectLabelProvider;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.ILineBreakpoint;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.debug.core.sourcelookup.containers.LocalFileStorage;
import org.eclipse.debug.ui.IDebugModelPresentationExtension;
import org.eclipse.debug.ui.IValueDetailListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.ide.FileStoreEditorInput;
import org.eclipse.ui.part.FileEditorInput;

import com.ibm.icu.text.MessageFormat;

/**
 * Renders Ant debug elements
 */
public class AntDebugModelPresentation extends LabelProvider implements IDebugModelPresentationExtension {

	@Override
	public void setAttribute(String attribute, Object value) {
		// do nothing
	}

	@Override
	public Image getImage(Object element) {
		if (element instanceof AntProperty) {
			return AntObjectLabelProvider.getPropertyImage();
		} else if (element instanceof AntProperties) {
			return AntObjectLabelProvider.getPropertyImage();
		}
		return null;
	}

	@Override
	public String getText(Object element) {
		if (element instanceof AntStackFrame) {
			AntStackFrame frame = (AntStackFrame) element;
			return getStackFrameText(frame);
		} else if (element instanceof AntThread) {
			AntThread thread = (AntThread) element;
			return getThreadText(thread);
		} else if (element instanceof AntProperty) {
			AntProperty property = (AntProperty) element;
			return property.getText();
		} else if (element instanceof AntProperties) {
			return ((AntProperties) element).getName();
		}

		return null;
	}

	private String getThreadText(AntThread thread) {
		String name = thread.getName();
		if (name != null) {
			StringBuilder text = new StringBuilder(name);
			if (thread.isSuspended()) {
				IBreakpoint[] breakpoints = thread.getBreakpoints();
				if (breakpoints.length > 0) {
					AntLineBreakpoint breakpoint = (AntLineBreakpoint) breakpoints[0];
					IMarker marker = breakpoint.getMarker();
					String fileName = marker.getResource().getFullPath().lastSegment();
					String lineNumber = Integer.toString(marker.getAttribute(IMarker.LINE_NUMBER, -1));
					String breakpointString = null;
					if (breakpoint.isRunToLine()) {
						breakpointString = MessageFormat.format(DebugModelMessages.AntDebugModelPresentation_5, new Object[] { lineNumber,
								fileName });
					} else {
						breakpointString = MessageFormat.format(DebugModelMessages.AntDebugModelPresentation_2, new Object[] { lineNumber,
								fileName });
					}
					text.append(MessageFormat.format(DebugModelMessages.AntDebugModelPresentation_3, new Object[] { breakpointString }));
				} else {
					text.append(DebugModelMessages.AntDebugModelPresentation_4);
				}
			}

			return text.toString();
		}
		return null;
	}

	private String getStackFrameText(AntStackFrame frame) {
		String name = frame.getName();
		if (name != null) {
			StringBuilder text = new StringBuilder(name);
			int lineNumber = frame.getLineNumber();
			String lineNumberString = null;
			if (lineNumber == 0) {
				lineNumberString = DebugModelMessages.AntDebugModelPresentation_0;
			} else {
				lineNumberString = Integer.toString(lineNumber);
			}
			text.append(MessageFormat.format(DebugModelMessages.AntDebugModelPresentation_1, new Object[] { lineNumberString }));
			return text.toString();
		}
		return null;
	}

	@Override
	public void computeDetail(IValue value, IValueDetailListener listener) {
		String detail = IAntCoreConstants.EMPTY_STRING;
		try {
			detail = value.getValueString();
		}
		catch (DebugException e) {
			// do nothing
		}
		listener.detailComputed(value, detail);
	}

	@Override
	public IEditorInput getEditorInput(Object element) {
		if (element instanceof IFile) {
			return new FileEditorInput((IFile) element);
		}
		if (element instanceof ILineBreakpoint) {
			return new FileEditorInput((IFile) ((ILineBreakpoint) element).getMarker().getResource());
		}
		if (element instanceof LocalFileStorage) {
			File file = ((LocalFileStorage) element).getFile();
			IFileStore fileStore;
			try {
				fileStore = EFS.getStore(file.toURI());
				return new FileStoreEditorInput(fileStore);
			}
			catch (CoreException e) {
				AntUIPlugin.log(e);
				return null;
			}
		}
		return null;
	}

	@Override
	public String getEditorId(IEditorInput input, Object element) {
		return "org.eclipse.ant.ui.internal.editor.AntEditor"; //$NON-NLS-1$
	}

	@Override
	public boolean requiresUIThread(Object element) {
		return !AntUIImages.isInitialized();
	}
}
