package LIMS::Model::Email;

use Moose;
extends 'LIMS::Model::Base';
with (
    'LIMS::Model::Roles::SessionData', # provides $self->user_profile
    'LIMS::Model::Roles::HistoryAction',
);

use namespace::clean -except => 'meta';

has form_data => ( is => 'rw', isa => 'HashRef', default => sub { {} } );

__PACKAGE__->meta->make_immutable;

use LIMS::Local::Mail qw(dispatch);

#-------------------------------------------------------------------------------
sub diagnosis_status_alert {
    my $self = shift;
    my $data = shift; # hashref of: recipients (arrayref), settings (hashref),
                      # message (str), subject (str)
    
    my $recipients = $data->{all_recipients}; # arrayref
    
    my $db = $self->lims_db; # ie LIMS::DB->new_or_cached;
    
	for my $contact (@$recipients) {
		$data->{recipient} = $contact;
        # forward $data to send_messsage() - will ignore $data->{all_recipients}:
    	if ( my $rtn = $self->send_message($data) ) { # returns error or empty
            return $rtn;
        }
        $self->add_to_actions('e-mailed diagnosis status alert to ' . $contact);
    }
    
    $self->do_request_history();
    
    return 0;
}

#-------------------------------------------------------------------------------
sub send_message {
    my $self = shift;
    my $data = shift; # hashref of: recipient (str), config (hashref),
                      # message (str), subject (str)

    my %mail = (
        to       => $data->{recipient},
        from     => $data->{config}->{email_from},
        smtp     => $data->{config}->{smtp},
        subject  => $data->{subject},
        message  => $data->{message},
		_app_cfg => $data->{config}, # ignored by Mail::Sendmail::sendmail
    ); # $self->debug(\%mail); 
    
    my $rtn = LIMS::Local::Mail::dispatch(\%mail); # returns error or empty
    return $rtn || 0;    
}

#-------------------------------------------------------------------------------
sub send_attachment {
    my $self = shift;
    my $data = shift; # hashref of: recipient (str), config (hashref),
                      # message (str), subject (str), attachment (binary)
	
    my %mail = (
        to       => $data->{recipient},
        from     => $data->{config}->{email_from},
        smtp     => $data->{config}->{smtp},
        subject  => $data->{subject},
        message  => $data->{message},
        file     => $data->{attachment},
        filename => $data->{filename},
		_app_cfg => $data->{config}, # filtered out by send_attachment()
    ); # $self->debug(\%mail); 
    
    my $rtn = LIMS::Local::Mail::send_attachment(\%mail); # returns hasheref
    return $rtn;    
}

#-------------------------------------------------------------------------------
sub add_new_address {
    my ($self, $recipient) = @_;
	# add address if not exists:
	my $o = LIMS::DB::EmailAddress->new(address => $recipient)->load_or_insert;	
}

#-------------------------------------------------------------------------------
sub set_request_id {
    my ($self, $request_id) = @_;
    
    # set form_data params for do_request_history():
    $self->form_data({ _request_id => $request_id });
}

1;