<?php

require_once('../include/json-header.php');
require_once('../include/uploaded-file-helpers.php');

function main()
{
    $input_file = validate_uploaded_file('rootFile');

    $db = connect();
    $slave_id = verify_slave($db, $_POST);

    if (array_key_exists('buildNumber', $_POST) && array_key_exists('buildTag', $_POST) && $_POST['buildNumber'] != $_POST['buildTag'])
        exit_with_error('BuilderNumberTagMismatch', array('buildNumber' => $_POST['buildNumber'], 'buildTag' => $_POST['buildTag']));
    elseif (array_key_exists('buildNumber', $_POST) && !array_key_exists('buildTag', $_POST)) {
        require_format('buildNumber', $_POST['buildNumber'], '/^\d+$/');
        $_POST['buildTag'] = $_POST['buildNumber'];
    }

    $arguments = validate_arguments($_POST, array(
        'builderName' => '/.+/',
        'buildTag' => '/.+/',
        'buildTime' => '/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d*Z?$/',
        'buildRequest' => 'int',
        'repositoryList' => 'json',
    ));
    $build_request_id = $arguments['buildRequest'];

    $request_row = $db->select_first_row('build_requests', 'request', array('id' => $build_request_id));
    if ($request_row['request_test'] || $request_row['request_order'] >= 0)
        exit_with_error('InvalidBuildRequestType', array('buildRequest' => $build_request_id));

    $test_group = $db->select_first_row('analysis_test_groups', 'testgroup', array('id' => $request_row['request_group']));
    assert($test_group);

    $builder_id = $db->select_or_insert_row('builders', 'builder', array('name' => $arguments['builderName']));
    $build_info = array('builder' => $builder_id, 'slave' => $slave_id, 'tag' => $arguments['buildTag'], 'time' => $arguments['buildTime']);

    $commit_set_id = $request_row['request_commit_set'];
    $commit_set_items_to_update = compute_commit_set_items_to_update($db, $commit_set_id, $arguments['repositoryList']);

    $uploaded_file = upload_file_in_transaction($db, $input_file, $test_group['testgroup_author'],
        function ($db, $file_row) use ($build_request_id, $build_info, $commit_set_id, $commit_set_items_to_update) {
            $root_file_id = $file_row['file_id'];
            // FIXME: Insert a build row and associated with the request.
            $build_id = $db->insert_row('builds', 'build', $build_info);
            if (!$build_id)
                return array('status' => 'FailedToCreateBuild', 'build' => $build_info);

            foreach ($commit_set_items_to_update as $commit_id) {
                if (!$db->update_row('commit_set_items', 'commitset',
                    array('set' => $commit_set_id, 'commit' => $commit_id),
                    array('commit' => $commit_id, 'root_file' => $root_file_id), '*'))
                    return array('status' => 'FailedToUpdateCommitSet', 'commitSet' => $commit_set_id, 'commit' => $commit_id);
            }
            if (!all_commit_set_items_are_satisfied($db, $commit_set_id))
                return NULL;
            if (!$db->update_row('build_requests', 'request', array('id' => $build_request_id), array('status' => 'completed', 'build' => $build_id)))
                return array('status' => 'FailedToUpdateBuildRequest', 'buildRequest' => $build_request_id);
            return NULL;
        });

    exit_with_success(array('uploadedFile' => $uploaded_file));
}

function all_commit_set_items_are_satisfied($db, $commit_set_id)
{
    return !$db->select_first_row('commit_set_items', 'commitset', array('root_file' => NULL, 'requires_build' => TRUE, 'set' => $commit_set_id));
}

function compute_commit_set_items_to_update($db, $commit_set_id, $repository_name_list)
{
    if (!is_array($repository_name_list))
        exit_with_error('InvalidRepositoryList', array('repositoryList' => $repository_name_list));

    $commit_repository_rows_in_set = $db->query_and_fetch_all('SELECT commit_set_items.commitset_commit as commitset_commit,
        owned.repository_name as repository_name, owner.repository_name as owner_repository_name
        FROM repositories as owned LEFT OUTER JOIN repositories as owner ON owned.repository_owner = owner.repository_id, commits, commit_set_items
        WHERE owned.repository_id = commit_repository AND commit_id = commitset_commit
            AND commitset_set = $1', array($commit_set_id));

    $commit_by_repository_name = array();
    $commit_by_owner_and_owned_repository_names = array();
    if ($commit_repository_rows_in_set) {
        foreach ($commit_repository_rows_in_set as $row)
            if ($row['owner_repository_name']) {
                $owned_repositories = &array_ensure_item_has_array($commit_by_owner_and_owned_repository_names, $row['owner_repository_name']);
                $owned_repositories[$row['repository_name']] = $row['commitset_commit'];
            } else
                $commit_by_repository_name[$row['repository_name']] = $row['commitset_commit'];
    }

    $commit_set_items_to_update = array();
    foreach ($repository_name_list as $repository_name) {
        $commit_id = NULL;
        if (is_string($repository_name))
            $commit_id = array_get($commit_by_repository_name, $repository_name);
        else if (is_array($repository_name)) {
            if (!array_key_exists('ownerRepository', $repository_name) || !array_key_exists('ownedRepository', $repository_name))
                exit_with_error('InvalidKeyForRepository', array('repositoryName' => $repository_name, 'commitSet' => $commit_set_id));
            $commit_id = array_get(array_get($commit_by_owner_and_owned_repository_names, $repository_name['ownerRepository'], array()), $repository_name['ownedRepository']);
        }
        if (!$commit_id)
            exit_with_error('InvalidRepository', array('repositoryName' => $repository_name, 'commitSet' => $commit_set_id));
        array_push($commit_set_items_to_update, $commit_id);
    }
    if (!$commit_set_items_to_update)
        exit_with_error('InvalidRepositoryList', array('repositoryList' => $repository_name_list, 'commitSet' => $commit_set_id));

    return $commit_set_items_to_update;
}

main();

?>
