use strict;
use warnings;
use Setup;
use Test2::V0;
use Catalyst::Test ();
use HTTP::Request;
use HTTP::Request::Common qw(GET POST DELETE);
use JSON::MaybeXS qw(decode_json encode_json);

my $ctx = test_context();

Catalyst::Test->import('Hydra');

my $user = $ctx->db()->resultset('Users')->create({
    username => 'alice',
    emailaddress => 'root@invalid.org',
    password => '!'
});
$user->setPassword('foobar');
$user->userroles->update_or_create({ role => 'admin' });

# Login and save cookie for future requests
my $req = request(POST '/login',
    Referer => 'http://localhost/',
    Content => {
        username => 'alice',
        password => 'foobar'
    }
);
is($req->code, 302, "Logging in gets a 302");
my $cookie = $req->header("set-cookie");

subtest "Deleting a simple project" => sub {
    my $builds = $ctx->makeAndEvaluateJobset(
        expression => "basic.nix"
    );
    my $project = $builds->{"empty_dir"}->project;

    my $responseNoAuth = request(DELETE "/project/${\$project->name}");
    is($responseNoAuth->code, 403, "Deleting a project without auth returns a 403");

    my $responseAuthed = request(DELETE "/project/${\$project->name}",
        Cookie => $cookie,
        Accept => "application/json"
    );
    is($responseAuthed->code, 200, "Deleting a project with auth returns a 200");

    my $response = request(GET "/project/${\$project->name}");
    is($response->code, 404, "Then getting the project returns a 404");

    is(
        $ctx->db->resultset('Builds')->find({ id => $builds->{"empty_dir"}->id }),
        undef,
        "The build isn't in the database anymore"
    );
};

subtest "Deleting a project with metrics" => sub {
    my $builds = $ctx->makeAndEvaluateJobset(
        expression => "runcommand.nix",
        build => 1
    );
    my $project = $builds->{"metrics"}->project;

    my $responseAuthed = request(DELETE "/project/${\$project->name}",
        Cookie => $cookie,
        Accept => "application/json"
    );
    is($responseAuthed->code, 200, "Deleting a project with auth returns a 200");

    my $response = request(GET "/project/${\$project->name}");
    is($response->code, 404, "Then getting the project returns a 404");
};

done_testing;