// Copyright (C) 2012 Google Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//    * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//    * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//    * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

// @fileoverview File that lists builders, their masters, and logical groupings
// of them.

function LOAD_BUILDBOT_DATA(builderData)
{
    builders.masters = {};
    builderData.forEach(function(master) {
        builders.masters[master.name] = new builders.BuilderMaster(master.name, master.url, master.tests);
    })
}

var builders = builders || {};

(function() {

// FIXME: Move some of this loading logic into loader.js.

builders._loadScript = function(url, success, error)
{
    var script = document.createElement('script');
    script.src = url;
    script.onload = success;
    script.onerror = error;
    document.head.appendChild(script);
}

builders._requestBuilders = function()
{
    var buildersUrl = 'builders.jsonp';
    builders._loadScript(buildersUrl, function() {}, function() {
        console.error('Could not load ' + buildersUrl);
    });
}


builders.BuilderMaster = function(name, basePath, tests)
{
    this.name = name;
    this.basePath = basePath;
    this.tests = tests;
}

builders.BuilderMaster.prototype = {
    logPath: function(builder, buildNumber)
    {
        return this.basePath + '/builders/' + builder + '/builds/' + buildNumber;
    },
    builderJsonPath: function()
    {
        return this.basePath + '/json/builders';
    },
}

builders._requestBuilders();

})();

// FIXME: Move everything below into the anonymous namespace above.

// FIXME: We only have one master, remove the code needed to support multiple ones.
WEBKIT_BUILDER_MASTER = 'webkit.org';
var LEGACY_BUILDER_MASTERS_TO_GROUPS = {
    'webkit.org': '@ToT - webkit.org'
};

function BuilderGroup()
{
    // Map of builderName (the name shown in the waterfall) to builderPath (the
    // path used in the builder's URL)
    this.builders = {};
}

BuilderGroup.prototype.append = function(builders) {
    builders.forEach(function(builderName) {
        this.builders[builderName] = builderName.replace(/[ .()]/g, '_');
    }, this);
};

BuilderGroup.prototype.defaultBuilder = function()
{
    for (var builder in this.builders)
        return builder;
    console.error('There are no builders in this builder group.');
}

BuilderGroup.prototype.master = function()
{
    return builderMaster(this.defaultBuilder());
}

var BUILDER_TO_MASTER = {};

function builderMaster(builderName)
{
    return BUILDER_TO_MASTER[builderName];
}

function requestBuilderList(builderGroups, masterName, groupName, builderGroup, testType, opt_builderFilter)
{
    if (!builderGroups[groupName])
        builderGroups[groupName] = builderGroup;
    var master = builders.masters[masterName];
    var builderList = master.tests[testType].builders;
    if (opt_builderFilter)
        builderList = builderList.filter(opt_builderFilter);
    builderList.forEach(function(builderName) {
        BUILDER_TO_MASTER[builderName] = master;
    });
    builderGroups[groupName].append(builderList);
}

// FIXME: Look into whether we can move the grouping logic into builders.jsonp and get rid of this code.
function loadBuildersList(groupName, testType) {
    switch (testType) {
    case 'layout-tests':
        switch(groupName) {
        case '@ToT - webkit.org':
            var builderGroup = new BuilderGroup();
            requestBuilderList(LAYOUT_TESTS_BUILDER_GROUPS, WEBKIT_BUILDER_MASTER, groupName, builderGroup, testType);
            break;
        default:
            console.error('Tried to load builders for an unsupported group "' + groupName + '"');
        }
        break;

    default:
        console.error('Tried to load builders for an unsupported test type "' + testType + '"');
    }
}

var LAYOUT_TESTS_BUILDER_GROUPS = {
    '@ToT - webkit.org': null,
};
