#!/usr/bin/perl -w
#use lib "/home/customers/apulanta/public_html/bin";
use lib "/var/www/html/bin";
use Kotisivu;
use CGI;
#use CGI::Cookie;
use Time::Local;
use strict;
#use Digest::MD5 qw(md5_hex);

#my %keksit = fetch CGI::Cookie;

#TODO:
# - Helppo versio (ilman englanninkielisiä ja b-puolia ja skippausnapilla)
# - Mahdollisuus kirjoittaa biisin nimi
# - Lisää Arvaa-nappuloita sivulle
# - Helppoon versioon esim. 10 biisivaihtoehtoa joista valita

# Vaihtoehtoisia sanapelejä:
# - Eläimiä biiseissä
# - kirjoita 5 seuraavaa sanaa tästä lainista eteenpäin

# Oma ennätys (10 oikein, 0 väärin): 2min31s = 15.1 pts

my $query = new CGI;
my %in = $query->Vars;

$in{submit}=0 if !defined $in{submit};

my $mkml = qq(<LANG fi>Sanapeli</LANG><LANG en>Lyrics Game</LANG>
[1,1]
);
#$mkml.="<LISTBOX>\n";for(keys %ENV){$mkml.="$_:$ENV{$_}\n"}$mkml.="</LISTBOX>";
#$mkml.="<LISTBOX>\n";for(keys %in){my $o=$in{$_};$o=~s/\0/;/g;$mkml.=qq($_ : "$o"\n)}$mkml.="</LISTBOX>";

unlink "tmp/$in{session}" if $in{submit} eq "Aloita alusta";

if (!defined $in{session} || !-e "tmp/$in{session}") {
  if (! -e "tmp/lock") { open LOCK,">tmp/lock" }
  else { open LOCK,"tmp/lock" }
  flock(LOCK,2);
  opendir TMP,"tmp";
  my $f=0;
  for (sort { $a <=> $b } grep(/\d+/,readdir TMP)) {
    next if !/^(\d+)$/;
    $f=$1;
    if (timelocal(localtime)-1800 > (stat("tmp/$f"))[9]) {
      $in{session} = $f;
      last;
    }
  }
  closedir TMP;
  flock(LOCK,8);
  close LOCK;
  $in{session}=$f+1 if !defined $in{session};
  $in{session}=1 if ! -e "tmp/1";
}
else {
  open SESSION,"tmp/$in{session}";
  flock(SESSION,2);
  my %session = Read_config(<SESSION>);
  flock(SESSION,8);
  close SESSION;
  %in = ( %in, %session );
}

open SESSION,">tmp/$in{session}";
flock(SESSION,2);

#$mkml .= $in{session};

$in{n} = 0 if !defined $in{n};
$in{m} = 0 if !defined $in{m};
$in{n_aika} = 0 if !defined $in{n_aika};
$in{m_aika} = 0 if !defined $in{m_aika};
$in{alkuaika} = timelocal(localtime) if !defined $in{alkuaika};

sub Time {
  my $time0 = shift;
  my ( %time, $time );
  $time{h}   = int( $time0 / 3600 );
  $time{min} = int( ( $time0 - $time{h} * 3600 ) / 60 );
  $time{s}   = int( $time0 - $time{h} * 3600 - $time{min} * 60 );
  for (qw(h min s)) {
    $time .= $time{$_} . $_ if $time{$_} > 0;
  }
  $time=0 if !defined $time;
  return $time;
}

if (!defined $in{lang} && $ENV{HTTP_REFERER} =~ m{_([a-z][a-z]).html$}) {
  $in{lang} = $1;
}

my $pts=0;
if ($in{submit} eq "Arvaa") {
  die if $ENV{HTTP_REFERER} !~
    m{http://(217.149.57.154|localhost|www.apulanta.fi|apulanta.fi)/Sanapeli/(index.cgi)?};

  $mkml .= qq(<LISTBOX>\n);

#  $in{oikein} =~ s/(.)/chr(ord($1)-1)/ge;

  my $aika = timelocal(localtime);
  if (defined $in{file}) {
    open F,$in{file} or die "Error opening $in{file}";
    my $link = substr($in{file},0,index($in{file},".txt"));
    my $title;
    chomp($title = scalar <F>);
    if ($title eq $in{oikein} || grep /$in{sanat}/i,<F>) {
      $in{n_aika} += $aika - $in{aika};
      ++$in{n};
      $mkml .= qq(Arvauksesi "[[$link|$title]]" oli oikein\n);
    } else {
      $in{m_aika} += $aika - $in{aika};
      ++$in{m};
      $mkml.= qq(Arvauksesi "$title" oli väärin. "[[$in{file}|$in{oikein}]]" olisi ollut oikein.\n);
    }
    close F;
  } else {
    $in{m_aika} += $aika - $in{aika};
    ++$in{m};
    $mkml .= qq(Et valinnut mitään. "$in{oikein}" olisi ollut oikein.\n);
  }

#  $pts = ($aika - $in{alkuaika} + 60*$in{m})/($in{n}+$in{m});

#  my $n = $in{n} + $in{m};
#  $pts = ($in{n_aika} + $n*$in{m_aika}) / $n;

  $pts = ($in{m}+5)/$in{n} * 2 if $in{n} > 0;
  my $aux;
  $aux = $in{m_aika}/$in{m}/3 if $in{m} > 0;
  $aux += $in{n_aika}/$in{n} if $in{n} > 0;
  $pts *= $aux;

  $mkml .= qq(
Arvattavana oli "$in{sanat}"
$in{n} oikein, $in{m} väärin
Aikaa kului ). ($aika - $in{aika}) . " sekuntia
Aikaa kulunut yhteensä ". Time($aika - $in{alkuaika}) . "
Pisteet: ".sprintf("%.2f",$pts)."
</LISTBOX>
";

  if ($in{n}+$in{m} >= 10) {

    my @pts;
    open PTS,"Lista.K";
    flock(PTS,2);
    while (<PTS>) {
      chomp;
      push @pts,{name=>$1,date=>$2,pts=>$3} if /\| (.+)\|(.+)\|(.+)/
    }
    flock(PTS,8);
    close PTS;

    if (@pts < 20 || ( $pts < $pts[-1]{pts} && $pts > 0 ) ) {
      $mkml .= qq(\n[+,1]
<form action="Lista.cgi" method="post">
<BOX>\n
0| <span style="font-size:larger">Pääsit top-listalle!</span>
1| Nimesi: <input name="nimi" />
2| <input type="submit" name="submit" value="Tallenna" /><input type="hidden" name="pts" value="$pts" /><input type="hidden" name="session" value="$in{session}" />
</BOX>
</form>
);
    }
  }
}

else { $mkml .= qq(<pre style="font:inherit">
<LANG fi>
Sanapeli arpoo yhden rivin Apulannan sanoituksista ja sinun pitäisi
tietää mistä biisistä ko. rivi on. Biisien nimet ovat
aakkosjärjestyksessä, mutta aakkostuksen alkukohta on satunnainen.
Pistelasku perustuu käytettyyn aikaan. Vääristä vastauksista
sakotetaan. Katso [[Lista|parhaat pisteet]].

Ilmoita oudosta tai virheellisestä toiminnasta [[/palaute.html|palautelomakkeella]].
</LANG><LANG en>
This lyrics game picks a random line from the Apulanta lyrics and your
task is to know from which song the line is. The song names are in
alphabetical order, but the starting point is random. The points are
based on used time plus wrong answers cost you points. See
[[Lista|best results]].

Report odd or erroneus behaviour via the [[/palaute|feedback form]].
</LANG>
</pre>
);

}

my(@filet,@biisit);
#generoidaan biisilista kerran vrk:ssa
if (! -e "biisit.csv" || (stat("biisit.csv"))[9] < timelocal(localtime)-86400) {
  my $basedir="../Levyt";
  opendir LEVYT,$basedir;
  for my $tyyppi (readdir LEVYT) {
    $tyyppi = "$basedir/$tyyppi";
    if (-d $tyyppi && $tyyppi !~ m{/(\.\.?|RCS|In_English)$}) {
      opendir TYYPPI,$tyyppi;
      for my $levy (readdir TYYPPI) { 
	$levy = "$tyyppi/$levy";
	if (-d $levy && $levy !~ m{/\.\.?$}) {
	  opendir LEVY,$levy;
	  for my $file (readdir LEVY) {
	    $file = "$levy/$file";
	    if ($file=~/\.txt$/ && ! -l $file) {
	      push @filet,$file;
	    }
	  }
	}
      }
    }
  }

  open BIISIT,">biisit.csv";
  for (0..$#filet) {
    open SANAT,$filet[$_];
    push @biisit,{ nimi=>scalar(<SANAT>), file=>$filet[$_] };
    close SANAT;
    print BIISIT "$filet[$_];$biisit[-1]{nimi}";
  }
  close BIISIT;

} else {
  open BIISIT,"biisit.csv";
  while (<BIISIT>) {
    my($file,$name) = split /;/;
    push @filet,$file;
    push @biisit,{ nimi=>$name, file=>$file };
  }
}


open SANAT,$filet[int(rand($#filet))];
my @sanat = grep !/^\s*$/,<SANAT>;
close SANAT;
my $title;
chomp( $title = shift @sanat );
#$title =~ s/(.)/chr(ord($1)+1)/ge;

my $index = int(rand($#sanat));

#$mkml .= qq(
#[1,2]
#<BOX class="compact">Levytyypit
#);
#for (qw(Albumit Singlet Englanninkieliset)) {
#  $mkml .= qq(+| <input type="checkbox" name="tyyppi" value="$_" checked="checked"/>|$_\n);
#}
#$mkml .= qq(</BOX>);

$mkml .= qq(
[+,1]
<BOX>\n0| <span style="font-size:larger">).$sanat[$index].qq(</span>\n</BOX>
[+,1]
<form action="index.cgi" method="post">
<input type="submit" name="submit" value="Arvaa" />
<input type="hidden" name="session" value="$in{session}" />
);
#$mkml .= qq([[/Sanapeli/|Aloita alusta]]) if defined $in{submit};
$mkml .= qq(<input type="submit" name="submit" value="Aloita alusta" />) if $in{submit} eq "Arvaa";
$mkml .= qq(
<p></p>
<div style="font-size:smaller">
<BOX columns=3>
);
#qq();
sub Bsort {lc(($a->{nimi}=~/^\W*(.*)/)[0]) cmp lc(($b->{nimi}=~/^\W*(.*)/)[0])}
sub Cycle {for (1..int(rand $#_)) {unshift @_,pop(@_)};return @_ }
for (Cycle sort Bsort @biisit) {
  $mkml .= "+| <RADIO file $_->{file}>$_->{nimi}\n"
}
$mkml .= qq(</BOX></div>
<br /><input type="submit" name="submit" value="Arvaa" />
</form>\n);

print SESSION "
sanat = $sanat[$index]
aika = ".timelocal(localtime)."
alkuaika = $in{alkuaika}
session = $in{session}
n = $in{n}
m = $in{m}
oikein = $title
n_aika = $in{n_aika}
m_aika = $in{m_aika}
";
flock(SESSION,8);
close SESSION;


#for (keys %keksit) { print "Set-Cookie: $keksit{$_}\n" }
Generate( dirname=>".", files => ["-"], input => $mkml, config_file=>"../.Kotisivurc", lang=>$in{lang});
