#!/usr/bin/perl

#
# Script for author correspondence
#
# This script reads lists of reference numbers from a file and writes
# corresponding mail, tex-files or address labels.
#
# In addition, you'll need template files for each possible action.
# 
# Syntax: perl script type
#  type =  0 : write debug information to screen
#  type =  1 : write mail (but do not send them)
#  type =  2 : write latex files and generate postscript
#  type =  3 : write address labels (to screen -> redirect)
#
#
# Author: Steinar Hauan <steinhau@pvv.org>
#

$ENV{'PATH'}    = '/bin:/usr/bin';
$ENV{'IFS'}     = '';
$ENV{'SHELL'}   = '/bin/sh';

unshift (@INC,'/local/web/PSESCAPE-97/perl');

require "defines.pl";
require "utils.pl";

$TYPE = 0; # 0=write to stdout, 1=write mail, 2=write latex
if ( $#ARGV > -1 ){ $TYPE = $ARGV[0]; };
if ( $TYPE == 0 ){
    print STDERR "Writing to screen:\n";
} elsif ( $TYPE == 1 ){
    print STDERR "Writing mails...\n";
} elsif ( $TYPE == 2 ){
    print STDERR "Writing latex files...\n";
} elsif ( $TYPE == 3 ){
    print STDERR "Writing address labels...\n";
} else {
    print STDERR "Unknown type '$TYPE' - exit\n";
    exit 1;
}

# we write two sets of mail/letters here,
# both for journal 1 and 2.
@pl = ( 'abbrev1: Journal 1', 'abbrev2: Journal 2');

for $p (@pl)
{
    ($abbrev,$name) = split(/:/,$p);
    (%list) = &ReadList($abbrev);
    
    if ( $TYPE == 0 ){ print STDOUT "\n$name\n\n"; }
    for $key (sort keys %list)
    {
#	print STDOUT "$key: $list{$key}\n";
	$cn = sprintf("%s/paper.ps\@control",$list{$key});
	(%data) = &ReadPaperConfig($cn);
	$title = &FormatStr($data{'title'},50,11);
	$auth = &FormatStr($data{'authors'},50,11);
	if ( $TYPE == 2 ){
	    $adr = &TexAdr($data{'adress'});
	} elsif ( $TYPE == 3 ){
	    $adr = &FormatAdr($data{'adress'});
	} else {
	    $adr = &FormatStr($data{'adress'},50,11);
	}
	$contact = sprintf("%s %s",$data{'firstname'},$data{'lastname'});
	$mail = &GetEmail(%data);

	if ( $TYPE == 0 )
	{
	    print STDOUT "REF: $key\n";
	    print STDOUT "   Title  : $title\n";
	    print STDOUT "   Authors: $auth\n";
	    print STDOUT "   Contact: $contact\n";
	    print STDOUT "   Address: $adr\n";
	    print STDOUT "   E-mail : $mail\n";
	} elsif ( $TYPE == 1 )
	{
	    $str = &SubstTemplate('mail.template',
				  "PAPER_TITLE", $title,
				  "PAPER_REF", $key,
				  "PAPER_AUTHORS", $auth,
				  "JOURNAL_NAME",$name);
	    open(OUT,"> mail/$key:$mail") || die "Open error ($!)";
	    print OUT "$str\n";
	    close(OUT);

	} elsif ( $TYPE == 2 )
	{
	    $str = &SubstTemplate('brev.template',
				  "PAPERCONTACT",$contact,
				  "PAPERADDRESS",$adr,
				  "PAPERTITLE", $title,
				  "PAPERREF", $key,
				  "PAPERAUTHORS", $auth,
				  "JOURNALNAME",$name);
	    open(OUT,"> brev/$key.tex") || die "Open error ($!)";
	    print OUT "$str\n";
	    close(OUT);
	    system("chdir brev; $TEX2PS $key.tex");
	    
	} elsif ( $TYPE == 3 )
	{
	    print STDOUT "\n$contact\n$adr\n";
	} else {
	    print STDERR "Unknown output TYPE='$TYPE'\n";
	    exit;
	}
    }
}

sub GetEmail
{
    local(%d) = @_;
    local($receiver);

    if ($d{'email'} eq 'NONE' ||
        $d{'email'} eq '' )
    {
	# remove whitespace in name information
	local($first) = $d{'firstname'};
	$first =~ s/(\s+)//g;
	local($last) = $d{'lastname'};
	$last =~ s/(\s+)//g;
	$receiver = sprintf("%s.%s\@%s.fax",
			    $first,$last,$d{'fax'});
    } else {
	$receiver = $d{'email'};
    }
    return ($receiver);
}

# read references for current set from file
sub ReadList
{
    local($name) = @_;
    local($fname) = sprintf("%s.list",$name);
    local(%l);

    open(FD,"$fname") || 
	die "Unable to open '$fname'";

    while(<FD>)
    {
	chop;
	local($n) = $_;
	local($d) = &Num2Dir($n);
	if ( ! -d $d ){
	    print STDERR "$fname: Illegal reference - '$_'\n";
	    next;
	}
	$l{$n} = $d;
    }
    return (%l);
}

sub TexAdr
{
    local($raw) = @_;
    
    local(@lines) = split(/,/,$raw);

    # convert country to uppercase
    $lines[$#lines] =~ y/a-z/A-Z/;

    local($form) = "";
    for $l (@lines)
    {
        $l =~ s/^(\s+)//;
        $form .= "$l\\\\";
    }
    return($form);
}
