#!/usr/bin/perl

#rosetta "pepito" "CC sumapack" "DBD-Pg" "EBUILD"

my $prefix=$ENV{'prefix'};
if (not $prefix){
    $prefix="/usr/local";
}

my $DIRDATO=$ENV{'DIRDATO'};
if (not $DIRDATO){
    $DIRDATO="${prefix}/share/sumapack";
}
#my $VARDATO=$ENV{'VARDATO'};
#if (not $VARDATO){
#    $VARDATO=@@;
#}
my $DISTRO=$ENV{'DISTRO'};
if (not $DISTRO){
     $DISTRO="SUSE";
}
#my $DVERSION=$ENV{'DVERSION'};
#if (not $DVERSION){
#    $DVERSION=@@;
#}
use Getopt::Long;

my %moo=();
GetOptions(
"help"   =>\$moo{comhelp},
"listdistros"   =>\$moo{ld}, #listar repositorios conocidos
"nolacks"   =>\$moo{nl}, #no leer lacks
"version"=>\$moo{comversion},
    );



if ($moo{comhelp}       ) {$accion="help";
                           print "Help\n";
			   exit;
                           } 
elsif ($moo{comversion}    ) {$accion="version";
                            print "Version 0.01\n";
                            exit;
                           } 
else{                       
                           
                           }


# otra opcion seria no lacks


##################################

#http://www.linuxquestions.org/questions/slackware-14/tex-live-in-slackware-635217/

# sacar comandos repetidos a la salida por ejemplo cc y gcc ambos dan gcc
# al poner antes que todo los repos a veces dos secuencias de programas quedan separadas, juntar

#@ARGUMENTOS=split(/ /,"rpm gcc grep dpkg httpd svn2cl tgif latex muse-el" );
# ojo esto esta mal no separar si hay agrupados con "" y ademas si hay dos espacios error

my @ainstalar = @ARGV;

if (not $moo{'nl'}){
#print "Leo laks\n";
open LACKS, "./lacks";
# or die "NO HAY ARCHIVO lacks\n";;
while (<LACKS>){
    chomp;
    @ainstalar=(@ainstalar,$_);
}
close LACKS;
}



#use feature switch;

#my $DISTRO=$ARGV[0];

#my $REPPACK="SUSE-RPM";
#my $DISTROVERSION="11.2";
# poner distro  y lugar de rosetta  en un archivo /etc



#print "DD $DISTRO\n";
#cambiar infosis por detectasistema
#    $DISTROVER=`infosis -s|\
#      awk -F'=' '/^export DIRDATO=/ {print "R;" \$2};\
#                 /^export VARDATO=/ {print "A;" \$2};\
#                 /^export DISTRO=/ {print "D;" \$2};\
#                 /^export DVERSION=/ {print "V;" \$2}; '| tr '\n' ';'`;
#    chomp($DISTROVER);
#    #print "DISTROVER $DISTROVER\n";#
#
#    ($N[0],$D[0],$N[1],$D[1],$N[2],$D[2],$N[3],$D[3])=split(/;/,$DISTROVER);
#    $num= scalar @N;#
#
#    foreach my $nn (0 ..scalar @N -1){
#        #print "HH $nn\n";#
#	if 	 ($N[$nn] eq 'R') {$DIRDATO=$D[$nn]} 
#        elsif	 ($N[$nn] eq 'D') {
#           if (not $DISTRO){#
#	       $DISTRO=$D[$nn];
#               # ojo con version
#	   }
#              }
#        elsif	 ($N[$nn] eq 'V') {$VERSION=$D[$nn]}
#        elsif	 ($N[$nn] eq 'A') {$DIRVAR=$D[$nn]}
#        elsif    ($N[$nn] eq '') { print "Error infosis: faltan datos\n";} 
#        else {print "ERROR infosis N:$num  DISTROVER $DISTROVER\n"}
#    }


#print "DISTRO $DISTRO\n";

my %rosetta;
my %listadistros;


sub rosettainput{

    chomp;
    if ( $_=~/^\#/){
	  return;
	}
    my ($accion,$distro,$proyecto,$opcion,$paquetes)=split(/:/,$_,5);
    $accion=~s/^\s+//;
    $accion=~s/\s+$//;
    $distro=~s/^\s+//;
    $distro=~s/\s+$//;
    $proyecto=~s/^\s+//;
    $proyecto=~s/\s+$//;
    $opcion=~s/^\s+//;
    $opcion  =~s/\s+$//;
    $paquetes=~s/^\s+//;
    $paquetes=~s/\s+$//;
    if (not $distro){
        $distro="TODAS";
    }else{
	   $listadistros{$distro}=1;
    }
    if (not $accion ){
        return;
    }
   
    if (not $proyecto){
        $proyecto=$accion;
    }
    if (not $paquetes){
        $paquetes=$proyecto;
    }       
    if ($paquetes eq ':'){
        print "$accion;$distro;$proyecto;$opcion;$paquetes\n";
        print "error \n";
        exit;
    }
    my @paq=  split(/,/,$paquetes);
    #print "$accion;$distro;$proyecto;$opcion;$paquetes\n";
    foreach my $pq (@paq){
      $pq=~s/^\s+//;
      $pq=~s/\s+$//;
     # print "   XXXXXXX $pq\n";
    }
    
    $rosetta{$accion}->{$distro}->{$proyecto}=[$opcion,\@paq];
return;
}

use Data::Dumper;
# esto ocupa memoria al vicio, solo cargqar y procesar la entrada que corresponda

open ROSETTA, $DIRDATO."/rosetta.dat" or die "NO HAY ARCHIVO $DIRDATO/rosetta.dat\n";;
#open ROSETTA, "./data/rosetta.dat" or die "NO HAY ARCHIVO rosetta.dat\n";;
while (<ROSETTA>){
    rosettainput();
}
close ROSETTA;


#print Dumper \%rosetta;

open LOCALROSETTA, "rosetta.local" ;
#or die "NO HAY ARCHIVO localrosetta\n";;
rosettainput();
close ROSETTA;

#print Dumper \%rosetta;

#print "paquetes: @ainstalar \n";


if (defined $moo{'ld'}){
    @ld=keys %listadistros;
    print "@ld\n";
    exit;
}


my @data;

foreach my $pa (@ainstalar){

    #    print "========================================================== $pa =============\n";
# opciones para buscar paquetes: (defecto:BIN)  ORIGIN o CC

#si no hay bin va por ORIGIN
#si no hay ORIGIN va por CC

#CC es control de cambios

#segun la palabra que preceda la entrada va por ORIGIN directamente y descarta bin,
#o va por CC y descarta ORIGEN y BIN
my $salta='';
    if ($pa=~s/^ORIGIN //){# descartar distros
             $salta='ORIGIN';                 }
    if ($pa=~s/^CC //){# descartar distros y origen
             $salta='CC'           }

    
    my $datito;
    my $adentro;
    # si en la entrada se especifica directo el resultado con accion filtrar
    # ojo si es nombre de paquete no en rosetta.dat tambien pasara (sin PAQ)
    if ($pa=~/^(EBUILD|RPM|GET|DEP|PATCH|SVN|CPAN|DEB|REPO|TXZ|TGZ|TBZ|SH|LSH|COMMAND|PAQ|CONFIG|MAKE|INSTALL)/){
	$adentro=[$pa];
	$datito=['',$adentro,$DISTRO,$pa,$pa];
        #print "D   $pa $DISTRO\n";
    }

    if ((scalar @$datito == 0) and ($salta eq '')){
    foreach my $aa (keys %{$rosetta{$pa}->{$DISTRO}}){
	$adentro=$rosetta{$pa}->{$DISTRO}->{$aa}->[1];
	$datito=[@{$rosetta{$pa}->{$DISTRO}->{$aa}},$DISTRO,$aa,$pa];
         #print "P   $aa $DISTRO\n";
      }
    }
    if  ((scalar @$datito == 0) and ($salta eq '')){
       foreach my $aa (keys %{$rosetta{$pa}->{'TODAS'}}){
	 $adentro=$rosetta{$pa}->{'TODAS'}->{$aa}->[1];
	 $datito=[@{$rosetta{$pa}->{'TODAS'}->{$aa}},'TODAS',$aa,$pa];
         #print "T   $aa TODAS\n";
        }
    }
  if  ((scalar @$datito == 0) and ($salta ne 'CC')){
       foreach my $aa (keys %{$rosetta{$pa}->{'ORIGIN'}}){
	 $adentro=$rosetta{$pa}->{'ORIGIN'}->{$aa}->[1];
	 $datito=[@{$rosetta{$pa}->{'ORIGIN'}->{$aa}},'ORIGIN',$aa,$pa];
         #print "O   $aa ORIGIN\n";
        }
    }
  if (scalar @$datito == 0){
      foreach my $aa (keys %{$rosetta{$pa}->{'CC'}}){
	 $adentro=$rosetta{$pa}->{'CC'}->{$aa}->[1];
	 $datito=[@{$rosetta{$pa}->{'CC'}->{$aa}},'CC',$aa,$pa];
         #print "C   $aa CC\n";
        }
    }
    if (scalar @$datito == 0){
        #esto no es cierto, seria mejor que el usuario ponga si lo son? o que inspeccione?
        #asume fuentes
         if ($pa=~/tar\.gz$/){
	     $COMM='SOURCES';
# ojo no recuerdo que hace cambie source por get en babel
         }
         if ($pa=~/tar\.bz2$/){
              $COMM='SOURCES';
         }
#esto es cuando lo procese
# quizas ponerlo arriba antes
        #asume binario 
        # if ($pa=~/\.txz$/
        # if ($pa=~/\.tgz$/
        # if ($pa=~/\.tbz$/
        # if ($pa=~/\.rpm$/
        # if ($pa=~/\.deb$/
        # if ($pa=~/\.ebuild$/
        # if ($pa=~/\.sh$/
         #es de internet (esto lo manejan algunas paqueterias automatico, igual vamos a interceptar en muchos casos)
         #if ($pa=~/^http:\/\//
         #if ($pa=~/^ftp:\/\//

	 if ($COMM){
	     $adentro=["$COMM $pa"];
	 }else{
             $adentro=[$pa];
         }
         $datito=['',$adentro,$DISTRO,$pa,$pa];
         #print "Z    $pa $DISTRO\n";  
    }
      @sdata=(@sdata,@$adentro);
    #print "FUNCTION $pa\n";
    #print "NOSE $datito->[0]\n";
    #print "DISTRO $datito->[2]\n";
    #print "PROYECTO $datito->[3]\n";
    print "PROJECT $datito->[3] $pa $datito->[2]\n";
     foreach(@$adentro){
        print "$_\n";
     } 
     @data=(@data,$datito);
  }     



#print Dumper \@data;

#print "DISTRO=$DISTRO\nVERSION=$VERSION\nDIRDATO=$DIRDATO\n";
#print " @sdata\n";
$SALIDA="SALIDA=\"";
foreach(@sdata){
    $SALIDA.="$_;";
   # print "$_\n";
}
$SALIDA.='"';

#print "$SALIDA\n";
