package RPS::Portal::Token;

use strict;
use warnings;
use Digest::MD5 qw(md5_hex);

use lib '/app/tools/common/lib';
use Common::Assert;

use constant kTokenExpireSeconds => 2592000;    # 30 days

sub new {
    my ( $class, %args ) = @_;
    assert( $args{clientID} );
    assert( $args{payeeID} );
    assert( $args{payeeType} );
    assert( $args{email} );

    my $self = bless {}, $class;

    $self->{_clientID}  = $args{clientID};
    $self->{_payeeID}   = $args{payeeID};
    $self->{_payeeType} = $args{payeeType};
    $self->{_email}     = $args{email};
    $self->{_token}     = undef;

    return $self;
}

sub IsValidToken {
    my ( $self, $token2 ) = @_;

    my $myToken = $self->GetToken();
    if ( $token2 && $token2 =~ /^($myToken)(.+)$/ ) {
        my $timeSet = $2;
        if ( $timeSet + kTokenExpireSeconds > time() ) {
            return 1;
        } else {
            return undef;
        }
    } else {
        return undef;
    }
}

sub GetToken {
    my $self = shift;

    if ( !defined $self->{_token} ) {
        my $tokenString = $self->{_clientID} . "_" . $self->{_payeeID} . "_" . $self->{_payeeType} . "_" . $self->{_email};
        $self->{_token} = md5_hex( $tokenString, "h4ppYc0lOr3dMar81e5" );
    }

    return $self->{_token};
}

sub GetTimedToken {
    my $self = shift;
    return $self->GetToken() . time();
}

1;

