package Eixo::Queue::Job;

use strict;
use Eixo::Base::Clase;

use JSON;
use Data::UUID;

use Eixo::Queue::JobCifrador;

my $UUID_INSTANCE;

BEGIN{
    $UUID_INSTANCE = Data::UUID->new;
}

sub WAITING     { 'WAITING' }
sub PROCESSING    { 'PROCESSING' }
sub FINISHED    { 'FINISHED' }
sub ERROR    { 'ERROR' }


sub ID{

    $UUID_INSTANCE->create_str;
}

my %NO_SERIALIZE = (
    #id => 1
);


has(

    id=> undef,

    queue=>undef,

    status=>WAITING,

    creation_timestamp=>time,

    start_timestamp => undef,
    
    termination_timestamp => undef,

    args=>undef,

    results=>undef,

);


sub initialize {
    my ($self,@args) = @_;

    $self->{id} = &ID;
    $self->{args} = {};
    $self->{results} = {};

    $self->SUPER::initialize(@args);
    
}

sub to_hash {

    return {

        map {
            $_ => $_[0]->{$_}
        }
        grep{
            !$NO_SERIALIZE{$_}
        }
        keys(%{ $_[0] })
    
    }
}

sub TO_JSON {
    $_[0]->to_hash
}

sub copy{
    my ($self, $j) = @_;

    $self->{$_} = $j->{$_} foreach(keys(%$j));
}

sub processing{
    
    $_[0]->start_timestamp(time) && $_[0]->status(PROCESSING)
}

sub finished{

    $_[0]->termination_timestamp(time) && $_[0]->status(FINISHED)

}


sub serialize{
    my ($self) = @_;

    JSON->new->convert_blessed->encode( $self )
}

sub unserialize{
    my ($package, $data) = @_;

    if(ref($package)){
        $package = ref($package);
    }

    bless(JSON->new->decode($data), $package);
}

sub setArg{
    my ($self, $key, $value) = @_;

    $self->args->{$key} = $value;
}

sub setResult{
    my ($self, $key, $value) = @_;

    $self->results->{$key} = $value;
}

sub removeResult{
    my ($self, $key) = @_;

    delete($self->results->{$key});
} 
sub cifrar :Sig(self, s){
    Eixo::Queue::JobCifrador->new->cifrar(@_);
}

sub descifrar :Sig(self, s, s){
    Eixo::Queue::JobCifrador->new->descifrar(@_);
}


1;