package Crypt::Keyczar::KeyVersion;
use strict;
use warnings;
use Crypt::Keyczar::Util qw(json_true json_false);
use Carp;



sub new {
    my $class = shift;
    my ($version, $status, $exportable) = @_;
    my $self = bless {
        exportable    => json_false(),
        status        => 'ACTIVE',
        version_number => 0,
    }, $class;
    $self->exportable($exportable) if defined $exportable;
    $self->status($status) if defined $status;
    $self->{version_number} = $version if defined $version;
    return $self;
}

sub create {
    my $class = shift;
    my $opt = shift;
    return $class->new($opt->{versionNumber}, $opt->{status}, $opt->{exportable});
}

sub read {
    my $class = shift;
    my $json_string = shift;
    my $obj = from_json($json_string);
    return bless $obj, $class;
}



sub exportable {
    my $self = shift;
    $self->{exportable} = $_[0] ? json_true() : json_false() if @_;
    return $self->{exportable} eq json_true() ? 1 : undef;
}


sub status {
    my $self = shift;
    if (@_) {
        if (uc $_[0] eq 'ACTIVE') {
            $self->{status} = uc $_[0];
        }
        elsif (uc $_[0] eq 'PRIMARY') {
            $self->{status} = uc $_[0];
        }
        elsif (uc $_[0] eq 'INACTIVE') {
            $self->{status} = uc $_[0];
        }
        else {
            croak "unknown key status: $_[0]";
        }
    }
    return $self->{status};
}


sub get_number {
    my $self = shift;
    $self->{version_number} = shift if @_;
    return $self->{version_number};
}



sub expose {
    my $self = shift;
    my $expose = {};
    $expose->{exportable} = $self->{exportable} ? json_true() : json_false();
    $expose->{status}     = $self->{status};
    $expose->{versionNumber} = $self->{version_number};
    return $expose;
}
sub to_string { return to_json($_[0]->expose) }



1;
__END__