/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
<h1>Timer @escape($name) (@escape($unit))</h1>

@if($message,inline:<div class="error">@escape($message)</div>)

<h2>Count</h2>
<canvas id="timer-count-chart" height="100"></canvas>

<h2>Rates</h2>
<canvas id="timer-rates-chart" height="100"></canvas>

<h2>Histogram</h2>
<canvas id="timer-histogram-chart" height="100"></canvas>

/* TODO: make it composed of meter and histogram instead of duplicating it */
@include(chartsjs.html)
<script>
var options = {
  fill: false,
  responsive: true,
  maintainAspectRatio: true,
  scales: {
    xAxes: [{
      type: 'time',
      distribution : 'series',
      display: true,
      scaleLabel: {
        display: true,
        labelString: 'Date',
      }
    }],
    yAxes: [{
      display: true,
      scaleLabel: {
        display: true,
        labelString: '$name',
      }
    }]
  }
};
var labels = [ @each($points,inline:new Date($$value.timestamp).toLocaleString()@if($hasNext,inline:,)) ];
new Chart(document.getElementById('timer-count-chart').getContext('2d'), {
  type: 'line',
  data: {
    labels: labels,
    datasets: [{
      label: 'count',
      data: [ @each($points,inline:{t:$$value.timestamp,y:$$value.value.meter.count}@if($hasNext,inline:,)) ],
      borderWidth: 1,
      options: options
    }]
  }
});
new Chart(document.getElementById('timer-rates-chart').getContext('2d'), {
  type: 'line',
  data: {
    labels: labels,
    datasets: [{
      label: 'mean',
      data: [ @each($points,inline:{t:$$value.timestamp,y:$$value.value.meter.rateMean}@if($hasNext,inline:,)) ],
      borderWidth: 1,
      options: options,
      backgroundColor: '#000',
      borderColor: '#000',
      fill: false
    },{
      label: '1 mn',
      data: [ @each($points,inline:{t:$$value.timestamp,y:$$value.value.meter.rate1}@if($hasNext,inline:,)) ],
      borderWidth: 1,
      options: options,
      backgroundColor: '#339',
      borderColor: '#339',
      fill: false
    },{
      label: '5 mn',
      data: [ @each($points,inline:{t:$$value.timestamp,y:$$value.value.meter.rate5}@if($hasNext,inline:,)) ],
      borderWidth: 1,
      options: options,
      backgroundColor: '#06f',
      borderColor: '#06f',
      fill: false
    },{
      label: '15 mn',
      data: [ @each($points,inline:{t:$$value.timestamp,y:$$value.value.meter.rate15}@if($hasNext,inline:,)) ],
      borderWidth: 1,
      options: options,
      backgroundColor: '#f00',
      borderColor: '#f00',
      fill: false
    }]
  }
});
new Chart(document.getElementById('timer-histogram-chart').getContext('2d'), {
  type: 'line',
  data: {
    labels: labels,
    datasets: [{
      label: 'median',
      data: [ @each($points,inline:{t:$$value.timestamp,y:$$value.value.histogram.median}@if($hasNext,inline:,)) ],
      borderWidth: 1,
      options: options,
      backgroundColor: '#339',
      borderColor: '#339',
      fill: false
    },{
      label: 'mean',
      data: [ @each($points,inline:{t:$$value.timestamp,y:$$value.value.histogram.mean}@if($hasNext,inline:,)) ],
      borderWidth: 1,
      options: options,
      backgroundColor: '#000',
      borderColor: '#000',
      fill: false
    },{
      label: 'min',
      data: [ @each($points,inline:{t:$$value.timestamp,y:$$value.value.histogram.max}@if($hasNext,inline:,)) ],
      borderWidth: 1,
      options: options,
      backgroundColor: '#06f',
      borderColor: '#06f',
      fill: false
    },{
      label: 'max',
      data: [ @each($points,inline:{t:$$value.timestamp,y:$$value.value.histogram.min}@if($hasNext,inline:,)) ],
      borderWidth: 1,
      options: options,
      backgroundColor: '#f00',
      borderColor: '#f00',
      fill: false
    },{
      label: '75th pc',
      data: [ @each($points,inline:{t:$$value.timestamp,y:$$value.value.histogram.75thPercentile}@if($hasNext,inline:,)) ],
      borderWidth: 1,
      options: options,
      backgroundColor: '#f99',
      borderColor: '#f99',
      fill: false
    },{
      label: '95th pc',
      data: [ @each($points,inline:{t:$$value.timestamp,y:$$value.value.histogram.95thPercentile}@if($hasNext,inline:,)) ],
      borderWidth: 1,
      options: options,
      backgroundColor: '#f96',
      borderColor: '#f96',
      fill: false
    },{
      label: '98th pc',
      data: [ @each($points,inline:{t:$$value.timestamp,y:$$value.value.histogram.98thPercentile}@if($hasNext,inline:,)) ],
      borderWidth: 1,
      options: options,
      backgroundColor: '#f93',
      borderColor: '#f93',
      fill: false
    },{
      label: '99th pc',
      data: [ @each($points,inline:{t:$$value.timestamp,y:$$value.value.histogram.99thPercentile}@if($hasNext,inline:,)) ],
      borderWidth: 1,
      options: options,
      backgroundColor: '#f30',
      borderColor: '#f30',
      fill: false
    },{
      label: '999th pc',
      data: [ @each($points,inline:{t:$$value.timestamp,y:$$value.value.histogram.999thPercentile}@if($hasNext,inline:,)) ],
      borderWidth: 1,
      options: options,
      backgroundColor: '#c00',
      borderColor: '#c00',
      fill: false
    }]
  }
});
</script>
