#!/usr/bin/perl
# Načte text zprávy a seznam adres a rozešle zprávu všem adresám ze seznamu.
# Na rozdíl od rozeslat_zpravu.pl si ke každému člověku přečte další sloupce s parametry,
# které pak do zprávy vkládá pomocí $1, $2 atd.
# Tato verze je šitá na míru hlasování o turnajích (od roku 2011), takže ví, co parametry znamenají,
# a vypočítá z nich hlasovací kód.
# Copyright © 2006-2016 Dan Zeman <zeman@ufal.mff.cuni.cz>
# Licence: GNU GPL
# 9.7.2014: Kódy osob v databázi mohou být nyní až pětimístné.
# 12.6.2016: Kódy osob v databázi mohou být nyní až šestimístné (ne že by přibylo tolik hráčů, ale Klárka se někde uklikla).

# Použití: perl rozeslat_zpravu_parametry.pl seznam_adres.txt predmet text_zpravy.txt
# Text zprávy musí být v kódování UTF-8.
# Seznam adres musí obsahovat na každém řádku právě jednu adresu a další parametry oddělené tabulátory, musí být v UTF-8.

use utf8;
use open ":utf8";
use Encode;

my $soubor_adresy = $ARGV[0];
my $predmet = $ARGV[1];
my $soubor_zprava = $ARGV[2];

# Načíst text zprávy.
open(ZPRAVA, $soubor_zprava) or die("Nelze cist $soubor_zprava: $!\n");
while(<ZPRAVA>)
{
    $zprava .= $_;
}
close(ZPRAVA);
# Načíst seznam adres.
open(SEZNAM, $soubor_adresy) or die("Nelze cist $soubor_adresy: $!\n");
while(<SEZNAM>)
{
    s/\r?\n$//;
    # Rozsekat řádek na jednotlivé sloupce: první (resp. nultý) je e-mail, dále jsou parametry $1, $2...
    my @sloupce = split(/\t/, $_);
    # Specialita pro hlasování o turnajích na Deskohraní: pátý sloupec je hlasovací kód, který musíme dopočítat.
    if(length($sloupce[2])>2)
    {
        die("Očekáván nejvýše dvouciferný počet hlasů, u $sloupce[0] je $sloupce[2]");
    }
    if(length($sloupce[1])>6)
    {
        die("Očekáván nejvýše šesticiferný kód osoby, u $sloupce[0] je $sloupce[1]");
    }
    my $kod = sprintf("%02d%06d00", $sloupce[2], $sloupce[1]);
    # Poslední dvojčíslí je kontrolní a musí zajistit, aby celý kód byl dělitelný jedenácti.
    my $zbytek = $kod % 11;
    # Přičíst ke kódu 11-zbytek a znova ho prohnat sprintfem, aby nám nezmizela případná nula na začátku.
    $kod = sprintf("%010d", $kod+(11-$zbytek));
    push(@sloupce, $kod);
    # Na rozdíl od skriptu rozeslat_zpravu.pl (bez parametrů), tady počítáme s případným zasláním dvou různých mailů
    # s různými hlasovacími kódy na stejnou adresu, a nebudeme tedy ze seznamu adres odstraňovat duplikáty.
    push(@zaznamy, \@sloupce);
}
close(SEZNAM);
# Rozeslat zprávu na všechny adresy.
foreach my $zaznam (sort {$a->[0] cmp $b->[0]} (@zaznamy))
{
    my $adresa = $zaznam->[0];
    print STDERR ("Odesila se na adresu $adresa\n");
    my $zprava1 = $zprava;
    my @parametry = @{$zaznam};
    for(my $i = 0; $i<=$#parametry; $i++)
    {
        $zprava1 =~ s/\$$i/$parametry[$i]/g;
    }
    poslat_zpravu($adresa, $predmet, $zprava1);
}



#------------------------------------------------------------------------------
# Odešle zprávu na zadanou adresu.
#------------------------------------------------------------------------------
sub poslat_zpravu
{
    my $adresat = shift;
    my $predmet = shift;
    my $text = shift;
    my $sendmail = "/usr/lib/sendmail";
    if(! -e $sendmail)
    {
        die("Nenalezen $sendmail.\n");
    }
    if($adresat !~ m/\@/)
    {
        print STDERR ("Varovani: Adresa neobsahuje zavinac, preskakuji ji.\n");
    }
    # Odstranit případnou diakritiku z předmětu.
    $predmet =~ tr/ÁČĎÉĚÍŇÓŘŠŤÚŮÝŽáčďéěíňóřšťúůýžß/ACDEEINORSTUUYZacdeeinorstuuyzs/;
    $predmet = encode("ascii", $predmet);
    my $mail;
    $mail .= "From: Deskohrani <info\@deskohrani.cz>\n";
#    $mail .= "Reply-to: info\@deskohrani.cz\n";
    $mail .= "To: $adresat\n";
#    $mail .= "Cc: klara\@hrejsi.cz\n";
    $mail .= "Subject: $predmet\n";
    $mail .= "Content-Type: text/plain; charset=\"utf-8\"\n";
    $mail .= "Content-Transfer-Encoding: 8bit\n\n";
    $mail .= $text;
    # Odeslat zprávu.
    open(SENDMAIL, "|$sendmail -oi -t") or print "Nemůžu otevřít rouru do $sendmail: $!\n";
    print SENDMAIL ($mail);
    close(SENDMAIL);
    # Na disk uložit kopii odeslané zprávy.
    open(KOPIE, ">zprava-pro-$adresat.txt");
    print KOPIE ($mail);
    close(KOPIE);
}
