#!/usr/bin/perl
use locale;
# require 'pauloteca.pl';
require '/home/ferramentas/pauloteca.pl';
$separador = "¤";
# @ficheiros = ("Jspell.def.ze","Jspell2.def.ze","LabEL_DC.def.ze.hi",
#	      "PALMORF.def.ze.hi","Regra.def.ze","Smorph.def.ze.hi");

sub imprime_analise {

  print "$_[0]÷$_[1]{pos}÷$_[1]{lema}÷$_[1]{tempo}÷$_[1]{numero}÷$_[1]{pessoa}÷$_[1]{genero}÷$_[1]{grau}÷$_[1]{da}÷$_[1]{caso}÷$_[1]{outros}\n"; 

  print FICH_AUX "$_[0]÷$_[1]{pos}÷$_[1]{lema}÷$_[1]{tempo}÷$_[1]{numero}÷$_[1]{pessoa}÷$_[1]{genero}÷$_[1]{grau}÷$_[1]{da}÷$_[1]{caso}÷$_[1]{outros}\n"; 


}

sub retira_espacos {

$_[0] =~ m/(.?[^\s]+)\s?/;
$1;

}

sub analise_igual {

  if ($_[0] {pos} eq $_[1] {pos} and
      $_[0] {lema} eq $_[1] {lema} and
      $_[0] {tempo} eq $_[1] {tempo} and
      $_[0] {numero} eq $_[1] {numero} and
      $_[0] {pessoa} eq $_[1] {pessoa} and
      $_[0] {genero} eq $_[1] {genero} and
      $_[0] {grau} eq $_[1] {grau} and
      $_[0] {da} eq $_[1] {da} and
      $_[0] {caso} eq $_[1] {caso} # and
#      $_[0] {outros} eq $_[1] {outros}
 )

 {
    "V";
  }
  else {
    "F";
  }

}

sub classe_analise_igual {

  if ($_[0] {pos} eq $_[1] {pos} and
#      $_[0] {lema} eq $_[1] {lema} and
      $_[0] {tempo} eq $_[1] {tempo} and
      $_[0] {numero} eq $_[1] {numero} and
      $_[0] {pessoa} eq $_[1] {pessoa} and
      $_[0] {genero} eq $_[1] {genero} and
      $_[0] {grau} eq $_[1] {grau} and
      $_[0] {da} eq $_[1] {da} and
      $_[0] {caso} eq $_[1] {caso} # and
#      $_[0] {outros} eq $_[1] {outros}
 )

 {
    "V";
  }
  else {
    "F";
  }

}



sub analise_existente {

  $existe = "F";

  $ref_hash = \$dados {$_[2]} {$_[1]};

  foreach $analise (@ {$$ref_hash}) {
  if (analise_igual($_[0], $analise) eq "V") {
       $existe = "V";
       last;
    }
   

  }

  $existe;
} 


sub analises_iguais_aux {
#  print $#{$dados{$_[0]}{$_[2]}};
#  print "\n";
#  print $#{$dados{$_[1]}{$_[2]}};
#  print "\n";
  $heuristica = 0;
  for $A (0 .. $#{$dados {$_[0]} {$_[2]} } ) {
    for $B (0 .. $#{$dados {$_[1]} {$_[3]} } ) {
      $ok = "F";
#      print $_[0];
#      &imprime_analise ($dados {$_[0]} {$_[2]} [$A]);
#      print $_[1];
#      &imprime_analise ($dados {$_[1]} {$_[3]} [$B]);
      if (&analise_igual($dados {$_[0]} {$_[2]} [$A],
                         $dados {$_[1]} {$_[3]} [$B]) eq "V" ) {
	  $ok = "V";
          last;
      }  
    }
    if ($ok ne "V") {
      $heuristica++;
    }
  }
  $heuristica;
}

sub classes_analises_iguais_aux {
#  print $#{$dados{$_[0]}{$_[2]}};
#  print "\n";
#  print $#{$dados{$_[1]}{$_[2]}};
#  print "\n";
  $heuristica = 0;
  for $A (0 .. $#{$dados {$_[0]} {$_[2]} } ) {
    for $B (0 .. $#{$dados {$_[1]} {$_[3]} } ) {
      $ok = "F";
#      print $_[0];
#      &imprime_analise ($dados {$_[0]} {$_[2]} [$A]);
#      print $_[1];
#      &imprime_analise ($dados {$_[1]} {$_[3]} [$B]);
      if (&classe_analise_igual($dados {$_[0]} {$_[2]} [$A],
                         	$dados {$_[1]} {$_[3]} [$B]) eq "V" ) {
	  $ok = "V";
          last;
      }  
    }
    if ($ok ne "V") {
      $heuristica++;
    }
  }
  $heuristica;
}



sub analises_iguais {
  analises_iguais_aux ($_[0],$_[1],$_[2],$_[3]) + analises_iguais_aux ($_[1],$_[0],$_[2],$_[3]);
}

sub classes_analises_iguais {
  classes_analises_iguais_aux ($_[0],$_[1],$_[2],$_[3]) + classes_analises_iguais_aux ($_[1],$_[0],$_[2],$_[3]);
}


sub imprimiu_forma {
  $imprimiu = "F";
  foreach $key (@imprimidas) {
    if (&classes_analises_iguais ($ficheiros[0],$ficheiros[0],$key,$_[0]) == 0) {
      $imprimiu = "V";
      last;
    }

  }
  $imprimiu;

}


sub imprimiu_analise {
  $imprimiu = "F";
  foreach $key (@analises_imprimidas) {
    if (&analise_igual ($key,$_[0]) eq "V") {
      $imprimiu = "V";
      last;
    }
  }
  $imprimiu;
}



sub verifica_forma {

  $sistema = 0;
  $num_diferentes = 0;
  $num_nao_corr = 0;
  $num_iguais = 0;

  $ref_hash = \$dados {$ficheiros[$sistema]};

  open  FICH_AUX, ">prateada_".$dirglobais.".txt";
  
  while (($chave_sorteio,$$sorteio) = each % $$ref_hash) {

#    print "$chave_sorteio\n";

    $heuristica_forma = 0;

    $iguais = "Iguais";
    foreach $ficheiro (@ficheiros) {
      
      if ($ficheiro ne $ficheiros[$sistema]) {
         
	if (not exists $dados {$ficheiro} {$chave_sorteio}) {
           
	  $iguais = "Não correspondência";
          $num_nao_corr = $num_nao_corr + 1;
          last;
	}

   
        $heuristica_forma += &analises_iguais ("$ficheiros[$sistema]",
			      		       "$ficheiro",
			      		       $chave_sorteio,
					       $chave_sorteio);

    
      
      }

    }


    $hash_heuristica {$chave_sorteio} = $heuristica_forma;
    
    
  }


  @chave_he = sort {$hash_heuristica{$b} <=> $hash_heuristica{$a}} (keys %hash_heuristica);

#    print "Hash heurísticas:\n";
#    while (($chave_he,$he) = each %hash_heuristica) {
#      print "$chave_he : $he\n";
#    }
  
     print "×\n";
     print FICH_AUX "×\n";

     $primeira_forma = "V";
     foreach $key (@chave_he) {

         $sorteio_imprime = int rand scalar 3;
         
  #       print $sorteio_imprime;

         $valor_he = $hash_heuristica {$key};
#            print "$key: $valor_he\n";

         if (
&imprimiu_forma($key) eq "F" 
and $sorteio_imprime==1 
and $valor_he != 0 and (not exists $ouro {$key}) 
and !($key =~ m/-/)) {

	   if ($primeira_forma eq "F") {

	     print "×\n";
             print FICH_AUX "×\n"; 
	   }

           $primeira_forma = "F";
           
           foreach $ficheiro (@ficheiros) {
           print FICH_AUX $ficheiro."\n";
             for $A (0 .. $#{$dados {$ficheiro} {$key} } ) {
                
               if (&imprimiu_analise($dados {$ficheiro} {$key} [$A]) eq "F") {               
                 &imprime_analise ($key,$dados {$ficheiro} {$key} [$A]);
                 push @analises_imprimidas,$dados {$ficheiro} {$key} [$A];
               }
             }
           }
           @analises_imprimidas = ();
           push @imprimidas, $key;
           

           
         }


     }
}


if ($ARGV[0] eq "-d") {

    shift;  $dirglobais=$ARGV[0]; shift;

}

if ($ARGV[0] eq "-l") {

    shift;  $fich_dourada=$ARGV[0]; shift;
    print STDERR "ficheiro dourada: $fich_dourada\n";
}



open FICHEIRO, $fich_dourada;  
foreach $linha (<FICHEIRO>) {

  if ($linha =~ m/$filtro/ and
      $linha=~ m/^([^÷]*)÷([^÷]*)÷([^÷]*)÷([^÷]*)÷([^÷]*)÷([^÷]*)÷([^÷]*)÷([^÷]*)÷([^÷]*)÷([^÷\n]*)/) {
  
    $ouro {$1} ++;

  }
}

@ficheiros=grep /.*\.le$/, &DirConteudo("$dirglobais/.");

srand;
foreach $ficheiro (@ficheiros) {

  $ficheiro_base = $ficheiro;

  open FICHEIRO, "$dirglobais/$ficheiro";  
#  print "uts/uts.".$ficheiro.".def.ze";
  foreach $linha (<FICHEIRO>) {
    if ($linha=~ m/^([^÷]*)÷([^÷]*)÷([^÷]*)÷([^÷]*)÷([^÷]*)÷([^÷]*)÷([^÷]*)÷([^÷]*)÷([^÷]*)÷([^÷]*)÷([^÷\n]*)/) {
  
  $forma_min = lc $1;
 
    if (not exists $dados {$ficheiro} {$forma_min} or
	&analise_existente({'pos'=>$2,'lema'=>$3,'tempo'=>$4,'numero'=>$5,'pessoa'=>$6,
                            'genero'=>$7,'grau'=>$8,'da'=>$9,'caso'=>$10 ,'outros'=>$11
},
                            $forma_min, $ficheiro) eq "F" ) {
        

      	$num_analise = $#{$dados {$ficheiro} {$forma_min}} + 1;

   	$dados {$ficheiro} {$forma_min} [$num_analise] {"pos"} = $2;
    	$dados {$ficheiro} {$forma_min} [$num_analise] {"lema"} = $3;
    	$dados {$ficheiro} {$forma_min} [$num_analise] {"tempo"} = $4;
    	$dados {$ficheiro} {$forma_min} [$num_analise] {"numero"} = $5;
    	$dados {$ficheiro} {$forma_min} [$num_analise] {"pessoa"} = $6;
    	$dados {$ficheiro} {$forma_min} [$num_analise] {"genero"} = $7;
    	$dados {$ficheiro} {$forma_min} [$num_analise] {"grau"} = $8;
    	$dados {$ficheiro} {$forma_min} [$num_analise] {"da"} = $9;
    	$dados {$ficheiro} {$forma_min} [$num_analise] {"caso"} = $10;
    	$dados {$ficheiro} {$forma_min} [$num_analise] {"outros"} = $11;   

    }
  
   }

  }
    
}   

&verifica_forma;


















