/*
 * Copyright 2008 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.sample.showcase.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.prefetch.Prefetcher;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.HeadElement;
import com.google.gwt.dom.client.LinkElement;
import com.google.gwt.event.logical.shared.OpenEvent;
import com.google.gwt.event.logical.shared.OpenHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.sample.showcase.client.MainMenuTreeViewModel.Category;
import com.google.gwt.user.cellview.client.CellTree;
import com.google.gwt.user.cellview.client.TreeNode;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.RootLayoutPanel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SingleSelectionModel;

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

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class Showcase implements EntryPoint {
  /**
   * The type passed into the
   * {@link com.google.gwt.sample.showcase.generator.ShowcaseGenerator}.
   */
  private static final class GeneratorInfo {
  }

  /**
   * The static images used throughout the Showcase.
   */
  public static final ShowcaseResources images = GWT.create(
      ShowcaseResources.class);

  /**
   * Get the token for a given content widget.
   *
   * @return the content widget token.
   */
  public static String getContentWidgetToken(ContentWidget content) {
    return getContentWidgetToken(content.getClass());
  }

  /**
   * Get the token for a given content widget.
   *
   * @return the content widget token.
   */
  public static <C extends ContentWidget> String getContentWidgetToken(
      Class<C> cwClass) {
    String className = cwClass.getName();
    className = className.substring(className.lastIndexOf('.') + 1);
    return "!" + className;
  }

  /**
   * The main application shell.
   */
  private ShowcaseShell shell;

  /**
   * This is the entry point method.
   */
  public void onModuleLoad() {
    // Generate the source code and css for the examples
    GWT.create(GeneratorInfo.class);

    // Inject global styles.
    injectThemeStyleSheet();
    images.css().ensureInjected();

    // Initialize the constants.
    ShowcaseConstants constants = GWT.create(ShowcaseConstants.class);

    // Create the application shell.
    final SingleSelectionModel<ContentWidget> selectionModel = new SingleSelectionModel<ContentWidget>();
    final MainMenuTreeViewModel treeModel = new MainMenuTreeViewModel(
        constants, selectionModel);
    Set<ContentWidget> contentWidgets = treeModel.getAllContentWidgets();
    shell = new ShowcaseShell(treeModel);
    RootLayoutPanel.get().add(shell);

    // Prefetch examples when opening the Category tree nodes.
    final List<Category> prefetched = new ArrayList<Category>();
    final CellTree mainMenu = shell.getMainMenu();
    mainMenu.addOpenHandler(new OpenHandler<TreeNode>() {
      public void onOpen(OpenEvent<TreeNode> event) {
        Object value = event.getTarget().getValue();
        if (!(value instanceof Category)) {
          return;
        }

        Category category = (Category) value;
        if (!prefetched.contains(category)) {
          prefetched.add(category);
          Prefetcher.prefetch(category.getSplitPoints());
        }
      }
    });

    // Always prefetch.
    Prefetcher.start();

    // Change the history token when a main menu item is selected.
    selectionModel.addSelectionChangeHandler(
        new SelectionChangeEvent.Handler() {
          public void onSelectionChange(SelectionChangeEvent event) {
            ContentWidget selected = selectionModel.getSelectedObject();
            if (selected != null) {
              History.newItem(getContentWidgetToken(selected), true);
            }
          }
        });

    // Setup a history handler to reselect the associate menu item.
    final ValueChangeHandler<String> historyHandler = new ValueChangeHandler<
        String>() {
      public void onValueChange(ValueChangeEvent<String> event) {
        // Get the content widget associated with the history token.
        ContentWidget contentWidget = treeModel.getContentWidgetForToken(
            event.getValue());
        if (contentWidget == null) {
          return;
        }

        // Expand the tree node associated with the content.
        Category category = treeModel.getCategoryForContentWidget(
            contentWidget);
        TreeNode node = mainMenu.getRootTreeNode();
        int childCount = node.getChildCount();
        for (int i = 0; i < childCount; i++) {
          if (node.getChildValue(i) == category) {
            node.setChildOpen(i, true, true);
            break;
          }
        }

        // Select the node in the tree.
        selectionModel.setSelected(contentWidget, true);

        // Display the content widget.
        displayContentWidget(contentWidget);
      }
    };
    History.addValueChangeHandler(historyHandler);

    // Show the initial example.
    if (History.getToken().length() > 0) {
      History.fireCurrentHistoryState();
    } else {
      // Use the first token available.
      TreeNode root = mainMenu.getRootTreeNode();
      TreeNode category = root.setChildOpen(0, true);
      ContentWidget content = (ContentWidget) category.getChildValue(0);
      selectionModel.setSelected(content, true);
    }

    // Generate a site map.
    createSiteMap(contentWidgets);
  }

  /**
   * Create a hidden site map for crawlability.
   * 
   * @param contentWidgets the {@link ContentWidget}s used in Showcase
   */
  private void createSiteMap(Set<ContentWidget> contentWidgets) {
    SafeHtmlBuilder sb = new SafeHtmlBuilder();
    for (ContentWidget cw : contentWidgets) {
      String token = getContentWidgetToken(cw);
      sb.append(SafeHtmlUtils.fromTrustedString("<a href=\"#" + token + "\">"
          + token + "</a>"));
    }

    // Add the site map to the page.
    HTML siteMap = new HTML(sb.toSafeHtml());
    siteMap.setVisible(false);
    RootPanel.get().add(siteMap, 0, 0);
  }
  
  /**
   * Set the content to the {@link ContentWidget}.
   *
   * @param content the {@link ContentWidget} to display
   */
  private void displayContentWidget(ContentWidget content) {
    if (content == null) {
      return;
    }

    shell.setContent(content);
    Window.setTitle("Showcase of Features: " + content.getName());
  }

  /**
   * Convenience method for getting the document's head element.
   *
   * @return the document's head element
   */
  private native HeadElement getHeadElement() /*-{
    return $doc.getElementsByTagName("head")[0];
  }-*/;

  /**
   * Inject the GWT theme style sheet based on the RTL direction of the current
   * locale.
   */
  private void injectThemeStyleSheet() {
    // Choose the name style sheet based on the locale.
    String styleSheet = "gwt/standard/standard";
    styleSheet += LocaleInfo.getCurrentLocale().isRTL() ? "_rtl.css" : ".css";

    // Load the GWT theme style sheet
    String modulePath = GWT.getModuleBaseURL();
    LinkElement linkElem = Document.get().createLinkElement();
    linkElem.setRel("stylesheet");
    linkElem.setType("text/css");
    linkElem.setHref(modulePath + styleSheet);
    getHeadElement().appendChild(linkElem);
  }
}
