#
# underwriter - a simple test of the Underwriter interface
#
use CORBA::ORBit idl => [ qw(Underwrite.idl) ];

my $poa;


package UnderwriterTest;


sub new
{
    my $class = shift;
    my %self = {};
    $self{'id'} = 0;
    $self{'next'} = 0;
    $self{'answer'} = 1;

    return bless \%self, $class;
}

sub id
{
    my $self = shift;
    
    if (@_)
    {
	$self->{'id'} = shift;
    }
    return $self->{'id'};
}

sub nextTest
{
    my $self = shift;
    
    if (@_)
    {
	$self->{'next'} = shift;
    }
    return $self->{'next'};
}

sub answer
{
    my $self = shift;
    
    if (@_)
    {
	$self->{'answer'} = shift;
    }
    return $self->{'answer'};
}

package UnderwriterTestSet;

sub new
{
    my $class = shift;
    my %self = {};

    my %tests = {};

    $self{'tests'} = \%tests;

    return bless \%self, $class;
}

sub GetTest
{
    my ($self,$testid) = @_;

    my $tests = $self->{tests};
    return $tests->{$testid};
}

sub StoreTest
{
    my ($self,$test) = @_;

    my $tests = $self->{tests};

    $tests->{$test->{id}} = $test;
}


package Underwriter;
@Underwriter::ISA = qw(POA_AudioTrade::Underwriter);

sub new
{
    my $class = shift;
    my %self = {};
    my %tests;

    $self{tests} = \%tests;
    return bless \%self,$class;
}

sub NextTest
{
    my $self = shift;
    
    my ($sequence, $currentcode, $condition) = @_;

    my $tests = $self->{tests};

    $testset = $tests->{$sequence};

    return 0 unless defined($testset);

    my $test = $testset->GetTest($currentcode);

    if ($test)
    {
	print $test." ".$test->{id}." ".$test->{answer}."\n";
	$condition = ($test->answer()) ? $condition : !$condition;
	return ($condition) ? $test->nextTest() : 0;
    }
    0;
}

sub Test
{
    my ($self,$newseq, $newtestid, $newtestnext, $newtestanswer) = @_;

    my $tests = $self->{tests};
    my $testset;
    if ($tests->{$newseq})
    {
	$testset = $tests->{$newseq};
    }
    else
    {
	$testset = new UnderwriterTestSet;
	$tests->{$newseq} = $testset;
    }

    my $newtest;
    
    my $newtest = new UnderwriterTest;
    
    $newtest->id($newtestid);
    $newtest->nextTest($newtestnext);
    $newtest->answer($newtestanswer);
    
    $testset->StoreTest($newtest);
}

sub Terminal
{
    my $self = shift;
    
    my ($sequence, $currentcode, $condition) = @_;

    my $tests = $self->{tests};

    $testset = $tests->{$sequence};

    return 0 unless defined($testset);

    my $test = $testset->GetTest($currentcode);

    if ($test)
    {
	$condition = ($test->answer()) ? $condition : !$condition;
	return (($condition) && ($test->nextTest() == 0));
    }
    0;
}

1;

