#!/usr/bin/perl -w -T
use strict;
use CipUX::RPC;
use English qw( -no_match_vars);
use Frontier::Client;

delete @ENV{qw(PATH IFS CDPATH ENV BASH_ENV)};

my $rpc      = CipUX::RPC->new();
my $login    = $rpc->login_prompt( { prompt => 'Login: ' } );
my $password = $rpc->password_prompt( { prompt => 'Password: ' } );

my $header_hr = {
    cipux_version  => '3.4.0.0',
    client_name    => 'cipux_rpc_session_test',
    client_version => '0.1',
    rpc_version    => '2.0',
    client_key     => '',
    client_cred    => '',
    gmt_time       => time,
};

my $pay_hr = {
    header_hr => $header_hr,
    login     => $login,
    ticket    => 'dummy',
    cmd       => 'login',
    param_hr  => { password => $password, },
};

# login
my $http_url  = "http://localhost:8001/RPC2";
my $server    = Frontier::Client->new( url => $http_url );
my $answer_hr = {};
eval { $answer_hr = $server->call( 'login', $pay_hr ); };
my $continue = 0;
my $ticket   = 0;
if ($EVAL_ERROR) {
    print "Server down\n";
    print "The server complains: $EVAL_ERROR\n";
}
elsif ( $answer_hr->{status} eq 'TRUE' ) {
    print "Sever up\n";
    if ( exists $answer_hr->{cmdres_r}->{ticket}
        and defined $answer_hr->{cmdres_r}->{ticket} )
    {
        $ticket   = $answer_hr->{cmdres_r}->{ticket};
        $continue = 1;
    }
}
else {
    print "Server problem\n";
}

# if login OK => renew session
if ($continue) {

    my $session_ok = 0;
    print "ticket before session renewal: [$ticket]\n";
    my $pay_hr = {
        header_hr => $header_hr,
        login     => $login,
        ticket    => "$ticket",
        cmd       => 'session',
        param_hr  => {},
    };
    eval { $answer_hr = $server->call( 'session', $pay_hr ); };
    if ($EVAL_ERROR) {
        print "Server down\n";
        print "The server complains: $EVAL_ERROR\n";
    }
    elsif ( $answer_hr->{status} eq 'TRUE' ) {
        print "Session OK\n";
        $session_ok = 1;
        if (    exists $answer_hr->{cmdres_r}->{ticket}
            and defined $answer_hr->{cmdres_r}->{ticket}
            and $answer_hr->{cmdres_r}->{ticket} )
        {
            $ticket = $answer_hr->{cmdres_r}->{ticket};
        }
    }
    else {
        print "Server problem\n";
    }
    print "ticket after session renewal: [$ticket]\n";
    my $old_ticket = undef;
    if (    exists $answer_hr->{ticket}
        and defined $answer_hr->{ticket}
        and $answer_hr->{ticket} )
    {
        $old_ticket = $answer_hr->{ticket};
    }
    print "the old ticket was: [$old_ticket]\n";
    # log out
     $pay_hr = {
        header_hr => $header_hr,
        login     => $login,
        ticket    => "$ticket",
        cmd       => 'logout',
        param_hr  => {},
    };
    eval { $answer_hr = $server->call( 'logout', $pay_hr ); };
    if ($EVAL_ERROR) {
        print "Server down\n";
        print "The server complains: $EVAL_ERROR\n";
    }
    elsif ( $answer_hr->{status} eq 'TRUE' ) {
        print "Session OK\n";
        $session_ok = 1;
        if (    exists $answer_hr->{cmdres_r}->{ticket}
            and defined $answer_hr->{cmdres_r}->{ticket}
            and $answer_hr->{cmdres_r}->{ticket} )
        {
            $ticket = $answer_hr->{cmdres_r}->{ticket};
        }
    }
    else {
        print "Server problem\n";
    }
}

use Data::Dumper;
print Dumper($answer_hr);

exit 0;

$pay_hr = {
    header_hr => $header_hr,
    login     => 'dummy',
    ticket    => 'dummy',
    cmd       => 'cipux_task_sum',
    param_hr  => {
        summand1 => 4,
        summand2 => 7,
    },

};
$answer_hr = $server->call( 'task', $pay_hr );

print Dumper($answer_hr);
