<!DOCTYPE html>
<html>

<head>
  <title>Capacity Stats Demo</title>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
  <script src="/res/js/status_utils.js"></script>
  <script src="/res/common/js/common.js"></script>
  <script src="/res/imp/bower_components/webcomponentsjs/webcomponents-lite.js"></script>
  <script src="/res/imp/sinon-1.17.2.js"></script>

  <script type="text/javascript" charset="utf-8">
    // sinon.format = function(object) {return JSON.stringify(object);}
    // sinon.log = function(message) {console.log(message);};

    var server = sinon.fakeServer.create();
    server.autoRespond = true;

    function randomNanos(len) {
      var arr = [];
      for(var i = 0; i < len; i++) {
        var seconds = Math.random() * 2000;
        arr.push({
          task_name: "Foobar",
          task_duration_ns: Math.floor(seconds * 1000000000),
          on_cq_also: Math.random() < .3,
        })
      }
      return arr;
    }

    var data = {
      "abc": {
        dimensions: ["gpu:1002:683d-22.21.18.5939","os:Windows-8.1-SP0","pool:Skia"],
        bots: {
          "win001": true,
          "win002": true,
        },
        tasks: randomNanos(4),
      },
      "def":{
        dimensions: ["device_type:angler","device_os:N12345","os:Android","pool:Skia"],
        bots: {
          "rpi001": true,
          "rpi002": true,
          "rpi003": true,
          "rpi004": true,
          "rpi005": true,
          "rpi006": true,
        },
        tasks: randomNanos(12),
      },
      "ghi":{
        dimensions: ["device_type:iPad5,1","os:iOS-9.3.1","pool:Skia"],
        bots: {
          "ipad001": true,
        },
        tasks: randomNanos(6),
      },
      "jkl":{
        dimensions: ["gpu:none","os:Ubuntu-14.04","pool:Skia"],
        bots: {
          "linux001": true,
          "linux002": true,
          "linux003": true,
          "linux004": true,
          "linux005": true,
          "linux006": true,
          "linux007": true,
          "linux008": true,
          "linux009": true,
          "linux010": true,
          "linux011": true,
          "linux012": true,
          "linux013": true,
        },
        tasks: randomNanos(76),
      },
    };



    server.respondWith("GET","/capacity/json", JSON.stringify(data));

    var login = {"Email":"test@google.com","LoginURL":"http://www.example.com","IsAGoogler":true};
    server.respondWith("GET","/loginstatus/", JSON.stringify(login));

    var version = {"commit":"3e0fcf9b99baf4256851a6767bc6955266fc2369","date":"2016-02-19T13:57:18-05:00"};
    server.respondWith("GET","/json/version", JSON.stringify(version));
  </script>
  <link rel="import" href="capacity-stats-sk.html">
  </head>
  <body>
    <capacity-stats-sk></capacity-stats-sk>
  </body>

</html>
