#!/usr/bin/perl
#
################################################################################
# Semestralni prace: animace grafu
################################################################################
#

use strict;
use warnings;
use Getopt::Std;
use File::Path;

# defualt values
my %params = 
  ( 
   "Name", "$0-flow",
   "TimeFormat", "[%Y-%m-%d %H:%M:%S]",
   "Xmax" , "max",
   "Xmin" , "min",
   "Ymax" , "auto",
   "Ymin" , "auto",
   "Speed" , 1,
   "Time", "",
   "FPS" , 25,
   "Legend", "",
   "GnuplotParam", "",
   "EffectParams", "",
   "ConfigFile", ""
  );
# END

################################################################################
# Funkce
################################################################################
sub get_addr_name
{
  my $name = shift;
  my @dirs = < ${name}_* >;
  if( -d $name )
  {
    my $max = 0;

    for( @dirs )
    {
      if( -d && m/^${name}_\d*$/ )
      {
        s/${name}_//;
        $max=$_ if ($_>$max);
      }
    }
    $max++;
    return "${name}_${max}";
  }
  else
  {
    return "$name";
  }
}

sub parse_config_file
{
  open( CONFIG, shift ) or die "Nemohu najít konfigurační soubor.\n";

  my @line;
  my %multiline;

  while(<CONFIG>)
  {
    s/#.*//;
    s/^\s+//;
    s/\s+$//;
    if(/\S/)
    {
      @line = split(/ /);
      if( exists $multiline{$line[0]} )
      {
        $params{$line[0]} .= ":@line[1..$#line]" if exists $params{$line[0]};
      }
      else
      {
        $params{$line[0]} = "@line[1..$#line]" if exists $params{$line[0]};
        $multiline{$line[0]} = "";
      }
    }
  }
}

sub parse_commandline
{
  my %par;
  my %opt;
  &getopts('t:X:x:Y:y:S:T:F:l:g:e:f:n:', \%opt);
  $par{"ConfigFile"} = $opt{'f'} if defined $opt{'f'};
  $par{"Name"} = $opt{'n'} if defined $opt{'n'};
  $par{"TimeFormat"} = $opt{'t'} if defined $opt{'t'};
  $par{"Xmax"} = $opt{'X'} if defined $opt{'X'};
  $par{"Xmin"} = $opt{'x'} if defined $opt{'x'};
  $par{"Ymax"} = $opt{'Y'} if defined $opt{'Y'};
  $par{"Ymin"} = $opt{'y'} if defined $opt{'y'};
  $par{"Speed"} = $opt{'S'} if defined $opt{'S'};
  $par{"Time"} = $opt{'T'} if defined $opt{'T'};
  $par{"FPS"} = $opt{'F'} if defined $opt{'F'};
  $par{"Legend"} = $opt{'l'} if defined $opt{'l'};
  $par{"GnuplotParams"} = $opt{'g'} if defined $opt{'g'};
  $par{"EffectParams"} = "$opt{'e'}" if defined $opt{'e'};
  return %par;
}

sub check_params
{
  foreach ( "FPS", "Time", "Speed" )
  {
    $params{$_} =~ /^\d*$/ or die "Špatný parametr $_.\n";
  }
  $params{"TimeFormat"} =~ s/\s+/_/;
}

sub image_generator
{
  my ( $count, $max_len, $min, $max, $addr, $x, $y ) = @_;

  $count = "0"x(length($max_len)-length($count)) . $count;

  open( DATA_FILE, ">", $addr . "/image-" . $count . ".data" );
  print DATA_FILE @$x[$_] . " " . @$y[$_] . "\n" foreach (0..$count);
  close DATA_FILE;

  system( "/usr/bin/gnuplot -e \"" . 
    " set term png; set xdata time; " . 
    " set timefmt \'" . $params{"TimeFormat"} . "\';" .
    " set xrange \[\'" . @$x[0] . "\':\'" . @$x[-1] . "\'\];" .
    " set yrange \[\'" . $min . "\':\'" . $max . "\'\];" .
    " plot \'" . $addr . "/image-" . $count . ".data\' using 1:2 with lines title \'" . 
    $params{"Legend"} . "\'\"" . 
    ">" . $addr . "/image-" . $count . ".png" );  

  unlink( $addr . "/image-" . $count . ".data" );
} 

################################################################################
# Zacatek programu
################################################################################

my %params_commandline = &parse_commandline;
my @input_files;
my @data_x;
my @data_y;

### parsuj, spoj a zkontroluj parametry
&parse_config_file( $params_commandline{"ConfigFile"} ) if defined $params_commandline{"ConfigFile"};
$params{$_} = $params_commandline{$_} foreach( keys %params_commandline );
&check_params;

### zkontroluj a vytvor prislusny adresar
my $addr_name = &get_addr_name($params{"Name"});
mkdir $addr_name or die "Nelze vytvořit adresář.\n";

### nacti vstupni soubory
push( @input_files, $_ ) while( $_ = shift );
print "Neni specifikovan datovy sobor.\n" if not @input_files;
foreach my $file (@input_files)
{
  open( FILE, $file );
  while(<FILE>)
  {
    push( @data_x, /(\[.*\])/ );
    push( @data_y, /\[.*\]\s*(\S*)/ );
  }
  close FILE;
}

my $max = $data_y[0];
my $min = $data_y[0];
$max = $max < $_ ? $_ : $max foreach (@data_y);
$min = $min > $_ ? $_ : $min foreach (@data_y);

### vygenerovat obrazky
foreach ( 0..$#data_x )
{
  $data_x[$_] =~ s/\s+/_/g;
  &image_generator( $_, $#data_x, $min, $max, $addr_name, \@data_x, \@data_y );
}

# test
#print $_, "\t=>\t", $params{$_}, "\n" foreach (keys %params);
#print $addr_name, "\n";
#print "@input_files", "\n";
#&rmtree("$addr_name"); # clean
# end test

################################################################################
# Konec programu
################################################################################
