<!--
  Copyright 2016 The LUCI Authors. All rights reserved.
  Use of this source code is governed under the Apache License, Version 2.0
  that can be found in the LICENSE file.
-->

<link rel="import" href="../bower_components/app-router/app-router.html">
<link rel="import" href="../bower_components/polymer/polymer.html">
<link rel="import"
    href="../bower_components/html5-history-anchor/html5-history-anchor.html">
<link rel="stylesheet"
    href="https://fonts.googleapis.com/css?family=Roboto:400,300,300italic,400italic,500,500italic,700,700italic">
<link rel="import"
    href="../bower_components/google-signin/google-signin-aware.html">
<link rel="import" href="../bower_components/paper-spinner/paper-spinner.html">

<link rel="import" href="../rpc/rpc-client.html">

<link rel="import" href="rpc-descriptor-util.html">
<link rel="import" href="rpc-method.html">
<link rel="import" href="rpc-service-list.html">
<link rel="import" href="rpc-service.html">
<link rel="import" href="../auth/auth-signin.html">

<!-- The `rpc-explorer` is the top-level element of RPC Explorer -->
<dom-module id="rpc-explorer">
  <template>
    <style>
      li[hidden] {
        display: none;
      }
      :host {
        font-family: 'RobotoDraft','Roboto',arial,sans-serif;
      }
      #signinContainer {
        margin-right: 10px;
        margin-top: 10px;
      }
      #loadingContainer {
        text-align: center;
      }
    </style>

    <!-- Load server description -->
    <rpc-client
        auto
        service="discovery.Discovery"
        method="Describe"
        last-response="{{serverDescription}}"
        loading="{{loadingDescription}}">
    </rpc-client>

    <div class="navbar navbar-default" role="navigation">
      <div class="navbar-header">
        <button
            class="navbar-toggle collapsed"
            data-toggle="collapse"
            aria-expanded="false">
          <span class="sr-only">Toggle navigation</span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
        </button>
        <span class="navbar-brand">
          <span id="progress-spinner" class="not-spinning">
            <a is="html5-history-anchor" pushstate popstate
                href="[[explorerRootPath]]">RPC Explorer</a>
          </span>
        </span>
      </div>

      <div class="navbar-collapse collapse">
        <div class="nav navbar-nav navbar-right">
          <div id="signinContainer">
            <auth-signin default-client-id="[[defaultClientId]]"></auth-signin>
          </div>
        </div>
      </div>

    </div>

    <ol class="breadcrumb">
      <li>
        <a is="html5-history-anchor" pushstate popstate
            href="[[explorerRootPath]]/services/">Home</a>
      </li>
      <li hidden="[[!service]]">
        <a is="html5-history-anchor" pushstate popstate
            href="[[explorerRootPath]]/services/[[service]]/">[[service]]</a>
      </li>
      <li hidden="[[!method]]">
        <a is="html5-history-anchor" pushstate popstate
            href="[[explorerRootPath]]/services/[[service]]/[[method]]">
          [[method]]
        </a>
      </li>
    </ol>

    <template is="dom-if" if="[[loadingDescription]]">
      <div id="loadingContainer">
        <paper-spinner alt="Loading description" active></paper-spinner>
      </div>
    </template>

    <app-router
        id="router"
        mode="pushstate"
        on-activate-route-end="_onRouted"
        on-before-data-binding="_onRouteBinding"
        hidden="[[loadingDescription]]">
      <!--
        "path" attributes in <app-route> elements are set dynamically, but
        unless we set them to a string, app-router prints errors to the console.
      -->
      <app-route id="servicesRoute" path="" element="rpc-service-list">
      </app-route>
      <app-route id="serviceRoute" path="" element="rpc-service"></app-route>
      <app-route id="methodRoute" path="" element="rpc-method"></app-route>
      <app-route id="catchAllRoute" path="*"></app-route>
    </app-router>
  </template>

  <script>
    'use strict';

    Polymer({
      is: 'rpc-explorer',

      properties: {
        explorerRootPath: {
          type: String,
          value: '',
          observer: '_onExplorerRootPathChanged'
        },

        defaultClientId: String,

        service: String,

        method: String,

        /** @type {DescribeResponse} */
        serverDescription: {
          type: Object,
          observer: '_onServerDescriptionChanged'
        }
      },

      _onExplorerRootPathChanged: function (newVal) {
        // The app-router element does not like data-binding in its attributes
        // so we update their values manually.
        var explorerRootPath = newVal || '',
            servicesPath = explorerRootPath + '/services/',
            servicePath = servicesPath + ':service/',
            methodPath = servicePath + ':method';
        this.$.servicesRoute.setAttribute('path', servicesPath);
        this.$.serviceRoute.setAttribute('path', servicePath);
        this.$.methodRoute.setAttribute('path', methodPath);
        this.$.catchAllRoute.setAttribute('redirect', servicesPath);
      },

      _onRouteBinding: function(e) {
        if (this.serverDescription) {
          e.detail.model.description = this.serverDescription.description;
          e.detail.model.serviceNames = this.serverDescription.services;
        }
      },

      _onServerDescriptionChanged: function(e) {
        if (this.serverDescription) {
          rpcExplorer.descUtil.annotateSet(this.serverDescription.description);
          // Recreate route model.
          this.$.router.go(document.location.toString());
        }
      },

      _onRouted: function(e) {
        var model = e.detail.model || {};
        this.service = model.service || '';
        this.method = model.method || '';
      }
    });
  </script>
</dom-module>
