<!--
  The <capture-skps-sk> custom element declaration. Displays a form that allows the user to
  queue a task to capture SKPs.

  Attributes:
    pageSets: List of all defined page sets, as accepted by page-set-selector-sk property
      pageSets. Must be set.
    chromiumBuilds: List of all supported Chromium builds, as accepted by chromium-build-selector-sk
      attribute chromiumBuilds. Must be set.

  Events:
    None.

  Methods:
    None.
-->

<dom-module id="capture-skps-sk">
  <style>
    .iron-selected {
      background-color: #D6ECF2;
    }

    .triggering-spinner {
      margin: auto;
      vertical-align: middle;
    }

    table.options td {
      padding: 1em 2em;
    }

    td.center {
      text-align:center;
      padding-top:2em;
    }

    .panel {
      @apply(--shadow-elevation-2dp);
    }
  </style>
  <template>

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

    <table class="options panel">
      <tr>
        <td>PageSets Type</td>
        <td>
          <page-set-selector-sk id="page_sets" page-sets="{{pageSets}}"></page-set-selector-sk>
        </td>
      </tr>

      <tr>
        <td>Chromium Build</td>
        <td>
          <chromium-build-selector-sk id="chromium_build"
                                      chromium-builds="{{chromiumBuilds}}">
          </chromium-build-selector-sk>
        </td>
      </tr>

      <tr>
        <td>Repeat this task</td>
        <td>
          <repeat-after-days-sk id="repeat_after_days"></repeat-after-days-sk>
        </td>
      </tr>

      <tr>
        <td>Description</td>
        <td>
          <paper-input value="" id="desc"
                       label="Description is required. Please include SKP version."></paper-input>
        </td>
      </tr>

      <tr>
        <td colspan="2" class="center">
          <div class="triggering-spinner">
            <paper-spinner active="[[ triggeringTask ]]" alt="Trigger task"></paper-spinner>
          </div>
          <paper-button raised id="submit_task" disabled="[[ triggeringTask ]]">Queue Task</paper-button>
        </td>
      </tr>
      <tr>
        <td colspan="2" class="center">
          <paper-button raised id="view_history">View runs history</paper-button>
        </td>
      </tr>
    </table>
  </template>
</dom-module>

<script>
  Polymer({
    is: "capture-skps-sk",
    properties: {
      pageSets: {
        type: Array,
        observer: "pageSetsChanged",
      },
      chromiumBuilds: {
        type: Array,
        observer: "chromiumBuildsChanged"
      },
      triggeringTask: {
        type: Boolean,
        value: false,
      },
    },

    ready: function() {
      var that = this;
      this.$.submit_task.addEventListener('click', function(e) {
        that.validateTask();
      });
      this.$.view_history.addEventListener('click', function(e) {
        that.gotoRunsHistory();
      });
    },

    pageSetsChanged: function(newValue, oldValue) {
      // Capture SKPs does not support 1M anymore.
      for (var i=this.pageSets.length-1; i>=0; i--) {
         if (ctfe.pageSets.getKey(this.pageSets[i]) == "All") {
           this.pageSets.splice(i, 1);
         }
       }
      if (!oldValue || oldValue.length == 0) {
        this.$.page_sets.selectFirst();
      }
    },

    chromiumBuildsChanged: function(newValue, oldValue) {
      if (!oldValue || oldValue.length == 0) {
        this.$.chromium_build.selectFirst();
      }
    },

    validateTask: function() {
      if (!this.$.page_sets.selected) {
        sk.errorMessage("Please select a page set type");
        this.$.page_sets.focus();
        return;
      }
      if (!this.$.chromium_build.selected) {
        sk.errorMessage("Please select a Chromium build");
        this.$.chromium_build.focus();
        return;
      }
      if (!this.$.desc.value) {
        sk.errorMessage("Please specify a description");
        this.$.desc.focus();
        return;
      }
      if (ctfe.moreThanThreeActiveTasks($$$("drawer-sk").sizeOfUserQueue)) {
        return;
      }
      this.$.confirm_dialog.open("Proceed with queueing task?")
        .then(this.queueTask.bind(this))
        .catch(function() {
          sk.errorMessage("Did not queue");
        })
    },

    queueTask: function() {
      this.triggeringTask = true;
      var params = {};
      params["page_sets"] = this.$.page_sets.selected;
      params["chromium_build"] = this.$.chromium_build.selected;
      params["desc"] = this.$.desc.value;
      params["repeat_after_days"] = this.$.repeat_after_days.selected;

      sk.post("/_/add_capture_skps_task", JSON.stringify(params))
        .then(function(resp) {
          this.gotoRunsHistory();
        }.bind(this)).catch(function(e) {
          this.triggeringTask = false;
          sk.errorMessage(e);
        }.bind(this));
    },

    gotoRunsHistory: function() {
      window.location.href = "/capture_skp_runs/";
    },
  });
</script>
