#!/usr/bin/perl
#

use strict;

package Common::Message;

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

use base 'Common::FormObject';

use Data::Dumper;

sub Area { die "Must be overloaded" }

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

    if ( $args{dbItem} ) {
        $self->_initFromDBItem( $args{dbItem} );
    } elsif ( defined $args{messageID} ) {
        $self->_initFromID( $args{messageID} );
    } else {
        $self->_initFromDefaults();
    }

    return $self;
}

sub _initFromID {
    my ( $self, $id ) = @_;

    my $dbItem = Common::DB::Item::Message->Lookup( message_id => $id );
    return $self->_initFromDBItem($dbItem);
}

sub _initFromDBItem {
    my ( $self, $dbItem ) = @_;
    my $properties = {};

    foreach my $fieldName ( keys %$dbItem ) {
        next if '_' eq substr( $fieldName, 0, 1 );
        $properties->{$fieldName} = $dbItem->$fieldName;
    }

    $self->_initProperties($properties);
}

sub _initFromDefaults {
    my $self = shift;

    $self->_initProperties( {} );
}

sub _initProperties {
    my $self       = shift;
    my $properties = shift;

    $self->{MessageID} = new Common::FormObject::Scalar::ID( value => $properties->{message_id} );
    $self->{ClientID}  = new Common::FormObject::Scalar::ID( value => $properties->{client_id} );
    $self->{Title}    = new Common::FormObject::Scalar::String( value => $properties->{title} );
    $self->{Synopsis} = new Common::FormObject::Scalar::String( value => $properties->{synopsis} );
    $self->{Body}     = new Common::FormObject::Scalar::String( value => $properties->{body} );
    $self->{Type}     = new Common::FormObject::Scalar::String( value => $properties->{type} );
    $self->{Area}     = new Common::FormObject::Scalar::String( value => $properties->{area} );
    $self->{DateExpires} = new Common::FormObject::Scalar::DateTime( value => $properties->{date_expires} );
    $self->{DateCreated} = new Common::FormObject::Scalar::DateTime( value => $properties->{date_created} );

    return $self;
}

sub GetMessages {
    my $class = shift;
    my %args  = @_;
    my $limit = $args{limit};
    my $type  = $args{type};
    my $area  = $class->Area();

    my @result;

    my $collection = Common::DB::Item::Message->GetLastMessages( limit => $limit, type => $type, area => $area );

    while ( my $message = $collection->next() ) {
        push( @result, $class->new( dbItem => $message ) );
    }

    return @result ? \@result : undef;
}

sub GetAlert {
    my $class = shift;

    my $messages = $class->GetMessages( limit => 1, type => 'alert' );

    return $messages ? $messages->[0] : undef;
}

sub Delete {
    my $self = shift;
    my %args = @_;

    my $id = $args{messageID} || die "Message ID Required";

    my $dbItem = Common::DB::Item::Message->Lookup( message_id => $id );

    $dbItem->delete() if ($dbItem);
}

sub save {
    my $self = shift;

    my $dbItem = Common::DB::Item::Message->GetByID( $self->MessageID );

    if ($dbItem) {
        die "M: " . $self->MessageID() . "\n" . Dumper $dbItem;
    }

    $dbItem = Common::DB::Item::Message->Create() unless ($dbItem);

    $dbItem->client_id( $self->ClientID );
    $dbItem->title( $self->Title );
    $dbItem->synopsis( $self->Synopsis );
    $dbItem->body( $self->Body );
    $dbItem->type( $self->Type );
    $dbItem->area( $self->Area );
    $dbItem->date_expires( $self->DateExpires );

    $dbItem->save;
}

1;
