#!/usr/bin/env perl

# Copyright (C) 2018 Bocoup LLC. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above
#    copyright notice, this list of conditions and the following
#    disclaimer.
# 2. 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.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "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 HOLDER 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.

use strict;
use warnings;
use 5.8.8;

use FindBin;
use Config;

BEGIN {
    use lib $FindBin::Bin;
    use File::Spec::Functions qw(catfile);

    my $want_jhbuild = 0;

    if (defined $ENV{'WEBKIT_JHBUILD'}) {
        $want_jhbuild = $ENV{'WEBKIT_JHBUILD'};
    }

    my $osName = $Config{osname};
    if (!$want_jhbuild && $osName eq "linux" && !grep(/^--no-flatpak-check$/, @ARGV)) {
        if (eval {require webkitdirs; 1;}) {
            webkitdirs->import(qw(shouldUseFlatpak runInFlatpak sourceDir));
            if (shouldUseFlatpak()) {
                print "Running in flatpak based environment\n";
                my @command = (File::Spec->catfile(sourceDir(), "Tools", "Scripts", "test262-runner"));
                # Prevent exec'd test262-runner process from importing
                # webkitdirs so that it can succeed later on in the Runner
                # module... Perl. ¯\_(ツ)_/¯
                push(@ARGV, "--no-flatpak-check");
                runInFlatpak(@command);
            }
        }
    }
}

BEGIN {
    $ENV{DBIC_OVERWRITE_HELPER_METHODS_OK} = 1;
    $ENV{T262_EXEC_BIN} = "$FindBin::Bin/test262";
    unshift @INC, "$FindBin::Bin/test262";

    $ENV{LOAD_ROUTES} = 1;
}

use Runner;

exit 0;
