#!/usr/bin/perl
###########################################
# mailit -- Print letters with OpenOffice
# Mike Schilli, 2004 (m@perlmeister.com)
###########################################
use warnings;
use strict;

my $CFG_DIR = "$ENV{HOME}/.mailit";
my $OO_TEMPLATE   = "$CFG_DIR/letter.sxw";
my $ADDR_YML_FILE = "$CFG_DIR/addr.yml";
my $OO_EXE = "$ENV{HOME}/ooffice/soffice";

use OpenOffice::OODoc;
use Template;
use YAML qw(LoadFile);
use File::Temp;
use Date::Calc qw(Language Decode_Language 
                  Today Month_to_Text);

Language(Decode_Language("Deutsch"));
my ($year,$month,$day) = Today();

my $doc = OpenOffice::OODoc::Text->new(
    file => $OO_TEMPLATE,
);

   # Read from STDIN or file given
my $data = join '', <>;

   # Split subject and body
my($subject, $body) = 
             ($data =~ /(.*?)\n\n(.*)/s);

   # Remove superfluous blanks
my $text;
for my $paragraph (split /\n\n/, $body) {
    $paragraph =~ s/\n/ /g;
    $text .= "$paragraph\n\n";
}

my $yml = LoadFile($ADDR_YML_FILE);
my $nick = pick("Recipient", [keys %$yml]);

my $recipient = $yml->{$nick};

print "Preparing letter for ", 
      $recipient->[0], "\n";

my $template = Template->new();

my %vars = (
    recipient => join("\n", @$recipient),
    subject   => $subject,
    text      => $text,
    date      => sprintf("%d. %s %d", 
      $day, Month_to_Text($month), $year),
);

for my $e ($doc->getTextElementList()) {

    my $text_element = $doc->getText($e);

    $template->process(\$text_element,
        \%vars,
        sub { $doc->setText($e, $_[0]); });
}

my $oo_output = File::Temp->new(
    TEMPLATE => 'ooXXXXX',
    DIR      => '/tmp',
    SUFFIX   => '.sxw',
    UNLINK   => 1,
);

$doc->save($oo_output->filename);

print "Printing $oo_output\n";
system("$OO_EXE -p $oo_output");

###########################################
sub pick {
###########################################
    my ($prompt, $options) = @_;

    my $count = 0;
    my %files = ();

    foreach (@$options) {
        print STDERR "[", 
              ++$count, "] $_\n";
        $files{$count} = $_;
    }

    print STDERR "$prompt [1]> ";
    my $input = <STDIN>;
    chomp($input);

    $input = 1 unless length($input);
    return "$files{$input}";
}
