#!/usr/bin/perl

# Tento SW je absolutne FREE 
# je to totalni nedodelek a tech co to pouzivaji je mi uprime lito ;-)
# MrAk s uctou k beta testerum ;-).

use Getopt::Std;
use Data::Dumper;
use Storable;

$cdrom = "/mnt/cdrom";
$dbfile = "~/.plcddb";
$ver = "0.2";
$bad_name = "xxwin|^x.soft|^soft|Grafika|video|winamp|^wres";   #omezuje vypis pri pouziti -f
if (not -e $dbfile){`touch $dbfile`;}		# test existence DB souboru -> vytvoreni
%root = %{retrieve("$dbfile")};         	# nahrati default DB


# obsluha voleb prikazoveho radku
getopts("invfs:z:");
#if ($opt_z){&zobraz;}
if ($opt_s){&hledej(\%root,$opt_s);}
elsif ($opt_n){&nacti_cd;&uloz;}
elsif ($opt_v){&odelovac;print ("Version $ver\n");&odelovac;}
elsif ($opt_f){&mp3(\%root);}
elsif ($opt_z){
    if ($opt_z eq "/"){&zobraz(\%root);
    }else{&zobraz($root{$opt_z});
    }
}
elsif ($opt_i){&iactiv();}
else{
    print "
 -s retezec	Vyhleda v katalogu soubory a adresare obsahujici zadany retezec (lze pouzit perl regexp)
 -n 		nacte CD za zarizeni specifikovane promenou \$cdrom. default. /dev/cdrom
 -v 		vypise verzi a ukonci se
 -z para	zobrazi koren datove struktury parametr / vypise koren DB nebo koren CD napr.: -z mp3_01
 -f 		vypise na standartni vystup adresare z DB a vynecha nazvy uvedene v \$badname
 -i 		Interaktivni rezim\n";
    exit(0);
}

sub iactiv{
# interaktivni rezim
while($volba = &vem_prikaz){
 if ($volba =~ /[qQ]/) {last;}
  elsif ($volba =~ /[nN]/) {&nacti_cd;}
  elsif ($volba =~ /[hH]/) {
    do{
     &odelovac;
     print ("Pri hledani lze vyuzivat regularni vyrazy\n");
     print ("Co hledat?>");
     $string = <STDIN>;
     chomp($string);     
    }while ($string eq "*");
   &hledej(\%root,$string); 
  }
  elsif ($volba =~ /[dD]/) {&smaz;}
  elsif ($volba =~ /[zZ]/) {
    &odelovac;
    print ("");
    print ("Co vypsat?>");
    $string = <STDIN>;
    chomp($string);
     if ($string){
     &zobraz($root{$string});
     }else{
     &zobraz(\%root);}
    }
  elsif ($volba =~ /[sS]/) {&uloz;}
  elsif ($volba =~ /[lL]/) {%root = %{retrieve("$dbfile")};}
  else {print ("chybne zadani!!\n");
 }
}
}

sub vem_prikaz{
my $volba;
print ("\nNacteni CD: n\n");
print ("Hledani: h\n");
print ("Mazani: d\n");
print ("Zobraz: z\n");
print ("SAVE cfg: s\n");
print ("LOAD cfg: l\n");
print ("Volba? >");
$volba=&vem_znak;
return $volba;
}


sub vem_znak{
my ($volba);
$volba = <STDIN>;
substr($volba,0,1);
print ("\n");
return $volba;
}
############################################################################
sub uloz{

if (not -e $dbfile){
 `touch $dbfile`;
  store(\%root,"$dbfile");
  }else {
  print ("Soubor s databazi uz existuje mam jej prepsat? [A/N] >");
   if (&vem_znak =~ /a/i) {
    `cp $dbfile $dbfile."bak"`;
    if (eval{store(\%root,"$dbfile")}){print ("DB uspesne ulozena do $dbfile \n");}
    else{ print ("Chyba pri zapisu do souoru $dbfile !!!!\n")};
    }
  }    
  


}

###########################################################################3
sub zobraz{
my ($odkaz)=@_;
my ($polozka);
print ("zobrazuji\n");
&odelovac;
foreach $polozka (sort keys %{$odkaz}){
print ("$polozka\n");
#print Dumper(%root);
}  
&odelovac;
}

############################################################################
sub hledej{
my ($odkaz,$string)=@_;
my ($polozka);
 foreach $polozka (sort keys %{$odkaz}){
#print ("$polozka -- $odkaz->{$polozka}\n");
  if ($polozka =~ /$string/i){
   if ($odkaz->{$polozka} =~ /^HASH/){print ("@cesta/$polozka -- DIR\n");
   }else {
    print ("@cesta/$polozka -- ");
    print int($odkaz->{$polozka}/1024);
    print (" Kb\n");
   }
  }
  if ($odkaz->{$polozka} =~ /^HASH/) {
  push(@cesta,"/".$polozka);
  hledej($odkaz->{$polozka},$string);
  pop(@cesta); 
  }
  
 }
}

###############################################################################333
sub nacti_cd{
my ($odkaz,$meno);
`mount $cdrom`;

$odkaz = nacti($cdrom);

`umount $cdrom`;
&odelovac;
print ("Jak se CD bude v seznamu jmenovat??\n?>");
$meno = <STDIN>;
chomp($meno);
 if ($meno){
   if (exists($root{$meno})){
     print ("Zaznam $meno uz existuje\n");
   }else{ 
     $root{$meno} = $odkaz;
     print ("Uspesne nacteno\n");
   }
 }else{
  print ("Uspesne zruseno!!!\n");
 }
}


#######################################################3
sub nacti{
my ($path) = @_;
my (@inode, %new, $polozka, $odkaz,$retval);
print ("cteni adresare $path \n");
#if (system("mount $cdrom")) {die "$cdrom nelze primountovat";}

opendir(CD, $path);
@$path = readdir(CD);
closedir (CD);

 foreach $polozka (sort @$path){
  @inode = stat($path."/".$polozka);
  if ($polozka ne "." && $polozka ne ".."){
  &diag("$polozka -- $inode[2]"); 
  if (substr($inode[2],0,1) == "1") {
    print ("DIR\n");
    $newpath = $path."/".$polozka; 
    $retval = &nacti($newpath);
    $new{$polozka} = $retval;
    &diag("vracen $polozka --- $retval \n");
    }
    else {
    &diag("FILLE\n");
    $new{$polozka} = $inode[7];
   }
  }
 }
return \%new;
}
############################################################
sub smaz{
my ($polozka,$meno);
 foreach $polozka (sort keys %root){
  print ("$polozka\n");
 }
&odelovac;
print ("Pro zruseni volby zadejte cokoliv co se nenachazi v predchazejicim vypise. \nCo se ma smazat?? >");
$meno = <STDIN>;
chomp($meno);
delete $root{$meno};
}

####################################################
sub odelovac{
print ("----------------------------------------------------------\n");
}
#######################################################
sub diag{
my ($vypis)=@_;
#print ("\r $vypis")
}
#######################################################

sub mp3{
my ($odkaz) = @_;
my $polozka;
 foreach $polozka (sort keys %{$odkaz}){
  if ($polozka =~ /mp3/i){&adres($odkaz->{$polozka});} 
 }
}

sub adres{
my ($odkaz) = @_;
my $polozka;
 foreach $polozka (sort keys %{$odkaz}){
  if ($odkaz->{$polozka} =~ /^HASH/){
   if ($polozka !~ /$bad_name/i){
   print ("$polozka\n");
   &adres($odkaz->{$polozka});
   }
  } 
 }  
}

