package Razor2::Client::Engine;

use strict;
use Digest::SHA1 qw(sha1_hex);
use Digest::Nilsimsa;
use Data::Dumper;
use Razor2::Signature::Ephemeral;
use Razor2::String qw(hextobase64 makesis debugobj);

# meant to be inherited
#
sub new {
    return {};
}


sub supported_engines {

    my @a = qw( 1 2 3 4 );

    my $hr = {};
    foreach (@a) { $hr->{$_} = 1; }

    return wantarray ? @a : $hr;
}


sub compute_engine {
    my ($self, $engine, @params) = @_;

    return $self->vr1_signature(@params) if $engine == 1;
    return $self->vr2_signature(@params) if $engine == 2;
    return $self->vr3_signature(@params) if $engine == 3;
    return $self->vr4_signature(@params) if $engine == 4;

    $self->log (1,"engine $engine not supported");
    return;
}

#
# The following *_signature subroutines should be
# the same as the ones on the server 
# 


#
# VR1 Engine - Razor 1.0 SHA1 signatures
#
# fixme - how is this different from VR2 ?
#
sub vr1_signature { 
    my ($self, $text) = @_;

    my $sig = hextobase64(sha1_hex($$text));
    $self->log (11,"engine 1 computing on ". length($$text) .", sig=$sig");
    return $sig;
}



#
# VR2 Engine - SHA1 signatures of decoded body content
#
sub vr2_signature { 
    my ($self, $text) = @_;

    my $sha1 = sha1_hex($$text);
    my $h2b = hextobase64($sha1);
    $self->log (11,"engine 2 computing on ". length($$text) .", sig=$h2b");
    return $h2b;
}


#
# VR3 Engine - Nilsimsa signatures of decoded body content
#
sub vr3_signature { 

    my ($self, $text) = @_;

    my $nilsimsa = new Digest::Nilsimsa;
    $self->log(1,"couldn't load Digest::Nilsimsa") unless $nilsimsa;

    my $digest = $nilsimsa->text2digest($$text);
    my $h2b = hextobase64($digest);

    #my $line = debugobj($text);
    #$self->log(8,"Nilsimsa digest: $digest; b64: $h2b;\n$line");

    $self->log (11,"engine 3 computing on ". length($$text) .", sig=$h2b");

    return $h2b;
}



#
# VR4 Engine - Ephemereal signatures of decoded body content
#
sub vr4_signature { 

    my ($self, $text, $ep4) = @_;

    my ($seed, $separator) = split /-/, $ep4, 2;

    return $self->log(1,"vr4_signature: Bad ep4: $ep4") unless ($seed && $separator);

    my $ehash = new Razor2::Signature::Ephemeral (seed => $seed, separator => $separator);
    my $digest = $ehash->hexdigest($$text);

    my $sig = hextobase64($digest);
    $self->log (11,"engine 4 computing on ". length($$text) .", sig=$sig");
    return $sig;
}




1;

