<!-- The <alert-config-sk> custom element declaration.

  Control that allows editing an alerts.Config.

  Attributes:
    config - A serialized alerts.Config.

    paramset - The paramset to build a query from.

  Events:
    None.

  Methods:
    None.
-->
<link rel="import" href="/res/imp/bower_components/iron-selector/iron-selector.html">
<link rel="import" href="/res/imp/bower_components/paper-checkbox/paper-checkbox.html">
<link rel="import" href="/res/imp/bower_components/paper-input/paper-input.html">
<link rel="import" href="/res/imp/bower_components/paper-spinner/paper-spinner.html">

<link rel="import" href="/res/common/imp/query2-chooser.html" />
<link rel="stylesheet" href="/res/common/css/md.css">

<link rel="import" href="algo-select.html" />

<dom-module id="alert-config-sk">
  <style is="custom-style">
    h3, h4 {
      margin: 1em 0 0.2em 0;
    }

    algo-select-sk {
      display: block;
    }

    paper-input,
    paper-checkbox,
    iron-selector,
    button,
    algo-select-sk {
      margin-left: 3em;
    }

    paper-spinner {
      display: inline-block;
    }

    h4 {
      margin-left: 2em;
    }

    .iron-selected {
      background: #eee;
    }

    iron-selector div {
      width: 10em;
      margin: 0.3em 1em;
      padding: 0.2em;
    }

    paper-checkbox {
      --paper-checkbox-checked-color: #1f78b4;
      --paper-checkbox-checked-ink-color: #1f78b4;
    }
  </style>
  <template>
    <h3>Which traces should be monitored</h3>
    <query2-chooser-sk id=querychooser paramset="{{paramset}}" current_query="{{config.query}}"></query2-chooser-sk>
    <h3>What triggers an alert</h3>
    <h4>Algorithm</h4>
    <algo-select-sk algo="{{config.algo}}"></algo-select-sk>
    <h4>K</h4>
    <paper-input type=number min=0 value="{{config.k}}" label="The number of clusters. Only used in kmeans. 0 = use a server chosen value."></paper-input>
    <h4>Radius</h4>
    <paper-input type=number min=0 value="{{config.radius}}" label="Number of commits on either side to consider. 0 = use a server chosen value."></paper-input>
    <h4>Step Direction</h4>
    <paper-checkbox checked="{{config.step_up_only}}">Only step ups should trigger an alert.</paper-checkbox>
    <h4>Threshhold</h4>
    <paper-input type=number min=1 max=500  value="{{config.interesting}}" label="Interesting Threshhold for clusters to be interesting."></paper-input>
    <h3>Where are alerts sent</h3>
    <paper-input value="{{config.alert}}"                                  label="Alert Destination: Email address."></paper-input>
    <button on-tap=_testAlert>Test</button>
    <paper-spinner id=alertSpinner></paper-spinner>
    <h3>Where are bugs filed</h3>
    <paper-input value="{{config.bug_uri_template}}"                       label="Bug URI Template: {cluster_url}, {commit_url}, and {message}."></paper-input>
    <button on-tap=_testBugTemplate>Test</button>
    <paper-spinner id=bugSpinner></paper-spinner>
    <h3>Who owns this alert</h3>
    <paper-input id=owner value="{{config.owner}}"                         label="Email address of owner."></paper-input>
    <h3>Status</h3>
    <iron-selector attr-for-selected="value" selected="{{config.state}}" fallback-selection=ACTIVE>
      <div value=ACTIVE title="Clusters that match this will generate alerts.">Active</div>
      <div value=DELETED title="Currently inactive.">Deleted</div>
    </iron-selector>
  </template>
</dom-module>

<script>
  Polymer({
    is: "alert-config-sk",

    properties: {
      // config is a serialized alerts.Config.
      config: {
        type: Object,
        value: function() { return {}; },
        reflectToAttribute: false,
        notify: true,
        observer: '_configChange',
      },
      paramset: {
        type: Object,
        value: function() { return {}; },
        reflectToAttribute: false,
      },
    },

    ready: function() {
      this.$.querychooser.query.setKeyOrder(sk.perf.key_order);
    },

    _testBugTemplate: function() {
      this.$.bugSpinner.active = true;
      var body = {
        bug_uri_template: this.config.bug_uri_template,
      };
      sk.post("/_/alert/bug/try", JSON.stringify(body), "application/json").then(JSON.parse).then(function(json) {
        if (json.url) {
          // Open the bug reporting page in a new window.
          window.open(json.url, '_blank');
        }
        this.$.bugSpinner.active = false;
      }.bind(this)).catch(function(msg) {
        this.$.bugSpinner.active = false;
        sk.errorMessage(msg);
      }.bind(this));
    },

    _testAlert: function() {
      this.$.alertSpinner.active = true;
      var body = {
        alert: this.config.alert,
      };
      sk.post("/_/alert/notify/try", JSON.stringify(body), "application/json").then(function() {
        this.$.alertSpinner.active = false;
      }.bind(this)).catch(function(msg) {
        sk.errorMessage(msg);
        this.$.alertSpinner.active = false;
      }.bind(this));
    },

    _configChange: function() {
      if (this.config.interesting == 0) {
        this.set('config.interesting', sk.perf.interesting);
      }
      if (this.config.radius == 0) {
        this.set('config.radius', sk.perf.radius);
      }
    },

  });
</script>
