# $File: //depot/OurNet-BBS/BBS/RAM/Article.pm $ $Author: autrijus $
# $Revision: #2 $ $Change: 1662 $ $DateTime: 2001/09/02 05:54:09 $

package OurNet::BBS::RAM::Article;

use strict;
use fields qw/dbh board name dir recno mtime btime _ego _hash/;

# btime: file, mtime: index

use OurNet::BBS::Base (
    'ArticleGroup' => [qw/@packlist &new_id/],
);

sub refresh_body {
    my $self = shift;

    $self->{name} ||= $self->new_id();
    return if $self->timestamp(-1, 'btime')
              and defined $self->{_hash}{body};

    # XXX: FETCH BODY
    $self->{_hash}{body} = '' if 0;
    
    return 1;
}

sub refresh_header {
    my $self = shift;

    $self->{name} ||= $self->new_id();
    return if $self->timestamp(-1)
              and defined $self->{_hash}{header};

    $self->refresh_meta();

    # XXX: FETCH HEADER
    my ($from, $date);

    $self->{_hash}{header} = {
        From	=> $from  ||= (
            $self->{_hash}{author} .
            ($self->{_hash}{nick} ? " ($self->{_hash}{nick})" : '')
        ),
        Subject	=> $self->{_hash}{title},
        Date	=> $date ||= scalar localtime($self->{_hash}{id}),
	Board  	=> $self->{board},
    };

    OurNet::BBS::Utils::set_msgid($self->{_hash}{header});
    
    return 1;
}

sub refresh_meta {
    my $self = shift;

    $self->{name} ||= $self->new_id;
    return if $self->timestamp(-1);

    if (defined $self->{recno}) {
        # XXX: FETCH ONE ARTICLE HEADER
        # @{$self->{_hash}}{@packlist} = () if 0;
        undef $self->{recno}
            if ($self->{_hash}{id} and $self->{_hash}{id} ne $self->{name});
    }

    unless (defined $self->{recno}) {
        use Date::Parse;
        use Date::Format;

        $self->{_hash}{id}       = $self->{name};
        $self->{_hash}{author}   ||= 'guest.';
        $self->{_hash}{date}     ||= time2str(
	    '%y/%m/%d', str2time(scalar localtime)
	);
        $self->{_hash}{title}    ||= '(untitled)';

        # XXX: STORE INTO ARTICLE
    }
    else {
        $self->{_hash}{id}       = $self->{name};
    }

    return 1;
}

sub STORE {
    my ($self, $key, $value) = @_;
    $self = $self->ego;

    $self->refresh_meta($key);

    if ($key eq 'body') {
        # XXX: WRITE BODY
        $self->{_hash}{$key} = $value;
        $self->{btime} = 1;
    }
    else {
        $self->{_hash}{$key} = $value;
        $self->{mtime} = 1;
    }

    return 1;
}

sub remove {
    my $self = shift;

    # XXX: DELETE ARTICLE ENTRY
    return 1;
}

1;

