#!/usr/bin/perl
use Carp;
use strict;
use warnings;
use Tk;
use Tk::LabFrame;
use Win32::Process;
use Win32;
use English '-no_match_vars';

my $fenetre = new MainWindow(
  -title      => 'Recherche de fichiers',
  -background => 'white',
);

# Affichage de l'heure
my $date_heure = date();
my $label_date = $fenetre->Label(
  -textvariable => \$date_heure,
  -background   => 'white',
  -font         => '{Arial} 16 {bold}',
)->pack(qw/ -pady 20 /);

# État de la recherche du fichier
my $etat_recherche = 'Aucune recherche en cours';
my $label_etat     = $fenetre->Label(
  -textvariable => \$etat_recherche,
  -background   => 'white',
  -foreground   => 'blue',
  -font         => '{Arial} 12 {bold}',
)->pack(qw/ -pady 20 /);

# Cadre de recherche
my $cadre = $fenetre->LabFrame(
  -label      => 'Cadre de recherche',
  -background => 'white',
)->pack(qw/ -pady 20 -padx 20 /);

my ( $motif_recherche, $repertoire_emplacement );
my $label1 = $cadre->Label( -text => 'Nom du fichier à trouver : ', -background => 'white' );
my $entry_nom_fichier = $cadre->Entry( -textvariable => \$motif_recherche );
my $label2 = $cadre->Label( -text => 'Emplacement : ', -background => 'white' );
my $entry_emplacement = $cadre->Entry( -textvariable => \$repertoire_emplacement );

my $bouton_emplacement = $cadre->Button(
  -text    => '...',
  -command => sub {
    $repertoire_emplacement = $cadre->chooseDirectory(
      -title     => 'Sélectionner un emplacement',
      -mustexist => 1,
    );
  },
);

# Affichage d'un bouton pour rechercher un fichier
my $bouton = $cadre->Button(
  -text    => 'Recherchez un fichier',
  -command => [ \&recherchez_fichier ],
  -font    => '{Arial} 14 {bold}',
);

$label1->grid( $entry_nom_fichier, '-',                 -sticky => 'nw' );
$label2->grid( $entry_emplacement, $bouton_emplacement, -sticky => 'nw' );
$bouton->grid( '-',                '-',                 qw/ -padx 10 -pady 10 / );

# Centrer ma fenêtre
centrer_widget($fenetre);

# Toutes les secondes, la date et l'heure évoluent
$fenetre->repeat( 1000, sub { $date_heure = date(); } );

MainLoop;

#================================================
# But : Centrer un widget automatiquement
#================================================
sub centrer_widget {
  my ($widget) = @_;

  # Height and width of the screen
  my $largeur_ecran = $widget->screenwidth();
  my $hauteur_ecran = $widget->screenheight();

  # update le widget pour récupérer les vraies dimensions
  $widget->update;
  my $largeur_widget = $widget->width;
  my $hauteur_widget = $widget->height;

  # On centre le widget en fonction de la taille de l'écran
  my $nouvelle_largeur = int( ( $largeur_ecran - $largeur_widget ) / 2 );
  my $nouvelle_hauteur = int( ( $hauteur_ecran - $hauteur_widget ) / 2 );
  $widget->geometry( $largeur_widget . "x" . $hauteur_widget . "+$nouvelle_largeur+$nouvelle_hauteur" );

  $widget->update;

  return;
}

sub date {
  my $time = shift || time;    #$time par defaut vaut le time actuel
  my ( $seconde, $minute, $heure, $jour, $mois, $annee, $jour_semaine, $jour_annee, $heure_hiver_ou_ete )
    = localtime($time);
  $mois  += 1;
  $annee += 1900;

  # On rajoute 0 si le chiffre est compris entre 1 et 9
  foreach ( $seconde, $minute, $heure, $jour, $mois, $annee ) { s/^(\d)$/0$1/; }
  return "$jour/$mois/$annee - $heure:$minute:$seconde";
}

sub recherchez_fichier {

  # Recherchons le fichier
  $etat_recherche = 'Recherche de fichier en cours...';
  $fenetre->update;

  # Lancement de la recherche
  my $fichier_resultat = 'resultat.txt';
  my $commande         = "trouve_fichier.pl -m \"$motif_recherche\" "
    . " -d \"$repertoire_emplacement\" -o \"$fichier_resultat\"";
  unlink $fichier_resultat;
  my $process_objet;
  Win32::Process::Create( $process_objet, $EXECUTABLE_NAME, " $commande", 0, NORMAL_PRIORITY_CLASS, '.' )
    || die Win32::FormatMessage( Win32::GetLastError() );
  my $id;
  $id = $fenetre->repeat( 500, [ \&verifier_resultat, $process_objet, $fichier_resultat, \$id ] );

  return;
}

sub verifier_resultat {
  my ( $process_objet, $fichier_resultat, $ref_id ) = @_;
  my $process_id = $process_objet->GetProcessID();
  my $exitcode;
  $process_objet->GetExitCode($exitcode);

  # Lecture du fichier résultat
  my $fichier_trouve = 0;
  open my $fh, '<', $fichier_resultat;
  while (<$fh>) { chomp; $fichier_trouve++; }
  close $fh;
  $fichier_trouve = $fichier_trouve > 0 ? $fichier_trouve-- : 0;

  # Processus terminé
  if ( $exitcode == 0 ) {
    $etat_recherche = "Fini : $fichier_trouve fichier(s) trouvé(s)";
    ${$ref_id}->cancel;
  }
  else {
    $etat_recherche
      = "Process : $process_id\n"
      . "Code de sortie : $exitcode\n"
      . "Fichiers en cours de recherche trouvés $fichier_trouve fois";
  }

  return;
}