/*******************************************************************************
 * Copyright (c) 2016 xored software, Inc.  and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     xored software,Inc.  - initial API and implementation
 *******************************************************************************/
package org.eclipse.dltk.tcl.internal.debug.ui.interpreters;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.eclipse.dltk.tcl.core.TclPackagesManager;
import org.eclipse.dltk.tcl.core.packages.TclInterpreterInfo;
import org.eclipse.dltk.tcl.core.packages.TclPackageInfo;
import org.eclipse.dltk.tcl.internal.ui.TclImages;
import org.eclipse.dltk.ui.DLTKPluginImages;
import org.eclipse.dltk.ui.viewsupport.ImageDescriptorRegistry;
import org.eclipse.emf.common.util.EList;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;

/**
 * @since 2.0
 */
public class AvailablePackagesBlock {
	private TclInterpreterInfo interpreter = null;
	private TreeViewer viewer;
	private AddTclInterpreterDialog dialog;

	private static class Node {
		String value;
		Object image;
	}

	private static class Library extends Node {

	}

	public AvailablePackagesBlock(AddTclInterpreterDialog dialog) {
		this.dialog = dialog;
	}

	public void createIn(Composite content) {
		viewer = new TreeViewer(content);
		GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1);
		gd.heightHint = 50;
		viewer.getControl().setLayoutData(gd);
		viewer.setLabelProvider(new LabelProvider() {

			@Override
			public String getText(Object element) {
				if (element instanceof TclPackageInfo) {
					String name = ((TclPackageInfo) element).getName();
					String version = ((TclPackageInfo) element).getVersion();
					if (version != null && version.length() > 0) {
						return name + " (" + version + ")";
					} else {
						return name;
					}
				}
				if (element instanceof Node) {
					return ((Node) element).value;
				}
				return super.getText(element);
			}

			@Override
			public Image getImage(Object element) {
				if (element instanceof TclPackageInfo) {
					return DLTKPluginImages
							.get(DLTKPluginImages.IMG_OBJS_PACKAGE);
				}
				if (element instanceof Node) {
					Object image = ((Node) element).image;
					if (image instanceof Image) {
						return (Image) image;
					} else if (image instanceof ImageDescriptor) {
						return registry.get((ImageDescriptor) image);
					}
				}
				return registry.get(TclImages.DESC_OBJS_TCL);
			}

			@Override
			public void dispose() {
				super.dispose();
				registry.dispose();
			}

			final ImageDescriptorRegistry registry = new ImageDescriptorRegistry(
					false);

		});
		viewer.setContentProvider(new ITreeContentProvider() {
			public void inputChanged(Viewer viewer, Object oldInput,
					Object newInput) {
			}

			public void dispose() {
			}

			public Object[] getElements(Object inputElement) {
				if (inputElement instanceof TclInterpreterInfo) {
					TclInterpreterInfo info = (TclInterpreterInfo) inputElement;
					EList<TclPackageInfo> packages = info.getPackages();
					List<TclPackageInfo> sorted = new ArrayList<TclPackageInfo>();
					sorted.addAll(packages);
					Collections.sort(sorted, new Comparator<TclPackageInfo>() {
						public int compare(TclPackageInfo o1, TclPackageInfo o2) {
							return o1.getName().compareTo(o2.getName());
						}
					});
					return sorted.toArray();
				}
				return new Object[0];
			}

			public boolean hasChildren(Object element) {
				if (element instanceof TclPackageInfo) {
					return true;
				}
				return false;
			}

			public Object getParent(Object element) {
				return null;
			}

			public Object[] getChildren(final Object parentElement) {
				if (parentElement instanceof TclPackageInfo) {
					final TclPackageInfo info = (TclPackageInfo) parentElement;
					if (!info.isFetched()) {
						TclPackagesManager.getPackageInfo(
								AvailablePackagesBlock.this.dialog
										.getInterpreterStandin(), info
										.getName(), true,
								AvailablePackagesBlock.this.interpreter, null);
					}
					List<Node> result = new ArrayList<Node>();
					EList<String> sources = info.getSources();
					for (String source : sources) {
						Node nde = new Node();
						nde.value = source;
						nde.image = TclImages.DESC_OBJS_TCL;
						result.add(nde);
					}
					EList<String> libs = info.getLibraries();
					for (String source : libs) {
						Node nde = new Library();
						nde.value = source;
						nde.image = DLTKPluginImages
								.get(DLTKPluginImages.IMG_OBJS_LIBRARY);
						result.add(nde);
					}
					return result.toArray();
				}
				return new Object[0];
			}
		});
		viewer.setComparator(new ViewerComparator() {
			@Override
			public int category(Object element) {
				if (element instanceof Library) {
					return 1;
				}
				return super.category(element);
			}
		});
		// viewer.setInput(elements);
	}

	public void updatePackages(TclInterpreterInfo info) {
		this.interpreter = info;
		// Collections.sort(elements);
		viewer.getControl().getDisplay().asyncExec(new Runnable() {
			public void run() {
				viewer.setInput(interpreter);
				viewer.refresh();
			}
		});
	}
}
