#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use lib 'lib', 'local/lib/perl5';
use lib::abs;
use utf8;

use Utils::Safe qw(confirm_connect_on_production);

=encoding UTF-8

=head2

Прогнать один тест:

    $ ./prove2 t/utils-tsv.t

Прогнать все тесты:

    $ ./prove2

Прогнать все тесты из папки:

    $ ./prove2 t/lib/Application/Model/Users/

Прогнать один тест без Java-JSONAPI:

    $ NO_JAVA_MOCK=1 ./prove2 t/utils-tsv.t

Прогнать один тест c пересборкой и перезапуском Java-JSONAPI:

    $ ./prove2 --force_rebuild_java t/utils-tsv.t

Рестартануть java сервисы с новыми env

    $ JSONAPI_LOG_LEVEL=DEBUG ./prove2 --restart_java t/utils-tsv.t

Использовать уже поднятую java

    $ ./prove2 --use_running_java t/utils-tsv.t

=cut

sub main {

    confirm_connect_on_production();
    my $dir_or_file = pop @ARGV;

    $ENV{'LAZY_LOAD'} = 1;

    # from variables
    $ENV{'FORM_STAGE'} = 'dev';
    $ENV{'FORM_PARTNER2_SERVER'} = 'partner2-test.yandex.ru';
    $ENV{'DEPLOY_TVM_TOOL_URL'} = 'http://localhost:18080';
    $ENV{'FORM_BLACKBOX='} = 'http://blackbox-mimino.yandex.net';

    my %prove2_opts = (rebuild_java => 1, force_rebuild_java => 0, restart_java => 0, use_running_java => 0);

    @ARGV = grep{
        if(/^--(.*)/ && exists $prove2_opts{$1}){
            $prove2_opts{$1} = 1;
            0
        } else {
            1
        }
    } @ARGV;

    if ($prove2_opts{restart_java}) {
        $prove2_opts{rebuild_java} = 0;
    }

    if ($prove2_opts{use_running_java}) {
        $prove2_opts{rebuild_java} = 0;
        $prove2_opts{restart_java} = 0;
    }

    unless($ENV{NO_JAVA_MOCK} || ($ENV{MOCK_SERVER_PORT} && $ENV{JSONAPI_SERVER_PORT})) {
        my $base = lib::abs::path('.');
        start_jsonapi_mock($base, \%prove2_opts)
    }

    $ENV{JAVA_MOCKED_JSONAPI_URL} //= "http://localhost:$ENV{JSONAPI_SERVER_PORT}/v1/" if $ENV{JSONAPI_SERVER_PORT};

    if ($dir_or_file) {
        my $args = join ' ', @ARGV; # Чтобы можно было передавать доп флаги, например "-v"
        system("prove $args $dir_or_file");
    } else {
        system('prove');
    }

    my $exit_value = $? >> 8;
    exit $exit_value;
}

sub start_jsonapi_mock {
    my ($base, $opts)=@_;
    print STDERR "preparing java_jsonapi_mock services...\n";

    my $basePort = `grep ^HTTP_PORT $base/nginx/init.sh`;
    $basePort =~ /^HTTP_PORT\s*=\s*(\d+)\s*\r?$/ or die "failed to detect base port";
    $basePort = $1;

    $ENV{JSONAPI_SERVER_PORT}//=30_300 + $basePort;

    my $tvm = qx(cat `jq -r '.api_tvm.auth_token_path' $base/lib/Application.json`);
    chomp $tvm;

    my $rebuild_result;
    if ($opts->{rebuild_java}) {
        my $build_cmd = "perl $base/bin/build_java.pl --dir '$base' --app mocks --app jsonapi";
        $build_cmd .= " --branch $ENV{JAVA_BRANCH}" if $ENV{JAVA_BRANCH};
        $build_cmd .= ' --rebuild' if $opts->{force_rebuild_java};

        $rebuild_result = system($build_cmd)>>8;# exit code=1 if no rebuild done

        print "rebuild_result=$rebuild_result\n";
        die if $rebuild_result > 1;
    }

    if ($opts->{restart_java} || ($opts->{rebuild_java} && $rebuild_result == 0)) {
        stop_jsonapi_mock($base);

        $ENV{MOCK_SERVER_HOST} //= 'localhost';
        $ENV{MOCK_SERVER_PORT} //= 30_100 + $basePort;
        $ENV{MOCK_SERVER_MANAGEMENT_PORT} //= 30_200 + $basePort;
        $ENV{JSONAPI_MANAGEMENT_PORT} //= 30_400 + $basePort;
        $ENV{TVMTOOL_LOCAL_AUTHTOKEN} = $tvm;
        $ENV{JAVA_MOCK_SH_BASE} = "$base/configs/func-tests/bin";

        print "starting java mock service\n";
        system "python $base/configs/func-tests/bin/mock_run.py $base/java/mocks $base/nginx/mock.pid >/dev/null 2>&1";
        print "starting java mocked jsonapi service\n";
        system "python $base/configs/func-tests/bin/jsonapi_run.py $base/java/jsonapi $base/nginx/java-mocked-jsonapi.pid >/dev/null 2>&1";
    }
}

sub stop_jsonapi_mock {
    my($base)=@_;
    system"start-stop-daemon --stop --oknodo --pidfile $base/nginx/java-mocked-jsonapi.pid --retry 5";
    system"start-stop-daemon --stop --oknodo --pidfile $base/nginx/mock.pid --retry 5";
}

main();
