#!/usr/bin/perl 
#
#       Interface Graphique Perl/Tk pour zeDuel
#                           NoMan
#

#
# format du fichier log :
#  - des lignes de la forme "X Y\n" pour chaque tour
#

use Tk;
require Tk::FileSelect;

$version="1.3";
$dirlog="./logs";

$main=MainWindow->new();
$main->title("zeDuel / Interface PerlTk v$version / NoMan");
$main->minsize( qw(450 550) );
$main->maxsize( qw(450 550) );

$fileinfo=$main->Label(-anchor=>'w', -relief=>'raised', -height=>1, -width=>80)->pack();
$fileinfo->configure(-text=>"Aucun fichier utlilisé");

$canv=$main->Canvas(-height=>440, -width=>400, -background=>'lightgrey');
for my $i (0..20) {
  $canv->createLine(31,20*$i+31,431,20*$i+31);  
  $canv->createLine(20*$i+31,31,20*$i+31,431);
}
for my $i (0..19) {
  $canv->createText(42+20*$i,10,-text=>$i+1, -anchor=>'n', -fill=>'red');
  $canv->createText(10,42+20*$i,-text=>$i+1, -anchor=>'w', -fill=>'red');
}

$canv->pack(-side=>'top', -fill=>'x', -padx=>5, -pady=>5);

$txttrace=$main->Label(-anchor=>'w', -relief=>'raised', -height=>2, -width=>50)->pack();   

$main->Button(-command=>\&quitter, -text=>"Quitter")->pack(-side=>'right', -expand=>1);
$main->Button(-command=>\&fin, -text=>">|")->pack(-side=>'right', -expand=>1);
$main->Button(-command=>\&suivant, -text=>">")->pack(-side=>'right', -expand=>1);
$main->Button(-command=>\&precedent, -text=>"<")->pack(-side=>'right', -expand=>1);
$main->Button(-command=>\&debut, -text=>"|<")->pack(-side=>'right', -expand=>1);
$main->Button(-command=>\&charge, -text=>"Charger")->pack(-side=>'right', -expand=>1);

&charge;

MainLoop;

#----------------------------------------------------------------------------#  

sub charge {
#initialise l'interface avec les E/S
  $fsWindow=$main->FileSelect(-directory =>$dirlog);
  $nomficlog=$fsWindow->Show;
  if ($nomficlog eq "") {return;}
  open(ficlog,$nomficlog) or die "Erreur d'acces fichier : $nomficlog\n";
  #flog contient tout le fichier
  @flog=<ficlog>;
  close(ficlog);
  $cligne=0;
  $maxligne=0;
  $nomficlog=~ /(.*)\/(.*)_(.*)/;
  @nomsjoueurs=(0,$2,$3);
  foreach my $ligne (@flog) {$maxligne++} 
  $joueur=1;
  for my $i(1..20) { for my $j (1..20) {enleve_pion($i,$j);} }
  $txttrace->configure(-text=>"Début du jeu !");
  $gagnant=@nomsjoueurs[($maxligne+1) % 2 +1];
  if ($maxligne==400) { $gagnant="match null"; }
  $fileinfo->configure(-text=>"$2 (rouge) VS $3 (bleu), gagnant : $gagnant en $maxligne coup(s)");
};

sub pose_pion {
#affiche un pion en x,y couleur joueur  
  my($x, $y, $joueur)=@_;
  if ($joueur==1) {$couleur='red'} else {$couleur='blue'}
  $x--; $y--;
  $canv->createOval($x*20+32,$y*20+32,$x*20+20+30,$y*20+20+30, -fill=>$couleur, -outline=>'black'); 
}

sub enleve_pion {
#efface le pion en x,y
  my($x, $y)=@_;  
  $x--; $y--;
  $canv->createRectangle($x*20+32,$y*20+32,$x*20+20+30,$y*20+20+30, -fill=>'lightgrey', -outline=>'lightgrey');
}

sub suivant {
  if ($cligne==$maxligne) {$txttrace->configure(-text=>"Fin du jeu !"); return;}
  ($x, $y)=split(/ /,@flog[$cligne],2);
  $coup=$cligne+1;
  $txttrace->configure(-text=>"(@nomsjoueurs[$joueur]) coup n°$coup : $x,$y");
  pose_pion($x,$y,$joueur); 
  $joueur=$joueur % 2 +1;  # ->1 ou 2
  $cligne++;
}

sub precedent {
  if ($cligne==0) {$txttrace->configure(-text=>"Début du jeu !"); return;}  
  $cligne--;
  $joueurp=$joueur;
  $joueur=$joueur % 2 +1;  # ->1 ou 2
  ($x, $y)=split(/ /,@flog[$cligne],2);
  enleve_pion($x,$y);  
  
  $clignep=$cligne-1;
  ($xp,$yp)=split(/ /,@flog[$clignep],2);
  $coup=$cligne+1;
  $txttrace->configure(-text=>"(@nomsjoueurs[$joueurp]) coup n°$coup : $xp,$yp");
}

sub debut {
  while ($cligne>0) {
    &precedent;
  }
  $txttrace->configure(-text=>"Début du jeu !");
}

sub fin {
  while ($cligne<$maxligne) {
    &suivant;
  }
}

sub quitter {
  print("interface : Bye bye, j'espere que ça vous a plu ;-) !\n"); 
  print("Pour tout commentaire : \n \t mail : nomanseb\@ifrance.com\n");
  exit;
};