package de.swm.mobile.kitchensink.client.showcase.panels;

import java.util.ArrayList;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.Widget;

import de.swm.commons.mobile.client.utils.Utils;
import de.swm.commons.mobile.client.widgets.HeaderPanel;
import de.swm.commons.mobile.client.widgets.tree.DefaultTreeImpl;
import de.swm.commons.mobile.client.widgets.tree.DefaultTreeNodeImpl;
import de.swm.commons.mobile.client.widgets.tree.ITree;
import de.swm.commons.mobile.client.widgets.tree.ITreeNode;
import de.swm.commons.mobile.client.widgets.tree.TreeChangedEvent;
import de.swm.commons.mobile.client.widgets.tree.TreeChangedHandler;
import de.swm.commons.mobile.client.widgets.tree.WideTreePanel;
import de.swm.mobile.kitchensink.client.Application;
import de.swm.mobile.kitchensink.client.base.ShowcaseDetailPage;
import de.swm.mobile.kitchensink.client.theme.icon.IconResources;
import static de.swm.mobile.kitchensink.client.ShowcaseAnnotations.ShowcaseSource;
import static de.swm.mobile.kitchensink.client.ShowcaseAnnotations.ShowcaseUiXML;

@ShowcaseSource
@ShowcaseUiXML({"WideTreePanelPage.ui.xml"})
public class WideTreePanelPage extends ShowcaseDetailPage {

	private static WideTreePanelPageUiBinder uiBinder = GWT.create(WideTreePanelPageUiBinder.class);

    interface WideTreePanelPageUiBinder extends UiBinder<Widget, WideTreePanelPage> {
	}

	@UiField
	HTMLPanel content;
	@UiField
	HeaderPanel header;
	@UiField
	WideTreePanel treePanel;

	interface ItemStyle extends CssResource {
		String specialItem();
	}

	@UiField
	ItemStyle style;

	private IconResources res;

	public WideTreePanelPage() {
        super(WideTreePanelPage.class);
		initWidget(uiBinder.createAndBindUi(this));
		Application.addDefaultBackButtonHanlder(header);
		res = GWT.create(IconResources.class);
		treePanel.addTreeChangedHandler(new TreeChangedHandler() {

			@Override
			public void onTreeChanged(TreeChangedEvent e) {
				String selectedTree = "Unknown";
				ITree tree = e.getNewRoot();
				if (tree != null) {
					ITreeNode node = tree.getNode();
					selectedTree = node.getHeader();
				}
				switch (e.getType()) {
				case BACK_EVENT:
					Utils.console("back event received, selected tree is: " + selectedTree);
					break;
				case INIT_COMPLETE:
					Utils.console("tree initialized");
					break;
				case CHILD_SELECTED:
					Utils.console("tree selected: " + selectedTree);
					break;
				default:
					break;
				}
			}
		});

		treePanel.setTree(createTree());
	}

    @Override
    public HeaderPanel getHeaderPanel() {
        return header;
    }

	@Override
	public String getName() {
		return "Wide tree panel";
	}

	private ITree createTree() {
		ITreeNode root = new DefaultTreeNodeImpl("Root", null);
		ITree result = new DefaultTreeImpl(root, null);

		List<ITree> childTrees = new ArrayList<ITree>();
		for (int i = 0; i < 20; i++) {
			DefaultTreeImpl childTree = new DefaultTreeImpl(
					new DefaultTreeNodeImpl("Subtree_" + i, null, res.folder(), res.folder_bookmark()), result);
			childTrees.add(childTree);

			List<ITree> childChildTrees = new ArrayList<ITree>();
			for (int j = 0; j < 20; j++) {
				DefaultTreeImpl childChildTree = new DefaultTreeImpl(new DefaultTreeNodeImpl("Subsubtree_" + i + "_"
						+ j, null, res.folder(), res.folder_bookmark()), childTree);
				childChildTrees.add(childChildTree);

				List<ITree> leaves = new ArrayList<ITree>();
				for (int k = 0; k < 20; k++) {
					String styleName = null;
					if (k % 3 == 0) {
						styleName = style.specialItem();
					}
					DefaultTreeImpl leafTree = new DefaultTreeImpl(new DefaultTreeNodeImpl("Child_" + i + "_" + j + "_"
							+ k, styleName, res.leaf()), childChildTree);
					leaves.add(leafTree);
				}
				childChildTree.appendChildren(leaves);
			}

			childTree.appendChildren(childChildTrees);
		}
		result.appendChildren(childTrees);

		return result;
	}

}