<!--
  The <lua-scripts-sk> custom element declaration. Displays a form that allows the user to queue a
  task to run a Lua script.

  Attributes:
    skpRepositories: List of all available SKP repositories, as accepted by
      skp-repository-selector-sk property skpRepositories. Must be set.

  Events:
    None.

  Methods:
    None.
-->

<dom-module id="lua-scripts-sk">
  <style>
    paper-input {
      width: 20em;
    }

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

    .iron-selected {
      background-color: #D6ECF2;
    }

    .long-field {
      width: 40em;
    }

    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>SKP Repository</td>
        <td>
          <skp-repository-selector-sk id="skp_repository" skp-repositories="{{skpRepositories}}">
          </skp-repository-selector-sk>
        </td>
      </tr>

      <tr>
        <td>Lua script</td>
        <td>
          <iron-autogrow-textarea class="long-field" rows=15 max-rows=30 id="lua_script">
          </iron-autogrow-textarea>
        </td>
      </tr>

      <tr>
        <td>Lua aggregator script (optional)</td>
        <td>
          <iron-autogrow-textarea class="long-field" rows=15 max-rows=30 id="lua_aggregator_script">
          </iron-autogrow-textarea>
        </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"></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>

    <br/><br/>

  </template>
</dom-module>

<script>
   Polymer({
     is: "lua-scripts-sk",
     properties: {
       skpRepositories: {
         type: Array,
         observer: "skpRepositoriesChanged",
       },
       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();
      });
     },

     skpRepositoriesChanged: function(newValue, oldValue) {
       // CT's lua scripts do not currently support PDF page sets.
       for (var i=this.skpRepositories.length-1; i>=0; i--) {
         if (this.skpRepositories[i].PageSets.startsWith("PDF")) {
           this.skpRepositories.splice(i, 1);
         }
       }

       if (!oldValue || oldValue.length == 0) {
         this.$.skp_repository.selectFirst();
       }
     },

     validateTask: function() {
       if (!this.$.skp_repository.selected) {
         sk.errorMessage("Please select an SKP repository");
         this.$.skp_repository.focus();
         return;
       }
       if (!this.$.lua_script.textarea.value) {
         sk.errorMessage("Please provide a script to run");
         this.$.lua_script.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["skp_repository"] = this.$.skp_repository.selected;
       params["lua_script"] = this.$.lua_script.textarea.value;
       params["lua_aggregator_script"] = this.$.lua_aggregator_script.textarea.value;
       params["desc"] = this.$.desc.value;
       params["repeat_after_days"] = this.$.repeat_after_days.selected;

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

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