/*******************************************************************************
 * Copyright (c) 2009, 2010 Nokia 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:
 * Nokia - Initial API and implementation
 *******************************************************************************/
package org.eclipse.cdt.debug.edc.system.tests;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
import org.eclipse.cdt.debug.edc.internal.ui.views.ISystemVMContainer;
import org.eclipse.cdt.debug.edc.internal.ui.views.SystemDMContainer;
import org.eclipse.cdt.debug.edc.internal.ui.views.SystemDataModel;
import org.eclipse.cdt.debug.edc.internal.ui.views.SystemVMContainer;
import org.eclipse.cdt.debug.edc.internal.ui.views.SystemView;
import org.eclipse.cdt.debug.edc.internal.ui.views.SystemViewModel;
import org.eclipse.cdt.debug.edc.tests.EDCTestPlugin;
import org.eclipse.cdt.internal.ui.util.StringMatcher;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext;
import org.eclipse.swt.widgets.Composite;

@SuppressWarnings("restriction")
public class K9SystemView extends SystemView {

	public static final String VIEW_ID = "org.eclipse.cdt.debug.edc.system.tests.K9SystemView";
	
	public class K9DataModel extends SystemDataModel {

		private SystemDMContainer allDogs = new SystemDMContainer();

		private SystemDMContainer allToys = new SystemDMContainer();

		@Override
		public void buildDataModel(IProgressMonitor monitor) throws CoreException {
			// Create the data model
			allDogs = new SystemDMContainer();
			{
				Map<String, Object> props = new HashMap<String, Object>();

				props.put("breed", "Border Terrier");
				new SystemDMContainer(allDogs, "Indy", props);
				props.put("breed", "Bouvier");
				new SystemDMContainer(allDogs, "Jessica", props);
				new SystemDMContainer(allDogs, "Emmalee", props);
				props.put("breed", "Italian Greyhound");
				new SystemDMContainer(allDogs, "Poppy", props);
				props.put("breed", "Wippet");
				new SystemDMContainer(allDogs, "Sophie", props);   			
			}

			String[] dogStatus = new String[]{"Barking", "Watching", "Sleeping", "Running", "Howling"};
			for (SystemDMContainer dog : allDogs.getChildren()) {
				dog.getProperties().put("STATUS", dogStatus[new Random().nextInt(dogStatus.length - 1)]);
			}

			allToys = new SystemDMContainer();
			{
				Map<String, Object> props = new HashMap<String, Object>();

				new SystemDMContainer(allToys, "Big Bone", props);
				new SystemDMContainer(allToys, "Kong", props);
				new SystemDMContainer(allToys, "Chewy Postman", props);
				new SystemDMContainer(allToys, "Frisbee", props);
				new SystemDMContainer(allToys, "Rope Toy", props);
			}
			
			for (SystemDMContainer toy : allToys.getChildren()) {
				int remainingValue = new Random().nextInt(100);
				toy.getProperties().put("REMAINING_VALUE", remainingValue);
				toy.getProperties().put("REMAINING", remainingValue + "%");
			}

		}

		public void setAllDogs(SystemDMContainer allDogs) {
			this.allDogs = allDogs;
		}

		public SystemDMContainer getAllDogs() {
			return allDogs;
		}

		public void setAllToys(SystemDMContainer allToys) {
			this.allToys = allToys;
		}

		public SystemDMContainer getAllToys() {
			return allToys;
		}
		
	}

	public class K9ViewModel extends SystemViewModel {

		private List<SystemVMContainer> rootVMContainers = new ArrayList<SystemVMContainer>();

		@Override
		public void buildViewModel() {
			rootVMContainers = new ArrayList<SystemVMContainer>();
			rootVMContainers.add(getOverviewVMContainer());
			rootVMContainers.add(getBreedsVMContainer());
			rootVMContainers.add(getDogsVMContainer());
			rootVMContainers.add(getToysVMContainer());
		}

		@Override
		public List<SystemVMContainer> getRootContainers() {
			return rootVMContainers;
		}

		public SystemVMContainer getOverviewVMContainer() {
			SystemVMContainer root = new SystemVMContainer(null, "Overview");
			root.getProperties().put(ISystemVMContainer.PROP_ID, getPresentationContext().getId() + "_overview");
			SystemVMContainer breeds = new SystemVMContainer(root, "Breeds");
			SystemVMContainer dogs = new SystemVMContainer(root, "Dogs");

			Map<String, SystemVMContainer> breedVMContainers = new HashMap<String, SystemVMContainer>();

			StringMatcher  matcher = getFilterMatcher();
			for (SystemDMContainer dog : getAllDogs().getChildren()) {
				if (matcher.match(dog.getName()))
				{
					String breed = (String) dog.getProperties().get("breed");
					SystemVMContainer breedContainer = breedVMContainers.get(breed);
					if (breedContainer == null)
					{
						breedContainer = new SystemVMContainer(breeds, breed);
						breedVMContainers.put(breed, breedContainer);
					}
					new SystemVMContainer(breedContainer, dog);
					new SystemVMContainer(dogs, dog);
				}
			}		
			
			SystemVMContainer toys = new SystemVMContainer(root, "Toys");
			for (SystemDMContainer toy : getAllToys().getChildren()) {
				if (matcher.match(toy.getName()))
					new SystemVMContainer(toys, toy);
			}
			
			return root;
		}

		public SystemVMContainer getBreedsVMContainer() {
			SystemVMContainer root = new SystemVMContainer(null, "Breeds");

			root.getProperties().put(ISystemVMContainer.PROP_ID, getPresentationContext().getId() + "_breeds");
			String[] column_keys = new String[] { ISystemVMContainer.PROP_NAME, "COUNT" };
			Map<String, String> column_names = new HashMap<String, String>();
			column_names.put(ISystemVMContainer.PROP_NAME, "Description");
			column_names.put("COUNT", "Count");
			root.getProperties().put(ISystemVMContainer.PROP_COLUMN_KEYS, column_keys);
			root.getProperties().put(ISystemVMContainer.PROP_COLUMN_NAMES, column_names);

			
			Map<String, SystemVMContainer> breedVMContainers = new HashMap<String, SystemVMContainer>();

			StringMatcher  matcher = getFilterMatcher();

			for (SystemDMContainer dog : getAllDogs().getChildren()) {
				if (matcher.match(dog.getName()))
				{
					String breed = (String) dog.getProperties().get("breed");
					SystemVMContainer breedContainer = breedVMContainers.get(breed);
					if (breedContainer == null)
					{
						breedContainer = new SystemVMContainer(root, breed);
						breedVMContainers.put(breed, breedContainer);
					}
					new SystemVMContainer(breedContainer, dog);
				}
			}
			
			for (ISystemVMContainer breedContainer : breedVMContainers.values())
			{
				breedContainer.getProperties().put("COUNT", Integer.toString(breedContainer.getChildren().size()));
			}

			return root;
		}

		public SystemVMContainer getDogsVMContainer() {
			SystemVMContainer root = new SystemVMContainer(null, "Dogs");
			root.getProperties().put(ISystemVMContainer.PROP_ID, getPresentationContext().getId() + "_dogs");

			String[] column_keys = new String[] { ISystemVMContainer.PROP_NAME, "STATUS" };
			Map<String, String> column_names = new HashMap<String, String>();
			column_names.put(ISystemVMContainer.PROP_NAME, "Description");
			column_names.put("STATUS", "Status");
			root.getProperties().put(ISystemVMContainer.PROP_COLUMN_KEYS, column_keys);
			root.getProperties().put(ISystemVMContainer.PROP_COLUMN_NAMES, column_names);

			
			StringMatcher  matcher = getFilterMatcher();

			for (SystemDMContainer dog : getAllDogs().getChildren()) {
				if (matcher.match(dog.getName()))
					new SystemVMContainer(root, dog);
			}		

			return root;
		}

		public SystemVMContainer getToysVMContainer() {
			SystemVMContainer root = new SystemVMContainer(null, "Toys");
			root.getProperties().put(ISystemVMContainer.PROP_ID, getPresentationContext().getId() + "_toys");

			String[] column_keys = new String[] { ISystemVMContainer.PROP_NAME, "REMAINING" };
			Map<String, String> column_names = new HashMap<String, String>();
			column_names.put(ISystemVMContainer.PROP_NAME, "Description");
			column_names.put("REMAINING", "Remaining");
			root.getProperties().put(ISystemVMContainer.PROP_COLUMN_KEYS, column_keys);
			root.getProperties().put(ISystemVMContainer.PROP_COLUMN_NAMES, column_names);
		
			StringMatcher  matcher = getFilterMatcher();

			for (SystemDMContainer toy : getAllToys().getChildren()) {
				if (matcher.match(toy.getName()))
				new SystemVMContainer(root, toy);
			}

			return root;
		}

	}
	
	@Override
	public void createPartControl(Composite parent) {
		setRefreshInterval(5000);		
		setPrefsNode(EDCDebugger.getPrefs(EDCTestPlugin.PLUGIN_ID));
		setPresentationContext(new PresentationContext(VIEW_ID));
		setDataModel(new K9DataModel());
		setViewModel(new K9ViewModel());
		getViewModel().buildViewModel();
		loadSettings();
		createRootComposite(parent);
		createRefreshAction();
		contributeToActionBars();
	}

	public SystemDMContainer getAllDogs() {
		return ((K9DataModel)getDataModel()).getAllDogs();
	}

	public SystemDMContainer getAllToys() {
		return ((K9DataModel)getDataModel()).getAllToys();
	}

}
