<!--
  The <drawer-sk> custom element declaration. Displays a menu of the CT pages.

  Attributes:
    None.

  Events:
    None.

  Methods:
    None.
-->

<dom-module id="drawer-sk">
  <style>
    paper-menu {
      padding: 15px 0px 0px 10px;
    }
    paper-item {
      cursor: pointer;
    }
  </style>
  <template>

    <paper-menu id="menu" theme="core-light-theme" selected="{{selected}}">

      <paper-item data-href="/chromium_perf/">
        <iron-icon icon="trending-up" class="right_padded"></iron-icon>
        Performance
      </paper-item>

      <paper-item data-href="/chromium_analysis/">
        <iron-icon icon="icons:search" class="right_padded"></iron-icon>
        Analysis
      </paper-item>

      <paper-item data-href="/metrics_analysis/">
        <iron-icon icon="icons:assessment" class="right_padded"></iron-icon>
        Metrics Analysis
      </paper-item>

      <paper-item data-href="/lua_script/">
        <iron-icon icon="cloud" class="right_padded"></iron-icon>
        Lua Scripts
      </paper-item>

      <template is="dom-if" if="{{isAdmin}}">

        <paper-item data-href="/capture_skps/">
          <iron-icon icon="image:photo-camera" class="right_padded"></iron-icon>
          SkPictures
        </paper-item>

        <paper-item data-href="/chromium_builds/">
          <iron-icon icon="shopping-cart" class="right_padded"></iron-icon>
          Builds
        </paper-item>

        <paper-item data-href="/admin_tasks/">
          <iron-icon icon="social:person" class="right_padded"></iron-icon>
          Admin Tasks
        </paper-item>

      </template>

      <paper-item data-href="/queue/">
        <iron-icon icon="reorder" class="right_padded"></iron-icon>
        View Queue (<b>{{sizeOfQueue}}</b>)
      </paper-item>

      <paper-item data-href="/history/">
        <iron-icon icon="history" class="right_padded"></iron-icon>
        Runs  History
      </paper-item>

      <paper-item data-href="https://github.com/google/skia-buildbot/tree/master/ct">
        <iron-icon icon="folder" class="right_padded"></iron-icon>
        Code
      </paper-item>

      <paper-item data-href="https://www.chromium.org/developers/cluster-telemetry">
        <iron-icon icon="help" class="right_padded"></iron-icon>
        Docs
      </paper-item>

    </paper-menu>
  </template>
</dom-module>

<script>
  Polymer({
    is: "drawer-sk",
    properties: {
      selected: {
        type: String,
        value: "",
        observer: "selectedChanged",
      },
      isAdmin: {
        type: Boolean,
        value: false,
      },
      sizeOfQueue: {
        type: Number,
        value: 0,
      },
      sizeOfUserQueue: {
        type: Number,
        value: 0,
      },
      taskDescriptors: {
         type: Array,
         value: function() {
           return [{type: "ChromiumPerf",
                    get_url: "/_/get_chromium_perf_tasks"},
                   {type: "ChromiumAnalysis",
                    get_url: "/_/get_chromium_analysis_tasks"},
                   {type: "MetricsAnalysis",
                    get_url: "/_/get_metrics_analysis_tasks"},
                   {type: "CaptureSkps",
                    get_url: "/_/get_capture_skp_tasks"},
                   {type: "LuaScript",
                    get_url: "/_/get_lua_script_tasks"},
                   {type: "ChromiumBuild",
                    get_url: "/_/get_chromium_build_tasks"},
                   {type: "RecreatePageSets",
                    get_url: "/_/get_recreate_page_sets_tasks"},
                   {type: "RecreateWebpageArchives",
                    get_url: "/_/get_recreate_webpage_archives_tasks"},
                  ];
         }
       },
    },

    ready: function() {
      this.initSelected();
      this.initSizeOfQueue();
      this.initSizeOfUserQueue();
      this.initIsAdmin();
    },

    initIsAdmin: function() {
      var is_admin_url = "/_/is_admin/"
      sk.get(is_admin_url).then(JSON.parse).then(function(json) {
        this.isAdmin = json.isAdmin;
      }.bind(this)).catch(sk.errorMessage);
    },

    initSizeOfQueue: function() {
      var queryParams = {
         "size": 1,
         "not_completed": true,
      }
      var queryStr = "?" + sk.query.fromObject(queryParams);
      this.taskDescriptors.forEach(function(obj) {
         sk.post(obj.get_url + queryStr).then(JSON.parse).then(function(json) {
           this.sizeOfQueue += json.pagination.total;
         }.bind(this)).catch(sk.errorMessage);
       }.bind(this));
    },

    initSizeOfUserQueue: function() {
      var queryParams = {
         "size": 1,
         "not_completed": true,
         "filter_by_logged_in_user": true,
      }
      var queryStr = "?" + sk.query.fromObject(queryParams);
      this.taskDescriptors.forEach(function(obj) {
         sk.post(obj.get_url + queryStr).then(JSON.parse).then(function(json) {
           this.sizeOfUserQueue += json.pagination.total;
         }.bind(this)).catch(sk.errorMessage);
       }.bind(this));
    },

    initSelected: function() {
      var items = $$("paper-item", this.$.menu);
      var historyIdx;
      for (var i = 0; i < items.length; i++) {
        var ele = items[i];
        if (window.location.href.endsWith(ele.dataset["href"])) {
          this.selected = String(i);
          return;
        }
        if (ele.dataset["href"] == "/history/") {
          historyIdx = i;
        }
      }
      // Special cases.
      if (historyIdx && window.location.href.endsWith("_runs/")) {
        this.selected = String(historyIdx);
        return;
      }
      this.selected = "0";
    },

    selectedChanged: function(newValue, oldValue) {
      if (!oldValue || oldValue == "") {
        return;
      }
      window.location.href = this.$.menu.focusedItem.dataset["href"];
    },
  });
</script>
