#!/usr/bin/perl -w
# $Id$
# Dieses Script (latex-refsym) wurde von Rdiger Beck erstellt
# Es ist freie Software
# Bei Fehlern wenden Sie sich bitte an mich.
# jeffbeck@web.de  oder  jeffbeck@gmx.de


# Bibliotheken
use strict;
use DBI;
use Getopt::Long;
Getopt::Long::Configure ("bundling");
use File::Find;
use coldformix;
# ==========================================================================


# Choose the Language: de, en
my $lang="de";


# Choose the Unit-System: si_symbol,
my $unit_system = "si_symbol";


my $config="all";
my $version="x.x",
my $symbol="";
my $number=0;
my %ends=qw( 3 leer
             6 leer
             9 leer
            12 leer
            15 leer
            18 leer
            21 leer
	    24 leer);

# ===========================================================================
# Optionen verarbeiten
# ==========================================================================
# Parsen der Optionen
my $testopt=GetOptions(
           "lang|l=s" => \$lang,
           "config=s" => \$config,
          );


print "Language: $lang \n";

# Prfen, ob Optionen erkannt wurden, sonst Abbruch
&coldformix::check_options($testopt);

# expand filenames to german header names, where necessary
my %expand = (
     "Rueckflussverhinderer"      =>    "Rckflussverhinderer",
     "Sicherheitsventile"      =>    "Ventile/Fittings mit Sicherheitsfunktion",
     "Behaelter"  =>,   "Behlter",
     "Waermeuebertrager"  =>,   "Wrmebertrager/Dampferzeuger",
     "Ruehrer"   =>    "Rhrer", 
     "Pumpen"   =>    "Flssigkeitspumpen", 
     "Verdichter"   =>    "Verdichter/Vakuumpumpen/Ventilatoren", 
     "MSR"   =>    "Symbole fr Messen/Steuern/Regeln", 
);
 

if ($config eq "all"){
    print "option --config not used, aborting\n";
    exit;
}

# Einlesen der Konfigurationsdatei
{ package Config ; do "../coldformix-config/coldformix-${config}.conf"}
# Die in coldformix-******.conf als global (ohne my) deklarierten Variablen
# knnen nun mit $Config::Variablenname angesprochen werden

#my @exampledirs=(../coldformix-source/refsym/EN_1861);
my $out_dir="../coldformix-generated/$lang/refsym";
my $latex_out_dir="../coldformix-generated/${lang}/latex";
#my $latex_out_file="../coldformix-generated/$lang/latex/refsym-${lang}.tex";
my $latex_out_file="${latex_out_dir}/refsym-${lang}.tex";
my $refsym_dir="../coldformix-source/refsym/EN_1861";
my $dir="";
my @subdirs=();

if (not -e "$out_dir") {
    system("install -d $out_dir");
}

if (not -e "$latex_out_dir") {
    system("install -d $latex_out_dir");
}


#opendir(DIR, $refsym_dir) || die "Kann $refsym_dir nicht ffnen: $!";
#   while (defined (my $file = readdir(DIR))) {
#       # Eintrag verarbeiten
#       if (not $file eq "." and
#          not $file eq ".." and
#          not $file eq "CVS" and
#          not $file=~/~/) {
#          push (@exampledirs, $file);
#       }
#   }
#closedir(DIR);

#@exampledirs = sort @exampledirs;

my %refsym  = &get_refsym();

#while (my ($k,$v) = each %refsym){
#    print $k , " ", $v, "\n";
#}

#print "Test: $refsym{'lk'}{'filename'}\n";

open (LATEX,">$latex_out_file");

# 01
$dir="01-Rohrleitungen"; # search in which directory
@subdirs=("");           # list of subdirs to search, "": search in $dir only
&create_refsym_table(@Config::en_1861_01);

# 02
$dir="02-Absperrventile";
@subdirs=("","gerade","eckventile");
&create_refsym_table(@Config::en_1861_02);

# 03
$dir="03-Rueckflussverhinderer";
@subdirs=("");
&create_refsym_table(@Config::en_1861_03);

# 04
$dir="04-Regelventile";
@subdirs=("");
&create_refsym_table(@Config::en_1861_04);

# 05
$dir="05-Sicherheitsventile";
@subdirs=("");
&create_refsym_table(@Config::en_1861_05);

# 06
$dir="06-Stellantriebe";
@subdirs=("");
&create_refsym_table(@Config::en_1861_06);

# 07
$dir="07-Rohrleitungsteile";
@subdirs=("");
&create_refsym_table(@Config::en_1861_07);

# 08
$dir="08-Behaelter";
@subdirs=("");
&create_refsym_table(@Config::en_1861_08);

# 11
$dir="11-Waermeuebertrager";
@subdirs=("");
&create_refsym_table(@Config::en_1861_11);

# 13
$dir="13-Abscheider";
@subdirs=("");
&create_refsym_table(@Config::en_1861_13);

# 14
$dir="14-Ruehrer";
@subdirs=("");
&create_refsym_table(@Config::en_1861_14);

# 15
$dir="15-Pumpen";
@subdirs=("");
&create_refsym_table(@Config::en_1861_15);

# 16
$dir="16-Verdichter";
@subdirs=("","ventilatoren");
&create_refsym_table(@Config::en_1861_16);

# 20
$dir="20-Motoren";
@subdirs=("");
&create_refsym_table(@Config::en_1861_20);

# msr
$dir="MSR";
@subdirs=("","druck","temperatur","stand");
&create_refsym_table(@Config::en_1861_msr);

# examples
$dir="examples";
@subdirs=("");
&create_examples(@Config::en_1861_examples);


# foreach my $dir (@exampledirs){	
#    my $work_dir="${refsym_dir}/${dir}";
#    if (not -e "$out_dir/${dir}") {
#       system("install -d $out_dir/${dir}");
#    }

#    my @ps=&get_ps_files($work_dir);
#    print "Directory: $dir:\n";
#    foreach my $ps (@ps){
#       my $epsi=$ps;
#       $epsi=~s/\.ps/\.epsi/;
#       print "  PS:   $ps \n";
#       print "  EPSI: $epsi \n";

#       # do something with the PostScript-Files:
#       # copy *.ps
#       system("cp $work_dir/$ps $out_dir/${dir}" );
#       # convert to epsi
#       system("cd $out_dir/${dir}; ps2epsi $ps");
#       # remove *.ps
#       system("cd $out_dir/${dir}; rm $ps");

#       print LATEX "\\includegraphics{../refsym/${dir}/$epsi}\n";
#    }
# }

close(LATEX);


#print "##### Working on this dirs: @exampledirs \n";

############################################################
# sub
############################################################


sub get_refsym{
    # read all entrys of the table
    my %refsym=();
    my $row;
    my $name;

    my $dbh = DBI->connect("dbi:mysql:coldformix", "coldformix", "coldformix",
                   { RaiseError => 1, AutoCommit => 1 });

    my $sth = $dbh->prepare("SELECT * FROM refsym");
       $sth->execute();
    
    while ($row = $sth->fetchrow_hashref()) {
         $name=$row->{'name'};
         $refsym{$name} = { %$row };
    }

    $dbh->disconnect;
    return %refsym;
}



sub create_examples {
    my @files = @_;
    my $line_one="";
    my $line_two="";
    my $line_three="";
    my ($sach_grp,$sach_name)=split(/-/,$dir);
    my $work_dir="${refsym_dir}/${dir}";
    if (not -e "$out_dir/${dir}") {
       system("install -d $out_dir/${dir}");
    }

    # preamble
    foreach my $ps (@files){
       my $maxnum=$#files+1;
       my $epsi=$ps;
#       my $dxf=$ps;
       my $name=$ps;
       $number++;
       $epsi=~s/\.ps/\.epsi/;
#       $dxf=~s/\.ps/\.dxf/;
       $name=~s/\.ps//;
       print "  File:   $ps $number of $maxnum\n";

       # do something with the PostScript-Files:
       # copy *.ps
       foreach my $subdir (@subdirs){
	  if ($subdir eq ""){
	      if (-e "$work_dir/$ps"){
                 system("cp $work_dir/$ps $out_dir/${dir}" );
	      }
          } else {
              print "     Looking for $work_dir/$subdir/$ps ... ";
	      if (-e "$work_dir/$subdir/$ps"){
		  print "found!\n";
                 system("cp $work_dir/$subdir/$ps $out_dir/${dir}" );
              } else {
                  print "non-existing!\n";
              }
	  }
       }

       # convert to epsi
       system("cd $out_dir/${dir}; ps2epsi $ps");
       # remove *.ps
       system("cd $out_dir/${dir}; rm $ps");

       print LATEX "\\hfill \\includegraphics[width=188mm]{../refsym/${dir}/${epsi}} \\hfill \n";

   }
}



sub create_refsym_table {
    my @files = @_;
    my $line_zero="";
    my $line_one="";
    my $line_two="";
    my $line_three="";
    my ($sach_grp,$sach_name)=split(/-/,$dir);
    my $work_dir="${refsym_dir}/${dir}";
    my $header="Sachgruppe";
    print "$dir   $sach_name   $sach_grp\n";
    if (exists $expand{$sach_name}){
	$sach_name=$expand{$sach_name};
        print "   expanded to  $sach_name \n\n";
    }

    if (exists $expand{$sach_grp}){
	$sach_name=$expand{$sach_grp};
        print "   expanded to  $sach_name \n\n";
    }

    $sach_grp=~s/^0//g;
    if ($sach_grp==""){
	$header="";
    }

    if (not -e "$out_dir/${dir}") {
       system("install -d $out_dir/${dir}");
    }

    # preamble
    print LATEX "\\begin{tabular}",
                "{|p{0.311\\textwidth}|p{0.311\\textwidth}|p{0.311\\textwidth}|}",
                " \\hline\n\n";
    
    print LATEX "\\multicolumn{3}{|l|}{\\rule[-3mm]{0mm}{9mm}\\textbf{$header $sach_grp: $sach_name}} \\tabularnewline \\hline \\hline\n";

    my $number=0;
    foreach my $ps (@files){
       my $maxnum=$#files+1;
       my $epsi=$ps;
       my $dxf=$ps;
       my $name=$ps;
       my $show_line=0;
       my $description;
       $number++;
       $epsi=~s/\.ps/\.epsi/;
       $dxf=~s/\.ps/\.dxf/;

       $name=~s/\.ps//;

       my $show_filename;

       if (not defined $refsym{$name}{"show_filename"}){
           $show_filename=1;           
       } else {
           $show_filename=$refsym{$name}{"show_filename"}; 
       }

       if ($ps eq ""){
            print "  File:   Empty Entry in $config".".conf\n";
            $show_line=1;
            $show_filename==0;
            $description="";
            #$dxf="";
	} else {

        }

       print "  File:   $ps $number of $maxnum\n";
#       print "  PS:   $ps \n";
#       print "  EPSI: $epsi \n";
#       print "  DXF:  $dxf \n";


       if ($show_filename==0) {
          $dxf="";
       } else {
	   $show_line=1;
       }
       if (defined $refsym{$name}{"de"} or $description eq "") {
           $description=$refsym{$name}{"de"};
       } else {
           $description="\\textcolor{blue}{No Database Entry!}"
       }
       # do something with the PostScript-Files:
       # copy *.ps

       if ($ps ne ""){ # convert to *.eps if filename ist not empty
       foreach my $subdir (@subdirs){
	  if ($subdir eq ""){
	      if (-e "$work_dir/$ps"){
                 system("cp $work_dir/$ps $out_dir/${dir}" );
	      }
          } else {
              print "     Looking for $work_dir/$subdir/$ps ... ";
	      if (-e "$work_dir/$subdir/$ps"){
		  print "found!\n";
                 system("cp $work_dir/$subdir/$ps $out_dir/${dir}" );
              } else {
                  print "non-existing!\n";
              }
	  }
       }

       # convert to epsi
       system("cd $out_dir/${dir}; ps2epsi $ps");
       # remove *.ps
       system("cd $out_dir/${dir}; rm $ps");

       $line_zero=$line_zero."  \\multicolumn{1}{|c|}{}\n";
       $line_one=$line_one."  \\multicolumn{1}{|c|}{\\includegraphics{../refsym/${dir}/$epsi}}\n";
       $line_two=$line_two."   \\multicolumn{1}{|c|}{\\begin{minipage}".
                           "{0.3\\textwidth}\\center{\\rule{0mm}{4mm}$description".
                           "\\rule[-2mm]{0mm}{3mm}}\\end{minipage}} \\par\n";
       $line_three=$line_three. "   \\multicolumn{1}{|c|}{\\texttt{$dxf}}\n";

       } else{
             # fill line with empty items
             $line_zero=$line_zero." \\multicolumn{1}{|c|}{}";
             $line_one=$line_one."\\multicolumn{1}{|c|}{}\n";
             $line_two=$line_two."\\multicolumn{1}{|c|}{}\n";
             $line_three=$line_three."\\multicolumn{1}{|c|}{}\n";

       }# end convert to *.eps if filename ist not empty 


       if ($number==$maxnum){
          # last symbol
          while (not exists $ends{$number}){
             # fill line with empty items
             $line_zero=$line_zero." & \\multicolumn{1}{|c|}{}";
             $line_one=$line_one."& \\multicolumn{1}{|c|}{}\n";
             $line_two=$line_two."& \\multicolumn{1}{|c|}{}\n";
             $line_three=$line_three."& \\multicolumn{1}{|c|}{}\n";
             $number++;
          }
       }

       if (exists $ends{$number}){
           # last item in line
           $line_zero=$line_zero."\\tabularnewline[-3mm] \n\n";
           $line_one=$line_one."\\tabularnewline \n\n";
           $line_two=$line_two."\\tabularnewline \n\n";
           $line_three=$line_three."\\tabularnewline \\hline \n\n";
 	   print LATEX $line_zero;
 	   print LATEX $line_one;
 	   print LATEX $line_two;
           if ($show_line==1){
 	      print LATEX $line_three;
	   } else {
              print LATEX "\\hline \n\n";
	   }
           $line_zero="";
           $line_one="";
           $line_two="";
           $line_three="";
           $show_line=0;

       } else {
           # not last item in line
           $line_zero=$line_zero." & ";
           $line_one=$line_one."& \n";
           $line_two=$line_two."& \n";
           $line_three=$line_three."& \n";
       }
   } 
   print LATEX "\\end{tabular}\n\n\\vspace{1.5mm}\n\n\n\n\n";
#   print LATEX "\\vspace*{\\fill}\n\n";
   print LATEX "\\vfill\n\n";
}





sub get_ps_files {
    my @ps_files=();
    my ($dir)=@_;
    opendir(DIR, $dir) || die "Kann $dir nicht ffnen: $!";
    while (defined (my $file = readdir(DIR))) {
       # Eintrag verarbeiten
       if ($file=~/.*\.ps/) {
          push (@ps_files, $file);
       }
    }
    closedir(DIR);
    return @ps_files;
}
