#!/usr/bin/perl

use warnings;
use strict;

use AnyEvent::SMTP::Server;
use AnyEvent::SMTP::Client qw(sendmail);
use Data::Dump qw(dump);

use lib 'lib';
use MQR::Redis;

my $host = $ENV{SMTP_HOST} || '0.0.0.0';
my $port = $ENV{SMTP_PORT} || 2525;
my $server = $ENV{SMTP_SERVER};

MQR::Redis->redis->psubscribe( "SEND $host:$port smtp *", sub {
	my ( $message, $channel ) = @_;
	my ( undef, undef, undef, $from, $to ) = split(/\s/,$channel);
	warn "sendmail $from -> $to | $message\n";

	my $f = $to;
	$f =~ s/\@.+//;
	$f .= '@mqr.rot13.org';

	sendmail
		from => $f,
		to => $from,
		data => "Subject: $message\n\n$message",
		cb => sub {
			my ($ok,$error) = @_;
			warn "# sendmail ", $ok && "OK $ok" || "ERROR: $error", "\n";
		},
#		debug => 1, # XXX
		server => $server,
});

my $smtp = AnyEvent::SMTP::Server->new( host => $host, port => $port );

$smtp->reg_cb(
	client => sub {
		my ($s,$con) = @_;
		warn "Client from $con->{host}:$con->{port} connected\n";
	},
	disconnect => sub {
		my ($s,$con) = @_;
		warn "Client from $con->{host}:$con->{port} gone\n";
	},
	mail => sub {
		my ($s,$mail) = @_;
		my $from = $mail->{from};
		warn "Received mail from $from to ",join(' and ',@{$mail->{to}}), "\n$mail->{data}\n";
		foreach my $to ( @{ $mail->{to} } ) {
			my $subject = $1 if $mail->{data} =~ m/^Subject:\s*(.+)$/m;
			$subject =~ s/[\s\r\n]+$//; # XXX important!
			MQR::Redis->publish( "MSG $host:$port smtp $from $to" => $subject );
		}
	},
);

$smtp->start;
AnyEvent->condvar->recv;
