package MyOrg::Template::Plugin::Mail;

use strict;
use base qw(Template::Plugin);
use vars qw($VERSION $AUTOLOAD);

use Mail::Sendmail;
use Net::Domain qw(hostfqdn);
use Template::Exception;
use Template::Plugin;

$VERSION = 1.00;
$AUTOLOAD = undef;

sub new {
    my ($class, $context, $params) = @_;
    my $self;

    $params->{ 'server' } = "mailhost"
        unless defined $params->{ 'server' };

    $self = bless {
        _CONTEXT        => $context,
        _ORIG_PARAMS    => $params,
        _PARAMS         => { },
        _LOGMESSAGE     => "",
    } => $class;

    $self->reset();
    return $self;
}

sub reset {
    my $self = shift;
    delete $self->{ _ORIG_PARAMS }->{ 'message-id' };
    %{ $self->{ _PARAMS } } = %{ $self->{ _ORIG_PARAMS } };
    $self->{ _LOGMESSAGE } = "";
    return $self;
}

sub send {
    my $self = shift;
    my ($params, $context) = @$self{ qw( _PARAMS _CONTEXT) };
    my $mail = ref($_[-1]) eq 'HASH' ? pop @_ : { };

    %$mail = ("X-Mailer" => join("/", ref $self, $VERSION),
                %$params,
                %$mail);

    $mail->{'message-id'} = $self->generate_mid()
        unless defined $mail->{'message-id'};

    sendmail(%$mail)
        or $context->throw('mail', $Mail::Sendmail::error);

    $self->{ _LOGMESSAGE } = $Mail::Sendmail::log;

    return "";
}

sub generate_mid {
    my $self = shift;
    my @time = localtime;
    my $junk = join "", map { ('a'..'z', 'A'..'Z')[rand 52] } (0..8);

    my $mid = sprintf '<%d%02d%02d.%s@%s>',
        $time[5] + 1900, $time[4], $time[3], $junk, hostfqdn();

    return $mid;
}

sub logmessage {
    my $self = shift;
    return $self->{ _LOGMESSAGE };        
}

my %multi = map { $_ => 1 } qw(to cc bcc);
sub AUTOLOAD {
    my $self = shift;
    my ($method, $item);

    $method = lc $AUTOLOAD;
    $method =~ s/.*:://;
    $method =~ tr/_/-/;

    # Make an alias
    $item = \$self->{ _PARAMS }->{ $method };

    if (@_) {
        if (defined $multi{ $method }) {
            my @addrs;
            if (ref $_[0] eq 'ARRAY') {
                @addrs = @{$_[0]};
            } else {
                @addrs = @_;
            }
            $$item = join ", ", @addrs;
        } else {
            $$item = shift @_;
        }
        return "";
    }

    return $$item;
}

1;
