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

import com.google.gwt.core.client.GWT;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import de.swm.commons.mobile.client.widgets.HeaderPanel;
import de.swm.commons.mobile.client.widgets.VerticalPanel;
import de.swm.commons.mobile.client.widgets.tree.*;
import de.swm.commons.mobile.client.widgets.tree.ITreeNode.ITreeNodeDisplay;
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 java.util.ArrayList;
import java.util.List;

import static de.swm.mobile.kitchensink.client.ShowcaseAnnotations.ShowcaseSource;
import static de.swm.mobile.kitchensink.client.ShowcaseAnnotations.ShowcaseUiXML;

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

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


    interface TreePanelPageUiBinder extends UiBinder<Widget, TreePanelPage> {
    }

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

    private IconResources res;

    public TreePanelPage() {
        super(TreePanelPage.class);
        res = GWT.create(IconResources.class);
        initWidget(uiBinder.createAndBindUi(this));
        Application.addDefaultBackButtonHanlder(header);
        treePanel.setTree(createTree());
    }

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

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

    private class CustomNodeDisplay extends VerticalPanel implements ITreeNodeDisplay {

        Label header = new Label("-");

        public CustomNodeDisplay() {
            add(new HTML("<i>Custom Display</i>"));
            add(header);
        }

        @Override
        public void setNode(ITreeNode node) {
            header.setText(node.getHeader());
        }

    }

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

        ITreeNodeDisplay nodeDisplay = new CustomNodeDisplay();

        List<ITree> childTrees = new ArrayList<ITree>();
        for (int i = 0; i < 20; i++) {
            DefaultTreeImpl childTree = new DefaultTreeImpl(new DefaultTreeNodeImpl("Subtree_" + i, null, res.folder()), 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()), childTree);
                childChildTrees.add(childChildTree);

                List<ITree> leaves = new ArrayList<ITree>();
                for (int k = 0; k < 20; k++) {
                    DefaultTreeNodeImpl node = new DefaultTreeNodeImpl("Child_" + i + "_" + j + "_" + k, null, res.leaf());
                    node.setDisplay(nodeDisplay);
                    DefaultTreeImpl leafTree = new DefaultTreeImpl(node, childChildTree);
                    leaves.add(leafTree);
                }
                childChildTree.appendChildren(leaves);
            }

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

        return result;
    }

}