<!--
  The <chromium-analysis-runs-sk> custom element declaration. Displays a table with details about
  each completed and pending Chromium 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".
    constrainByTestRun: Whether to show only non-test tasks, default true. Test tasks are those that
      use the "Dummy1k" page sets.
    nonTestRunsConstrainText: Button text to constrain to non-test tasks, default "Exclude test
      runs".
    testRunsConstrainText: Button text to disable constraining by test tasks, default "Include test
      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.
    constrainTestRuns: Toggles constrainByTestRun and reloads the appropriate data.
-->

<dom-module id="chromium-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;
      }
    }
    .oldruns {
      margin-left: 20px;
    }
  </style>
  <template>

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

    <h2><template is="dom-if" if="{{constrainByUser}}">My </template>Chromium 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>
    <paper-button raised on-click="constrainTestRuns">{{
      constrainButtonText(constrainByTestRun, nonTestRunsConstrainText, testRunsConstrainText)
      }}</paper-button>

    <br/>
    <br/>

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

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

      <paper-dialog heading="Browser Args" id="{{ getBrowserArgsId(index) }}">
        <paper-dialog-scrollable>
          <pre>{{chromiumAnalysisTask.BrowserArgs}}</pre>
        </paper-dialog-scrollable>
      </paper-dialog>

      <paper-dialog heading="Match Stdout Text" id="{{ getMatchStdoutTxtId(index) }}">
        <paper-dialog-scrollable>
          <pre>{{chromiumAnalysisTask.MatchStdoutTxt}}</pre>
        </paper-dialog-scrollable>
      </paper-dialog>

      <paper-dialog heading="Custom APK Location" id="{{ getApkGsPathId(index) }}">
        <paper-dialog-scrollable>
          <pre>{{chromiumAnalysisTask.ApkGsPath}}</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="{{chromiumAnalysisTasks}}" as="chromiumAnalysisTask" index-as="index">
        <tr style="border: 1px solid black;">
          <!-- Id col -->
          <td class="nowrap">
            <template is="dom-if" if="{{chromiumAnalysisTask.RawOutput}}">
              <a href="{{chromiumAnalysisTask.RawOutput}}" target="_blank">{{chromiumAnalysisTask.Id}}</a>
            </template>
            <template is="dom-if" if="{{!chromiumAnalysisTask.RawOutput}}">
              <span>{{chromiumAnalysisTask.Id}}</span>
            </template>
            <paper-icon-button icon="delete" mini
                               class="delete-button"
                               disabled="{{!chromiumAnalysisTask.canDelete}}"
                               alt="Delete"
                               data-index$="{{index}}"
                               data-type="delete">
            </paper-icon-button>
            <paper-icon-button icon="redo" mini
                               class="redo-button"
                               disabled="{{!chromiumAnalysisTask.canRedo}}"
                               alt="Redo"
                               data-index$="{{index}}"
                               data-type="redo">
            </paper-icon-button>
          </td>

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

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

          <!-- Task Config col -->
          <td>
            <table>
              <tr>
                <td>Benchmark:</td>
                <td>{{chromiumAnalysisTask.Benchmark}}</td>
              </tr>
              <tr>
                <td>Platform:</td>
                <td>{{chromiumAnalysisTask.Platform}}</td>
              </tr>
              <tr>
                <td>RunOnGCE:</td>
                <td>{{chromiumAnalysisTask.RunOnGCE}}</td>
              </tr>
              <tr>
                <td>PageSet:</td>
                  <template is="dom-if" if="{{ !isEmptyPatch(chromiumAnalysisTask.CustomWebpagesGSPath) }}">
                    <a href="{{ getGSLink(chromiumAnalysisTask.CustomWebpagesGSPath) }}" target="_blank">Custom Webpages</a>
                  </template>
                  <template is="dom-if" if="{{ isEmptyPatch(chromiumAnalysisTask.CustomWebpagesGSPath) }}">
                    {{chromiumAnalysisTask.PageSets}}
                  </template>
                </td>
              </tr>
              <tr>
                <td>ParallelRun:</td>
                <td>{{chromiumAnalysisTask.RunInParallel}}</td>
              </tr>
              <template is="dom-if" if="{{chromiumAnalysisTask.ValueColumnName}}">
                <tr>
                  <td class="nowrap">Value Column:</td>
                  <td class="nowrap">{{chromiumAnalysisTask.ValueColumnName}}</td>
                </tr>
              </template>
              <template is="dom-if" if="{{chromiumAnalysisTask.TaskPriority}}">
                <tr>
                  <td>TaskPriority:</td>
                  <td>{{chromiumAnalysisTask.TaskPriority}}</td>
                </tr>
              </template>
              <template is="dom-if" if="{{chromiumAnalysisTask.CCList}}">
                <tr>
                  <td>CC List:</td>
                  <td>{{chromiumAnalysisTask.CCList}}</td>
                </tr>
              </template>
              <template is="dom-if" if="{{chromiumAnalysisTask.GroupName}}">
                <tr>
                  <td>GroupName:</td>
                  <td><a href="https://ct-perf.skia.org/e/?request_type=1">{{chromiumAnalysisTask.GroupName}}</a></td>
                </tr>
              </template>
              <template is="dom-if" if="{{chromiumAnalysisTask.ChromiumHash}}">
                <tr>
                  <td>ChromiumHash:</td>
                  <td><a href="https://chromium.googlesource.com/chromium/src/+show/{{chromiumAnalysisTask.ChromiumHash}}">{{chromiumAnalysisTask.ChromiumHash}}</a></td>
                </tr>
              </template>
              <template is="dom-if" if="{{chromiumAnalysisTask.ApkGsPath}}">
                <tr>
                  <td>ApkGsPath:</td>
                  <td><a href="javascript:void(0);" data-index$="{{index}}" data-type="apkGsPath">Display Path</a></td>
                </tr>
              </template>
              <template is="dom-if" if="{{chromiumAnalysisTask.TelemetryIsolateHash}}">
                <tr>
                  <td>TelemetryIsolateHash:</td>
                  <td><a href="https://chrome-isolated.appspot.com/browse?digest={{chromiumAnalysisTask.TelemetryIsolateHash}}">{{chromiumAnalysisTask.TelemetryIsolateHash}}</a></td>
                </tr>
              </template>
            </table>
          </td>

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

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

          <!-- Arguments -->
          <td class="nowrap">
            <template is="dom-if" if="{{chromiumAnalysisTask.BenchmarkArgs}}">
              <a href="javascript:void(0);" data-index$="{{index}}" data-type="benchmarkArgs">Benchmark Args</a>
              <br/>
            </template>
            <template is="dom-if" if="{{chromiumAnalysisTask.BrowserArgs}}">
              <a href="javascript:void(0);" data-index$="{{index}}" data-type="browserArgs">Browser Args</a>
              <br/>
            </template>
            <template is="dom-if" if="{{chromiumAnalysisTask.MatchStdoutTxt}}">
              <a href="javascript:void(0);" data-index$="{{index}}" data-type="matchStdoutTxt">Match Stdout Text</a>
              <br/>
            </template>
          </td>

          <!-- Patches -->
          <td>
            <template is="dom-if" if="{{ !isEmptyPatch(chromiumAnalysisTask.ChromiumPatchGSPath) }}">
              <a href="{{ getGSLink(chromiumAnalysisTask.ChromiumPatchGSPath) }}" target="_blank">Chromium</a>
              <br/>
            </template>
            <template is="dom-if" if="{{ !isEmptyPatch(chromiumAnalysisTask.SkiaPatchGSPath) }}">
              <a href="{{ getGSLink(chromiumAnalysisTask.SkiaPatchGSPath) }}" target="_blank">Skia</a>
              <br/>
            </template>
            <template is="dom-if" if="{{ !isEmptyPatch(chromiumAnalysisTask.V8PatchGSPath) }}">
              <a href="{{ getGSLink(chromiumAnalysisTask.V8PatchGSPath) }}" target="_blank">V8</a>
              <br/>
            </template>
            <template is="dom-if" if="{{ !isEmptyPatch(chromiumAnalysisTask.CatapultPatchGSPath) }}">
              <a href="{{ getGSLink(chromiumAnalysisTask.CatapultPatchGSPath) }}" target="_blank">Catapult</a>
              <br/>
            </template>
            <template is="dom-if" if="{{ !isEmptyPatch(chromiumAnalysisTask.BenchmarkPatchGSPath) }}">
              <a href="{{ getGSLink(chromiumAnalysisTask.BenchmarkPatchGSPath) }}" target="_blank">Telemetry</a>
            </template>
          </td>

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

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

  </template>
</dom-module>

<script>
   Polymer({
     is: "chromium-analysis-runs-sk",
     properties: {
       chromiumAnalysisTasks: {
         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",
       },
       constrainByTestRun: {
         type: Boolean,
         value: true,
       },
       nonTestRunsConstrainText: {
         type: String,
         value: "Exclude test runs",
       },
       testRunsConstrainText: {
         type: String,
         value: "Include test 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));
           } else if (anchor.dataset.type == "browserArgs") {
             that.toggleDialog(that.getBrowserArgsId(id));
           } else if (anchor.dataset.type == "matchStdoutTxt") {
             that.toggleDialog(that.getMatchStdoutTxtId(id));
           } else if (anchor.dataset.type == "apkGsPath") {
             that.toggleDialog(that.getApkGsPathId(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;
       }
       if (this.constrainByTestRun) {
         queryParams["exclude_dummy_page_sets"] = true;
       }
       var queryStr = "?" + sk.query.fromObject(queryParams);
       var that = this;
       sk.post('/_/get_chromium_analysis_tasks' + queryStr).then(JSON.parse).then(function(json) {
         that.chromiumAnalysisTasks = json.data;
         that.pagination = json.pagination;
         for (var i = 0; i < that.chromiumAnalysisTasks.length; i++) {
           that.chromiumAnalysisTasks[i].canDelete = json.permissions[i].DeleteAllowed;
           that.chromiumAnalysisTasks[i].canRedo = json.permissions[i].RedoAllowed;
           that.chromiumAnalysisTasks[i].Id = json.ids[i];
         }
       }).catch(sk.errorMessage);
     },

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

     getBrowserArgsId: function(index) {
       return "browser_args" + index;
     },

     getMatchStdoutTxtId: function(index) {
       return "match_stdout_txt" + index;
     },

     getApkGsPathId: function(index) {
       return "apk_gs_path" + index;
     },

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

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

     constrainTestRuns: function() {
       this.constrainByTestRun = !this.constrainByTestRun;
       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.chromiumAnalysisTasks[deleteIndex].Id;
       sk.post("/_/delete_chromium_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.chromiumAnalysisTasks[redoIndex].Id;
       sk.post("/_/redo_chromium_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>
