<!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 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>
