<!--
  The <metrics-analysis-runs-sk> custom element declaration. Displays a table with details about
  each completed and pending Metrics Analysis task.

  Attributes:
    defaultSize: The number of tasks to show per page, default 10.
    constrainByUser: Whether to show only tasks created by the logged-in user initially, default
      false.
    myRunsConstrainText: Button text to constrain by user, default "View only my runs".
    everyonesRunsConstrainText: Button text to disable constraining by user, default "View
      everyone's runs".

  Events:
    None.

  Methods:
    reload: queries for updated information on tasks.
    resetPagination: Moves to the first page of tasks.
    constrainRunsByUser: Toggles constrainByUser and reloads the appropriate data.
-->

<dom-module id="metrics-analysis-runs-sk">
  <style>
    paper-dialog {
      min-width: 200px;
      max-width: calc(100% - 10px);
    }
    table.runshistory {
      border-spacing: 0px;
    }
    tr.headers {
      background-color: #CCCCFF;
      text-align: center;
    }
    td.nowrap {
      white-space: nowrap;
    }
    table.runshistory > tbody > tr > td {
      padding: 10px;
      border: solid black 1px;
    }
    .delete-button, .redo-button {
      --paper-icon-button-disabled: {
        display: none;
      }
    }
  </style>
  <template>

    <confirm-dialog-sk id="confirm_dialog"></confirm-dialog-sk>

    <h2><template is="dom-if" if="{{constrainByUser}}">My </template>Metrics Analysis Runs</h2>
    <paging-sk pagination="{{pagination}}" on-pagechange="pageChangedHandler"></paging-sk>
    <br/>
    <paper-button raised on-click="constrainRunsByUser">{{
      constrainButtonText(constrainByUser, myRunsConstrainText, everyonesRunsConstrainText)
      }}</paper-button>

    <br/>
    <br/>

    <!-- Section for popups. -->
    <template is="dom-repeat" items="{{metricsAnalysisTasks}}" as="metricsAnalysisTask" index-as="index">

      <paper-dialog heading="Benchmark Args" id="{{ getBenchmarkArgsId(index) }}">
        <paper-dialog-scrollable>
          <pre>{{metricsAnalysisTask.BenchmarkArgs}}</pre>
        </paper-dialog-scrollable>
      </paper-dialog>

    </template>

    <table class="runshistory" id="runshistory" cellpadding="5" border="1">
      <tr class="headers">
        <td>Id</td>
        <td>User</td>
        <td>Timestamps</td>
        <td>Task Config</td>
        <td>Description</td>
        <td>Results</td>
        <td>Arguments</td>
        <td>Patches</td>
        <td>Task Repeats</td>
      </tr>

      <template is="dom-repeat" items="{{metricsAnalysisTasks}}" as="metricsAnalysisTask" index-as="index">
        <tr style="border: 1px solid black;">
          <!-- Id col -->
          <td class="nowrap">
            <template is="dom-if" if="{{metricsAnalysisTask.RawOutput}}">
              <a href="{{metricsAnalysisTask.RawOutput}}" target="_blank">{{metricsAnalysisTask.Id}}</a>
            </template>
            <template is="dom-if" if="{{!metricsAnalysisTask.RawOutput}}">
              <span>{{metricsAnalysisTask.Id}}</span>
            </template>
            <paper-icon-button icon="delete" mini
                               class="delete-button"
                               disabled="{{!metricsAnalysisTask.canDelete}}"
                               alt="Delete"
                               data-index$="{{index}}"
                               data-type="delete">
            </paper-icon-button>
            <paper-icon-button icon="redo" mini
                               class="redo-button"
                               disabled="{{!metricsAnalysisTask.canRedo}}"
                               alt="Redo"
                               data-index$="{{index}}"
                               data-type="redo">
            </paper-icon-button>
          </td>

          <!-- User col -->
          <td>{{metricsAnalysisTask.Username}}</td>

          <!-- Timestamps col -->
          <td>
            <table>
              <tr>
                <td>Added:</td>
                <td class="nowrap">{{ formatTimestamp(metricsAnalysisTask.TsAdded) }}</td>
              </tr>
              <tr>
                <td>Started:</td>
                <td class="nowrap">{{ formatTimestamp(metricsAnalysisTask.TsStarted) }}</td>
              </tr>
              <tr>
                <td>Completed:</td>
                <td class="nowrap">{{ formatTimestamp(metricsAnalysisTask.TsCompleted) }}</td>
              </tr>
            </table>
          </td>

          <!-- Task Config col -->
          <td>
            <table>
              <tr>
                <td class="nowrap">Metric Name:</td>
                <td class="nowrap">{{metricsAnalysisTask.MetricName}}</td>
              </tr>
              <template is="dom-if" if="{{metricsAnalysisTask.ValueColumnName}}">
                <tr>
                  <td class="nowrap">Value Column:</td>
                  <td class="nowrap">{{metricsAnalysisTask.ValueColumnName}}</td>
                </tr>
              </template>
              <template is="dom-if" if="{{metricsAnalysisTask.AnalysisOutputLink}}">
                <tr>
                  <td class="nowrap">Analysis Task Id:</td>
                  <td class="nowrap">
                    <a href="{{metricsAnalysisTask.AnalysisOutputLink}}" target="_blank">{{metricsAnalysisTask.AnalysisTaskId}}</a>
                  </td>
                </tr>
              </template>
              <template is="dom-if" if="{{ !isEmptyPatch(metricsAnalysisTask.CustomTracesGSPath) }}">
                <tr>
                  <td class="nowrap">Custom Traces:</td>
                  <td class="nowrap">
                    <a href="{{ getGSLink(metricsAnalysisTask.CustomTracesGSPath) }}" target="_blank">traces</a>
                  </td>
                </tr>
              </template>
              <template is="dom-if" if="{{metricsAnalysisTask.TaskPriority}}">
                <tr>
                  <td>TaskPriority:</td>
                  <td>{{metricsAnalysisTask.TaskPriority}}</td>
                </tr>
              </template>
              <template is="dom-if" if="{{metricsAnalysisTask.CCList}}">
                <tr>
                  <td>CC List:</td>
                  <td>{{metricsAnalysisTask.CCList}}</td>
                </tr>
              </template>
            </table>
          </td>

          <!-- Description col -->
          <td>{{metricsAnalysisTask.Description}}</td>

          <!-- Results col -->
          <td class="nowrap">
            <template is="dom-if" if="{{metricsAnalysisTask.Failure}}">
              <div style="color:red;">Failed</div>
            </template>
            <template is="dom-if" if="{{!metricsAnalysisTask.TaskDone}}">
              <div style="color:green;">Waiting</div>
            </template>
            <template is="dom-if" if="{{metricsAnalysisTask.RawOutput}}">
              <a href="{{metricsAnalysisTask.RawOutput}}" target="_blank">Output</a>
            </template>
            <template is="dom-if" if="{{metricsAnalysisTask.SwarmingLogs}}">
              <br/>
              <a href="{{metricsAnalysisTask.SwarmingLogs}}" target="_blank">Swarming Logs</a>
            </template>
          </td>

          <!-- Arguments -->
          <td class="nowrap">
            <template is="dom-if" if="{{metricsAnalysisTask.BenchmarkArgs}}">
              <a href="javascript:void(0);" data-index$="{{index}}" data-type="benchmarkArgs">Benchmark Args</a>
              <br/>
            </template>
          </td>

          <!-- Patches -->
          <td>
            <template is="dom-if" if="{{ !isEmptyPatch(metricsAnalysisTask.ChromiumPatchGSPath) }}">
              <a href="{{ getGSLink(metricsAnalysisTask.ChromiumPatchGSPath) }}" target="_blank">Chromium</a>
              <br/>
            </template>
            <template is="dom-if" if="{{ !isEmptyPatch(metricsAnalysisTask.CatapultPatchGSPath) }}">
              <a href="{{ getGSLink(metricsAnalysisTask.CatapultPatchGSPath) }}" target="_blank">Catapult</a>
              <br/>
            </template>
          </td>

          <!-- Task Repeats -->
          <td>{{ formatRepeatAfterDays(metricsAnalysisTask.RepeatAfterDays) }}</td>

        </tr>
      </template>
    </table>

  </template>
</dom-module>

<script>
   Polymer({
     is: "metrics-analysis-runs-sk",
     properties: {
       metricsAnalysisTasks: {
         type: Array,
         value: function() { return []; },
       },
       defaultSize: {
         type: Number,
         value: 10,
       },
       constrainByUser: {
         type: Boolean,
         value: false,
       },
       myRunsConstrainText: {
         type: String,
         value: "View only my runs",
       },
       everyonesRunsConstrainText: {
         type: String,
         value: "View everyone's runs",
       },
       pagination: {
         type: Object,
         value: function() { return {}; },
       },
       pageChangedHandler: {
         type: Object,
         value: function() { return null; },
       },
     },

     ready: function() {
       this.pagination = {"offset": 0, "size": this.defaultSize};
       this.pageChangedHandler = this.reload.bind(this);
       this.reload();

       var that = this;
       this.$.runshistory.addEventListener('click', function(e) {
         var anchor = sk.findParent(e.target, "A");
         if (anchor != null) {
           var id = anchor.dataset.index;
           if (anchor.dataset.type == "benchmarkArgs") {
             that.toggleDialog(that.getBenchmarkArgsId(id));
           }
         }
         var button = sk.findParent(e.target, "PAPER-ICON-BUTTON");
         if (button != null) {
           if (button.dataset.type == "delete") {
             var index = button.dataset.index;
             that.$.confirm_dialog.open("Proceed with deleting task?")
               .then(that.deleteTask.bind(that, index));
           } else if (button.dataset.type == "redo") {
             var index = button.dataset.index;
             that.$.confirm_dialog.open("Reschedule this task?")
               .then(that.redoTask.bind(that, index));
           }
         }
       });
     },

     reload: function() {
       var queryParams = {
         "offset": this.pagination.offset,
         "size": this.pagination.size,
       }
       if (this.constrainByUser) {
         queryParams["filter_by_logged_in_user"] = true;
       }
       var queryStr = "?" + sk.query.fromObject(queryParams);
       var that = this;
       sk.post('/_/get_metrics_analysis_tasks' + queryStr).then(JSON.parse).then(function(json) {
         that.metricsAnalysisTasks = json.data;
         that.pagination = json.pagination;
         for (var i = 0; i < that.metricsAnalysisTasks.length; i++) {
           that.metricsAnalysisTasks[i].canDelete = json.permissions[i].DeleteAllowed;
           that.metricsAnalysisTasks[i].canRedo = json.permissions[i].RedoAllowed;
           that.metricsAnalysisTasks[i].Id = json.ids[i];
         }
       }).catch(sk.errorMessage);
     },

     getBenchmarkArgsId: function(index) {
       return "benchmark_args" + index;
     },

     resetPagination: function() {
       this.pagination.offset = 0;
       this.pagination.size = this.defaultSize;
     },

     constrainRunsByUser: function() {
       this.constrainByUser = !this.constrainByUser;
       this.resetPagination();
       this.reload();
     },

     constrainButtonText: function(constrained, constrainText, unconstrainText) {
       if (constrained) {
         return unconstrainText;
       } else {
         return constrainText;
       }
     },

     toggleDialog: function(id) {
       Polymer.dom(this.root).querySelector('#' + id).toggle();
     },

     deleteTask: function(deleteIndex) {
       var params = {};
       params["id"] = this.metricsAnalysisTasks[deleteIndex].Id;
       sk.post("/_/delete_metrics_analysis_task", JSON.stringify(params)).then(function() {
         $$$("#confirm_toast").text = "Deleted task " + params["id"];
         $$$("#confirm_toast").show();
       }.bind(this)).catch(sk.errorMessage).then(function() {
         this.reload();
       }.bind(this));
     },

     redoTask: function(redoIndex) {
       var params = {};
       params["id"] = this.metricsAnalysisTasks[redoIndex].Id;
       sk.post("/_/redo_metrics_analysis_task", JSON.stringify(params)).then(function() {
         $$$("#confirm_toast").text = "Resubmitted task " + params["id"];
         $$$("#confirm_toast").show();
       }.bind(this)).catch(sk.errorMessage).then(function() {
         this.reload();
       }.bind(this));
     },

     formatTimestamp: ctfe.getFormattedTimestamp,
     formatRepeatAfterDays: ctfe.formatRepeatAfterDays,
     getGSLink: ctfe.getGSLink,
     isEmptyPatch: ctfe.isEmptyPatch,
  });
</script>
