package Qpsmtpd::Constants;
use strict;
require Exporter;

# log levels
my %log_levels = (
	LOGDEBUG   => 7,
	LOGINFO    => 6,
	LOGNOTICE  => 5,
	LOGWARN    => 4,
	LOGERROR   => 3,
	LOGCRIT    => 2,
	LOGALERT   => 1,
	LOGEMERG   => 0,
	LOGRADAR   => 0,
);

# return codes
my %return_codes = (
	OK                     => 900,
	DENY                   => 901,   # 550
	DENYSOFT               => 902,   # 450
	DENYHARD               => 903,   # 550 + disconnect  (deprecated in 0.29)
	DENY_DISCONNECT        => 903,   # 550 + disconnect
	DENYSOFT_DISCONNECT    => 904,   # 450 + disconnect
	DECLINED               => 909,
	DONE                   => 910,
	CONTINUATION           => 911,   # deprecated - use YIELD
	YIELD                  => 911,
);

use vars qw(@ISA @EXPORT);
@ISA = qw(Exporter);
@EXPORT = (keys(%return_codes), keys(%log_levels), "return_code", "log_level");

foreach (keys %return_codes ) {
    eval "use constant $_ => ".$return_codes{$_};
}

foreach (keys %log_levels ) {
    eval "use constant $_ => ".$log_levels{$_};
}

sub return_code {
    my $test = shift;
    if ( $test =~ /^\d+$/ ) { # need to return the textural form
	foreach ( keys %return_codes ) {
	    return $_ if $return_codes{$_} =~ /$test/;
	}
    }
    else { # just return the numeric value
	return $return_codes{$test};
    }
}

sub log_level {
    my $test = shift;
    if ( $test =~ /^\d+$/ ) { # need to return the textural form
	foreach ( keys %log_levels ) {
	    return $_ if $log_levels{$_} =~ /$test/;
	}
    }
    else { # just return the numeric value
	return $log_levels{$test};
    }
}

1;

=head1 NAME

Qpsmtpd::Constants - Constants for plugins to use

=head1 CONSTANTS

See L<README.plugins> for hook specific information on applicable
constants.

Constants available:

=over 4

=item C<OK>

Return this only from the queue phase to indicate the mail was queued
successfully.

=item C<DENY>

Returning this from a hook causes a 5xx error (hard failure) to be
returned to the connecting client.

=item C<DENYSOFT>

Returning this from a hook causes a 4xx error (temporary failure - try
again later) to be returned to the connecting client.

=item C<DECLINED>

Returning this from a hook implies success, but tells qpsmtpd to go
on to the next plugin.

=item C<DONE>

Returning this from a hook implies success, but tells qpsmtpd to
skip any remaining plugins for this phase.

=back

=cut