<!DOCTYPE html>
<html>

<head>
  <title>Skia Status Demo (n=16)</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>
  <!-- Makes vars called data0, data1, data2 ... -->
  <script type="text/javascript" src="status-sk-demo-0.json"></script>
  <script type="text/javascript" src="status-sk-demo-1.json"></script>
  <script type="text/javascript" src="status-sk-demo-2.json"></script>
  <script type="text/javascript" src="status-sk-demo-3.json"></script>
  <script type="text/javascript" src="status-sk-demo-4.json"></script>
  <script type="text/javascript" src="status-sk-demo-5.json"></script>
  <script type="text/javascript" src="status-sk-demo-6.json"></script>
  <script type="text/javascript" src="status-sk-demo-7.json"></script>
  <script type="text/javascript" src="status-sk-demo-8.json"></script>
  <script type="text/javascript" src="status-sk-demo-9.json"></script>
  <script type="text/javascript" src="status-sk-demo-10.json"></script>
  <!-- Makes a var called alerts-->
  <script type="text/javascript" src="alert-widget-demo.json"></script>
  <script type="text/javascript" charset="utf-8">
    // Mock out the current time.
    var clock = sinon.useFakeTimers(1505324460000, "Date");
    var server = sinon.fakeServer.create();
    server.autoRespond = true;

    var data = [data0, data1, data2, data3, data4, data5, data6, data7, data8, data9, data10];

    var inc = 0
    server.respondWith("GET", /\/json\/.*\/incremental.*/, function(request){
        rv = data[inc % data.length];
        inc++
        return request.respond(200, {}, JSON.stringify(rv));
    });

    var login = {"Email":"test@google.com","IsAdmin":true,"IsEditor":true,"IsViewer":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));

    var gold = { corpStatus: [
      {name: "svg", untriagedCount: 47, negativeCount:949 },
      {name: "colorImage", untriagedCount: 17, negativeCount:449 },
      {name: "gm", untriagedCount: 27, negativeCount:649 },
      {name: "image", untriagedCount: 61, negativeCount:9 }
    ]};
    server.respondWith("GET","https://gold.skia.org/json/trstatus", JSON.stringify(gold));
    var perf = {"alerts":1};
    server.respondWith("GET","https://perf.skia.org/_/alerts/", JSON.stringify(perf));

    server.respondWith("POST", "https://task-scheduler.skia.org/json/trigger", JSON.stringify(["id1", "id2"]));


    // Mocked external requests
    server.respondWith("GET","https://autoroll.skia.org/json/ministatus", JSON.stringify({
      currentRollRev: "932efed7c89c69616e283fdfef65e86b9d9da381",
      lastRollRev: "7c36e5afd2ce43d22182249ffd0f046716c7ef55",
      mode: "running",
      numFailed: 1,
      numBehind: 3,
    }));
    server.respondWith("GET","https://android-master-roll.skia.org/json/ministatus", JSON.stringify({
      currentRollRev: "",
      lastRollRev: "932efed7c89c69616e283fdfef65e86b9d9da381",
      mode: "running",
      numFailed: 0,
      numBehind: 0,
    }));
    server.respondWith("GET","https://google3-roll.skia.org/json/ministatus", JSON.stringify({
      currentRollRev: "ee1c73fc1b8a616ac79572759b02435698171fbf",
      lastRollRev: "138ea97c1acaed4b968540220724dd5bf671e8db",
      mode: "running",
      numFailed: 3,
      numBehind: 25,
    }));

    var alertsCalls = 0;
    // Send one alert, then after one request, no alerts.
    server.respondWith("GET","https://alerts.skia.org/json/alerts/?excludeCategory=infra",function(request){
        if (alertsCalls === 0) {
          alertsCalls++;
          return request.respond(200, {}, JSON.stringify(alerts));
        }
        return request.respond(200, {}, "[]");
    });

    var openMessage = {"username": "alice@google.com", "date": "2016-02-26 13:01:28.174970", "message": "Skynet quelled, now open", "can_commit_freely": true, "general_state": "open"};
    var cautionMessage = {"username": "alice@google.com", "date": "2016-02-27 16:01:28.174970", "message": "Be careful", "can_commit_freely": false, "general_state": "caution"};
    var closedMessage = {"username": "alice@google.com", "date": "2016-02-28 01:01:28.174970", "message": "Closed for master restart", "can_commit_freely": false, "general_state": "closed"};
    var statusCalls = 0;

    // Say the tree is open, then after one request, it is caution,
    // then after the second request, it is closed.
    server.respondWith("GET","https://tree-status.skia.org/current", function(request){
        if (statusCalls === 0) {
          statusCalls++;
          return request.respond(200, {}, JSON.stringify(openMessage));
        }
        if (statusCalls === 1) {
          statusCalls++;
          return request.respond(200, {}, JSON.stringify(cautionMessage));
        }
        return request.respond(200, {}, JSON.stringify(closedMessage));
    });

    var bob = {"username": "bob@google.com", "schedule_start": "02/29", "schedule_end": "03/06"};
    server.respondWith("GET","https://tree-status.skia.org/current-sheriff", JSON.stringify(bob));

    var carol = {"username": "carol@google.com", "schedule_start": "02/29", "schedule_end": "03/06"};
    server.respondWith("GET","https://tree-status.skia.org/current-wrangler", JSON.stringify(carol));

    var denae = {"username": "denae@google.com", "schedule_start": "02/29", "schedule_end": "03/06"};
    server.respondWith("GET","https://tree-status.skia.org/current-trooper", JSON.stringify(denae));

    var elise = {"username": "elise@google.com", "schedule_start": "02/29", "schedule_end": "03/06"};
    server.respondWith("GET","https://tree-status.skia.org/current-robocop", JSON.stringify(elise));

  </script>

  <link rel="import" href="status-sk.html">
  <style>
    body {
      overflow: hidden;
    }
  </style>
</head>

<body>
  <status-sk
      repo="skia"
      repo_base="https://skia.googlesource.com/skia/+show/">
  </status-sk>
</body>
</html>
