"use strict";

/* global module */


function getRateLimit(thunk) {

    var url = "https://api.github.com/rate_limit";
    try {
        var request = new XMLHttpRequest();
        request.onreadystatechange = function() {
            if (request.readyState === request.DONE) {
                var data = JSON.parse(request.responseText);
                thunk(data);
            }
        };
        request.onerror = function () {
            print("pr-utils.js -- getPRDetails failed: " + request.statusText);
        };
        request.ontimeout = function () {
            print("pr-utils.js -- getPRDetails timed-out: " + request.statusText);
        };
        request.setRequestHeader("Accept", "application/vnd.github.antiope-preview+json");
        request.setRequestHeader("User-Agent", "High-Fidelity-PR-Watcher");
        request.open("GET", url, true);
        request.timeout = 20000;
        request.send();
    } catch (err) {
        print("pr-utils.js -- error loading " + url);
    }
}


function cachingGithubAPIRequest(url, dataCache, thunk) {
    var request = new XMLHttpRequest();
    request.onreadystatechange = function() {
        if (request.readyState === request.DONE) {
            if (request.status === 200) {
                var etag = request.getResponseHeader("ETag");
                dataCache[url] = { etag: etag, data: request.responseText }; // save in cache
                thunk(JSON.parse(request.responseText));
            } else if (request.status == 304) {
                thunk(JSON.parse(dataCache[url].data)); // get from cache
            } else {
                print("pr-utils.js -- cachingGithubAPIRequest failed: " +
                      request.status + " " + request.statusText + ", " + url);
            }
        }
    };

    request.setRequestHeader("Accept", "application/vnd.github.antiope-preview+json");
    request.setRequestHeader("User-Agent", "High-Fidelity-PR-Watcher");

    if (dataCache[url]) {
        var prevEtag = dataCache[url].etag;
        request.setRequestHeader("If-None-Match", prevEtag);
    }

    request.onerror = function () {
        print("pr-utils.js -- cachingGithubAPIRequest failed: " + request.statusText);
        thunk(null);
    };
    request.ontimeout = function () {
        print("pr-utils.js -- cachingGithubAPIRequest timed-out: " + request.statusText);
        thunk(null);
    };
    request.open("GET", url);
    request.timeout = 20000;
    request.send();
}


function newestStatusPerContext(statusesResponse) {
    // only keep the newest status for a given context
    var checks = {};
    for (var i = 0; i < statusesResponse.length; i++) {
        var status = statusesResponse[i];
        if (checks[status.context]) {
            if (status.id > checks[status.context].id) {
                checks[status.context] = status;
            }
        } else {
            checks[status.context] = status;
        }
    }

    var finalChecks = [];
    for (var context in checks) {
        if (checks.hasOwnProperty(context)) {
            finalChecks.push(checks[context]);
        }
    }

    return finalChecks;
}


function getLabelNames(detailsResponse) {
    var labelNames = [];
    detailsResponse.labels.forEach(function (label) {
        labelNames.push(label.name);
    });
    return labelNames;
}


function getPRDetails(prNumber, dataCache, thunk) {

    // getRateLimit();

    var url = "https://api.github.com/repos/highfidelity/hifi/pulls/" + prNumber;
    cachingGithubAPIRequest(url, dataCache, function (detailsResponse) {
        detailsResponse.labelNames = getLabelNames(detailsResponse);
        cachingGithubAPIRequest(detailsResponse.statuses_url, dataCache, function (statusesResponse) {
            detailsResponse.statuses = newestStatusPerContext(statusesResponse);
            thunk(detailsResponse);
        });
    });
}


module.exports = {
    getRateLimit: getRateLimit,
    getPRDetails: getPRDetails
};