#!/usr/bin/perl
# Zobrazí přehled akcí v určité hře ve všech letech.
# Copyright © 2004-2006, 2014 Dan Zeman <zeman@ufal.mff.cuni.cz>
# Licence: GNU GPL
# 16.8.2014: Ročníky jsou řazené sestupně, protože Jakub zkazil styl úzkým pozadím a pravá část tabulky přestává být vidět.

use utf8;
use open ':utf8';
binmode(STDIN, ':utf8');
binmode(STDOUT, ':utf8');
binmode(STDERR, ':utf8');
use Encode; # funkce pro překódování
use DBI; # spolupráce se serverem MySQL
# Říct Perlu, kde najde Danovy sdílené knihovny.
# CGI skripty běží pod uživatelem apache, který nemá tyto knihovny v cestě.
use lib '/s/w/lib/dan';
use dancgi; # čtení parametrů z webu nebo z ARGV
use jazyky; # jazykové verze textů
use mso; # funkce pro generování stránek o olympiádě



# Připojit se k databázi.
$databaze = mso::pripojit_se_k_databazi();



# Výchozí nastavení parametrů. Může být přebito parametry z URL/ARGV.
mso::provest_vychozi_nastaveni_parametru(\%konfig, $databaze);
$konfig{trid} = 'hra,akce,datz,casz,datk,cask';
$konfig{_trideni} = ['_nazev_hry_tridici', 'nazev', '_zacatek_datum_tridici', '_zacatek_cas_tridici', '_konec_datum_tridici', '_konec_cas_tridici'];
# Načíst parametry z URL.
dancgi::cist_parametry(\%konfig);
# Umožnit volat skript z příkazového řádku a předat parametry tam (např. perl partie.pl zdroj=cas).
dancgi::rozebrat_parametry($ARGV[0], \%konfig);
# Opsat z parametrů jazyk a pak doplnit jazykově závislé hodnoty.
$konfig{jazyk} = 'cs' if($konfig{jazyk} eq '');
$jazyky::jazyk = $konfig{jazyk};



# Přečíst tabulku akcí.
$akce = nacist_akce($databaze, $konfig{hra});
# Vypsat přehled akcí na obrazovku.
mso::vypsat_stranku(
{
    'nazev'  => "MSO: $konfig{rok}: ".jazyky::zjistit('prehled_akci'),
    'nadpis' => jazyky::zjistit('h1_prehled_akci_ve_hre')." $akce->[0]{_nazev_hry}",
    'telo'   => sestavit_tabulku_akci($akce, \%konfig),
    'rok'    => $konfig{rok}
});



###############################################################################
# PODPROGRAMY
###############################################################################



#------------------------------------------------------------------------------
# Načte z databáze tabulku akcí a dopočítá hodnoty, které by se mohly hodit
# (např. oddělí datum a čas začátku). Vyšli jsme ze stejnojmenné funkce
# v modulu mso, která připravuje akce všech her v daném roce. Tady ale
# potřebujeme akce dané hry ve všech letech.
#------------------------------------------------------------------------------
sub nacist_akce
{
    my $databaze = shift;
    my $hra = shift;
    my @akce;
    my $nazev_jazyk = jazyky::zjistit("klic_nazev");
    my @nazvy = ("rok", "kod_hry", "kod_turnaje", "akce.$nazev_jazyk", "zacatek", "konec", "propozice", "pocet_prihlasenych", "pocet_ucastniku", "hry.$nazev_jazyk", "prihlasky");
    my $dotaz = "SELECT ".join(", ", @nazvy)." FROM akce INNER JOIN hry ON hry.kod = akce.kod_hry WHERE kod_hry = '$hra'";
    my $dtzobj = $databaze->prepare($dotaz);
    $dtzobj->execute();
    while(my @radek = map{decode("utf8", $_)}($dtzobj->fetchrow_array()))
    {
        # Nahashovat informace o akci.
        my %a;
        for(my $i = 0; $i<=$#nazvy; $i++)
        {
            $a{$nazvy[$i]} = $radek[$i];
        }
        # Zkopírovat název akce pod klíč, pod kterým jsme ho měli dřív.
        $a{$nazev_jazyk} = $a{"akce.$nazev_jazyk"};
        # Oddělit datum a čas začátku akce.
        if($a{zacatek} =~ m/^(\d+)\.(\d+)\.(\d+) (\d+):(\d+):\d+$/)
        {
            $a{_zacatek_datum} = "$1.$2.$3";
            $a{_zacatek_cas} = "$4:$5";
            $a{_zacatek_datum_tridici} = sprintf("%04d%02d%02d", $3, $2, $1);
            $a{_zacatek_cas_tridici} = sprintf("%02d%02d", $4, $5);
        }
        # Oddělit datum a čas konce akce.
        if($a{konec} =~ m/^(\d+)\.(\d+)\.(\d+) (\d+):(\d+):\d+$/)
        {
            $a{_konec_datum} = "$1.$2.$3";
            $a{_konec_cas} = "$4:$5";
            $a{_konec_datum_tridici} = sprintf("%04d%02d%02d", $3, $2, $1);
            $a{_konec_cas_tridici} = sprintf("%02d%02d", $4, $5);
        }
        # Doplnit název hry v požadovaném jazyce.
        $a{_nazev_hry} = $a{"hry.$nazev_jazyk"};
        $a{_nazev_akce} = $a{$nazev_jazyk};
        $a{_nazev_hry_tridici} = csort::zjistit_tridici_hodnoty($a{_nazev_hry}, $jazyky::jazyk);
        $a{_nazev_akce_tridici} = csort::zjistit_tridici_hodnoty($a{$nazev_jazyk}, $jazyky::jazyk);
        # Odstranit z parametrů třídění, v propozicích tento parametr není potřeba.
        # Bráníme se tím kombinatorické explozi, až budeme převádět stránky na statické.
        my %parametry_hra = %main::konfig;
        delete($parametry_hra{trid});
        # Známe-li výsledky akce, odkaz povede na ně. Jinak povede na propozice.
        if($a{pocet_ucastniku})
        {
            my $parametry_vysledky   = dancgi::sestavit_parametry_odkaz(\%parametry_hra, "telo=vysledky.pl", "hra=$a{kod_hry}", "rok=$a{rok}", "turnaj=$a{kod_turnaje}");
            $a{_odkaz} = "index.pl?$parametry_vysledky";
        }
        else
        {
            my $parametry_propozice = dancgi::sestavit_parametry_odkaz(\%parametry_hra, "telo=propozice.pl", "hra=$a{kod_hry}", "rok=$a{rok}", "turnaj=$a{kod_turnaje}");
            $a{_odkaz} = "index.pl?$parametry_propozice";
        }
        push(@akce, \%a);
    }
    return \@akce;
}



#------------------------------------------------------------------------------
# Sestaví HTML tabulku akcí a vrátí ji jako řetězec s HTML kódem.
# Potřebuje k tomu databázovou tabulku akcí, ve které jsou již dopočítané
# některé hodnoty a která je správně seřazená.
#------------------------------------------------------------------------------
sub sestavit_tabulku_akci
{
    my $akce = shift; # databázová tabulka akcí načtená z Accessu
    my $konfig = shift; # odkaz na hash
    # Pro každou akci si zapamatovat, ve kterých letech se konala.
    my %matice; # indexována názvem akce, pak rokem, obojí jako hash
    my $minrok;
    my $maxrok;
    foreach my $a (@{$akce})
    {
        $matice{$a->{_nazev_akce}}{$a->{rok}} = $a;
        $matice{$a->{_nazev_akce}}{trideni} = $a->{_nazev_akce_tridici};
        # Zapamatovat si první a poslední rok.
        if(!defined($minrok) || $a->{rok}<$minrok)
        {
            $minrok = $a->{rok};
        }
        if(!defined($maxrok) || $a->{rok}>$maxrok)
        {
            $maxrok = $a->{rok};
        }
        if(!defined($matice{$a->{_nazev_akce}}{maxrok}) || $a->{rok} > $matice{$a->{_nazev_akce}}{maxrok})
        {
            $matice{$a->{_nazev_akce}}{maxrok} = $a->{rok};
        }
    }
    # Setřídit typy akcí podle posledního roku, ve kterém se objevily, pak podle názvu akce.
    my @nazvy_akci_setridene = sort
    {
        my $vysledek = $matice{$b}{maxrok} <=> $matice{$a}{maxrok};
        unless($vysledek)
        {
            $vysledek = $matice{$a}{trideni} cmp $matice{$b}{trideni};
        }
    }
    (keys(%matice));
    my $tabulka; # výstupní HTML řetězec.
    # Jakub zkazil styl tím, že zavedl pevnou šířku obsahu stránky.
    # Naštěstí alespoň poskytl způsob, jak to vypnout pro stránky, na kterých jsou tabulky, které se do toho úzkého prostoru nevejdou.
    # Řešení není nic moc, protože je to i nadále pevná šířka, ale je alespoň větší.
    $tabulka .= "<style type=text/css>\n";
    $tabulka .= ".big #content {width: 1200px !important}\n";
    $tabulka .= ".big .wrapper {width: 1370px !important}\n";
    $tabulka .= ".big #top, .big #footer {width: 1400px !important}\n";
    $tabulka .= "</style>\n";
    $tabulka .= "<table class=\"linky small\" border=\"1\">\n";
    # Přidat záhlaví tabulky.
    $tabulka .= "<tr><th>Č.</th><th>Akce</th><th colspan=\"".($maxrok-$minrok+1)."\">Roky</th></tr>\n";
    my $poradi = 1;
    foreach my $akce (@nazvy_akci_setridene)
    {
        # Začít nový řádek tabulky.
        $tabulka .= "<tr>";
        # Přidat číslo řádku.
        $tabulka .= "<td align=right>".($poradi++).".</td>";
        # Přidat název akce.
        $tabulka .= "<td align=left>$akce</td>";
        # Přidat všechny roky, ve kterých se akce konala.
        for(my $i_rok = $maxrok; $i_rok>=$minrok; $i_rok--)
        {
            $tabulka .= "<td>";
            if(exists($matice{$akce}{$i_rok}))
            {
                $tabulka .= "<a href=\"$matice{$akce}{$i_rok}{_odkaz}\" target=\"_top\">$i_rok</a>";
            }
            $tabulka .= "</td>";
        }
        # Ukončit řádek tabulky.
        $tabulka .= "</tr>\n";
    }
    $tabulka .= "</table>\n";
    return $tabulka;
}
