/*******************************************************************************
 * Copyright (c) 2017 Kichwa Coders Ltd. and others.
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
package org.eclipse.lsp4e.debug.presentation;

import java.net.URI;

import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.debug.core.model.IDisconnect;
import org.eclipse.debug.core.model.ILineBreakpoint;
import org.eclipse.debug.core.model.ITerminate;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.ui.IDebugModelPresentation;
import org.eclipse.debug.ui.ISourcePresentation;
import org.eclipse.debug.ui.IValueDetailListener;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.IFontProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.lsp4e.debug.debugmodel.DSPDebugElement;
import org.eclipse.lsp4e.debug.debugmodel.DSPThread;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IURIEditorInput;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.FileStoreEditorInput;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.FileEditorInput;

public class DSPDebugModelPresentation extends LabelProvider implements IDebugModelPresentation, IFontProvider {

	private Font italic;

	@Override
	public String getText(Object element) {
		StringBuilder label = new StringBuilder();
		if (element instanceof DSPThread) {
			DSPThread thread = (DSPThread) element;
			label.append(NLS.bind("Thread #{0} [{1}]", thread.getId(), thread.getName()));

		}

		if (label.length() != 0) {
			if (element instanceof ITerminate) {
				if (((ITerminate) element).isTerminated()) {
					label.insert(0, "<terminated>");
				}
			} else if (element instanceof IDisconnect && ((IDisconnect) element).isDisconnected()) {
				label.insert(0, "<disconnected>");
			}
		} else {
			// Use default TODO should the entire default be copied here?
			label.append(DebugUIPlugin.getDefaultLabelProvider().getText(element));
		}
		if (element instanceof DSPDebugElement) {
			DSPDebugElement debugElement = (DSPDebugElement) element;
			if (debugElement.getErrorMessage() != null) {
				label.append(" <error:");
				label.append(debugElement.getErrorMessage());
				label.append(">");
			}
		}
		return label.toString();
	}

	@Override
	public Font getFont(Object element) {
		if (element instanceof DSPDebugElement) {
			DSPDebugElement debugElement = (DSPDebugElement) element;
			if (debugElement.getErrorMessage() != null) {
				return italic();
			}
		}
		return null;
	}

	private Font italic() {
		if (italic == null) {
			Font dialogFont = JFaceResources.getDialogFont();
			FontData[] fontData = dialogFont.getFontData();
			for (int i = 0; i < fontData.length; i++) {
				FontData data = fontData[i];
				data.setStyle(SWT.ITALIC);
			}
			Display display = getDisplay();
			italic = new Font(display, fontData);
		}
		return italic;
	}

	@Override
	public void dispose() {
		if (italic != null) {
			italic.dispose();
		}
		super.dispose();
	}

	@Override
	public IEditorInput getEditorInput(Object element) {
		if (element instanceof ILineBreakpoint) {
			return new FileEditorInput((IFile) ((ILineBreakpoint) element).getMarker().getResource());
		}
		if (element instanceof IFile) {
			return new FileEditorInput((IFile) element);
		}

		IFileStore fileStore = EFS.getLocalFileSystem().getStore(new Path(element.toString()));
		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
		IFile[] files = root.findFilesForLocationURI(fileStore.toURI());
		if (files != null) {
			for (IFile file : files) {
				if (file.exists()) {
					return new FileEditorInput(file);
				}
			}
		}
		return new FileStoreEditorInput(fileStore);
	}

	@Override
	public String getEditorId(IEditorInput input, Object element) {
		String id = null;
		if (input != null) {
			IEditorDescriptor descriptor = null;
			if (input instanceof IFileEditorInput) {
				IFileEditorInput fileEditorInput = (IFileEditorInput) input;
				IFile file = fileEditorInput.getFile();
				descriptor = IDE.getDefaultEditor(file);
			} else if (input instanceof IURIEditorInput) {
				IURIEditorInput uriEditorInput = (IURIEditorInput) input;
				URI uri = uriEditorInput.getURI();
				try {
					IFileStore fileStore = EFS.getStore(uri);
					id = IDE.getEditorDescriptorForFileStore(fileStore, false).getId();
				} catch (CoreException e) {
					// fallback to default case
				}
			}
			if (id == null) {
				if (descriptor == null) {
					IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
					descriptor = registry.getDefaultEditor(input.getName());
				}

				id = "org.eclipse.ui.genericeditor.GenericEditor";
				if (descriptor != null) {
					id = descriptor.getId();
				}
			}

			if (id == null && element instanceof ILineBreakpoint) {
				// There is no associated editor ID for this breakpoint, see if an alternative
				// can be supplied from an adapter.
				ISourcePresentation sourcePres = Platform.getAdapterManager().getAdapter(element,
						ISourcePresentation.class);
				if (sourcePres != null) {
					String lid = sourcePres.getEditorId(input, element);
					if (lid != null) {
						id = lid;
					}
				}
			}
		}
		return id;
	}

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

	@Override
	public void computeDetail(IValue value, IValueDetailListener listener) {
		// TODO Auto-generated method stub

	}

	public static Display getDisplay() {
		Display display;
		display = Display.getCurrent();
		if (display == null) {
			display = Display.getDefault();
		}
		return display;
	}

}
