#!/usr/bin/perl

#
# cluster.pl - Script para gerar os resultados dos valores obtidos para clusters de um nome - rcaap
#	versao: 0.1 15 de Novembro de 2010
#Fazer um pm só para gerar os forms (options, etc)
#

use CGI;
use Tools::Interface;
use Tools::Clean; 
use Tools::Find; 
use Tools::Sys::SysTools;

my $interface = new Tools::Interface();
$interface->{configFile} = "conf/config";
my $cgi = $interface->session();
print $cgi->header();

#load do ficheiro de configuração
open(CFILE, "conf/config");
@conf = <CFILE>;
close(CFILE);

$clustersLocation = "";
foreach(@conf){
	next if($_ =~ /^\#/);
	$_ =~ /(.+)=(.+)/;
	$v1 = $1;
	$v2 = $2;
	next if(!$v1 || !$v2);
	$dropdownBoxResults = $v2 if($v1 =~ /(clusterValues)/);
	$clustersLocation = $v2 if($v1 =~ /(clustersLocation)/);
	$v1 = "";
	$v2 = "";
}

#Hardcoded...
#@clusterType = ("normal", "max", "both");
@clusterType = split (/\s/, $dropdownBoxResults);
@matchType = ("1", "2", "3", "4", "5", "6", "7", "8");
@clustersInitials = ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
						"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");


@clusterDir = ();
#lingua
$lang =  $cgi->param('lang') ||  $interface->{LANG} || "pt";
$interface = new Tools::Interface($lang);
$lang = $interface->{LANG};

$langChange = $interface->{LANGCHANGE};
#if($lang eq "pt"){
#	$langChange = "en";
#}
#else{
#	$langChange = "pt";
#}

#$interface->{LANG} = $lang;
$cgi->param('lang'=> $lang);

#classe
$class = $cgi->param('class') || "CLASS_SEARCHCLUSTER";

$action = $cgi->param('action') ? $cgi->param('action') : "cluster";
$script = "clusters\.pl";

#menus e footer e header - load views;
$body = "views/clustersbody\.html"; #default
#$cgi->param('viewclusters') - o nome do input button
$body = "views/clustersviewbody\.html" if($cgi->param('viewclusters'));
$cgiHTML = $interface->commonViews();
$cgiHTML = $interface->addView($cgiHTML, 'BODY', $body);
$title = "views/cluster_title_".$lang."\.html";
$cgiHTML = $interface->addView($cgiHTML, 'TITLE', $title);

$nameToCluster = $cgi->param('nameCluster') || "";
$clusterResults = "<br>";
if($cgi->param('action_clear') || !$nameToCluster){
	$nameToCluster = "";
	#$ctparam = "normal";
	$ctparam = $clusterType[0];
	$ctmatchparam = "1";
}

if($cgi->param('viewclusters')){
	#Gerar a Lista com as iniciais 
	$letters = "";
	$ctparam = $cgi->param('clustertype') ? $cgi->param('clustertype') : $clusterType[0];
	foreach $letter (sort @clustersInitials){
		$onmouseover = "onmouseover=\"changeLetter(this, 'letter');constroiHREF(this, 'clusters.pl','clusterviewform','viewclusters=1');\"";
		$letters .= "<a id='$letter' $onmouseover $onclick class='href' href='' >$letter</a>&nbsp;&nbsp;";
	}
	$firstLetter = $cgi->param('letter') || "A";
	$firstLetter = replaceLetter($firstLetter);
	
	#Obter a lista de elementos do diretório específico:
	$dirCluster = $clustersLocation.$ctparam;
	opendir(DIR, $dirCluster) || print "Não foi possível abrir o directório $dirCluster - $!\n";
	@dirList = readdir(DIR);
	close(DIR);
	@dirList = grep (/^[$firstLetter].+/, @dirList);
	#$clusterResults = "$ctparam - ".scalar(@dirList)."<br>";
	$clusterResults = "";
	if(scalar(@dirList) > 0){
		$clusterResults .= "<div class='title' ><label for='results'> \${search.tit.results} - $firstLetter - $ctparam - ".scalar(@dirList) ."</div>" ;
		$clusterResults .= "<div id='results' class='left' >";
		$i = 1;
		foreach $group (sort @dirList){
			$nameToSee = $group;
			$nameToSee =~ s/(--)/ /g;
			$nameToSee =~ s/(\.txt)//g;
			
			$onclick = "\"getClusterNames('json.pl', 'clusterALL', '$ctparam', '$group', 'results', 'elements_res');scroll(0,0);return false;\"";
			$clusterResults .= $i." <a id='$i' onclick=$onclick class='href' href='' >$nameToSee</a><br>";
			$i++;
		}
		$clusterResults .= "</div>";
		#$clusterResults .= "<div id='elements' class='none' ></div><br>";
		$clusterResults .= "<br>";
		$clusterResults .= "<div id='elements_res' ></div><br>";
	}
	else{
		$clusterResults = "<div class='title' ><label for='results'>
			\${search.tit.results}</label></div>
		<div id='results' >\${res.tit.noresults}</div>";
	}
}
elsif(!$cgi->param('action_clear') && $cgi->param('action') && $cgi->param('action') eq "cluster"){
	$clean = new Tools::Clean();
	$ctparam = $cgi->param('clustertype') ? $cgi->param('clustertype') : $clusterType[0];
	$ctmatchparam = $cgi->param('matchtype') ? lc($cgi->param('matchtype')) : "1";
	
	if($nameToCluster =~ /\w/){
		my $find = new Tools::Find();
		my $systools = new Tools::Sys::SysTools();
		@new = ();
		push(@new, $clean->initialAnalysis($nameToCluster));
		foreach $str (@new){               
			$str = $clean->cleanByRules($str,1);
			next if($str !~ /\w/);
			$str = $clean->normalize($str);
			$finalWordList{$str} = $str;
		}
		
		#Dependendo do tipo de Cluster a pesquisar vamos ao ficheiro de configuração buscar o seu valor
		#load do ficheiro de configuração
		@clusterDir = ();
		# if($cgi->param('clustertype') eq 'normal'){
			# @clusterDir = grep /clusters=/, @conf;
		# }
		# elsif($cgi->param('clustertype') eq 'max'){
			# @clusterDir = grep /clustermaximos=/, @conf;
		# }
		# else{
			# push(@clusterDir, (grep /clusters=/, @conf));
			# push(@clusterDir, (grep /clustermaximos=/, @conf));
		# }
		$dirCluster = $clustersLocation.$ctparam;
		push @clusterDir, $dirCluster;
		#Vamos percorrer todas directorias com agrupamentos
		foreach $dir (@clusterDir){
			#$dir =~ s/(.+)=(.+)\s*/$2/;
			$dir =~ s/\s\n//g;
			$clusterName = "";
			$i = 0; #Para ter id diferentes se houver nomes diferentes
			foreach $name (keys %finalWordList){
             @names = split(/\s/, $name);
			 if(scalar @names > 1){
					if($ctmatchparam eq 7 || $ctmatchparam eq 8){
							$nameFirst = $names[0];
							$nameFirst =~  s/\.//;
							$nameFirst = "" if($ctmatchparam eq 8);
							$nameFinal = $names[scalar(@names)-1];
							#print "$nameFirst - $nameFinal <br>";
							@listClusterFiles = $systools->getDirFiles($dir, $nameFirst, $nameFinal);
							#Como só quero os nomes começados pela letra do firstName no 8 então tenho de filtrar
							 if($ctmatchparam eq 8){
								$firstLetter = substr $names[0], 0, 1;
								#print "$firstLetter <br>";
								@listClusterFiles = grep /^$firstLetter/, @listClusterFiles;
							 }
					}
					else{
						@listClusterFiles = $systools->getDirFiles($dir);
					}
					
					if($ctmatchparam eq 5 || $ctmatchparam eq 6){
							%res = $find->getMatchingClustersNotSequence($dir, \@listClusterFiles, $name, $ctmatchparam);
					}
					elsif($ctmatchparam eq 7 || $ctmatchparam eq 8){
						$pattern = $find->makePattern($name,4); #Vamos ter os nomes pelo meio com expansão de iniciais
						%res = $find->getMatchingClusters($dir, \@listClusterFiles, $pattern);
					}
					else{
							$pattern = $find->makePattern($name,$ctmatchparam);
							%res = $find->getMatchingClusters($dir, \@listClusterFiles, $pattern);
					}
                }
				else{
					#print "Assumir nome como último nome\n";
					@listClusterFiles = $systools->getDirFiles($dir, "", $name);
					if($ctmatchparam ge 5){
							%res = $find->getMatchingClustersNotSequence($dir, \@listClusterFiles, $name, $ctmatchparam);
					}
					else{
							$pattern = $find->makePattern($name,$ctmatchparam);
							%res = $find->getMatchingClusters($dir, \@listClusterFiles, $pattern);
					}
                }
				if(keys(%res) > 0){
					$clusterName = "";
					#$dir =~ /(.+)\/(.+)\s*\n*/;
					#$clusterName .= "<b>\${name\.tit\.".lc($2)."} - ".keys(%res)."<br></b>" if(keys(%res) > 0);
					$clusterName .= "<b>".$ctparam." - ".keys(%res)."<br></b>" if(keys(%res) > 0);
					$i++; #Para ter id diferentes se houver nomes diferentes
					foreach $nameres (sort keys %res){
						%totalNames = map {$_ => 1}@{$res{$nameres}};
						#$total = scalar @{$res{$nameres}};
						$total = keys (%totalNames);
						$nameres =~ s/\.txt//;
						$nameView = $nameres;
						$nameView =~ s/--/ /g;
						$onclick = "\"getClusterElements('$nameres','$name', '".$ctparam."','$ctmatchparam', '$lang', 'elements_res', '$results_$i', 0);return false;\"";
						$onmouseover = "\"getClusterElements('$nameres','$name', '".$ctparam."','$ctmatchparam', '$lang', 'elements_$i', '$nameView', 0);return false;\"";
						$onmouseout = "\"removeElementById('elements_$i');return false;\"";
						$clusterName .= "<a id='$nameView' class='href' href='' onclick=$onclick onmouseover=$onmouseover onblur=$onmouseout onmouseout=$onmouseout >$nameView</a> ($total)<br>";
					}
					$clusterName .= "<br>";
					$final{$name} .= $clusterName;
				}
			}
		}
	}
	if(keys (%final) > 0){
		$i=0;
		foreach(sort keys %final){
			$i++;
			$clusterResults .= "<div class='title' ><label for='results'> \${search.tit.results} - $_</label></div><div id='$results_$i' class='left' >".$final{$_}."</div>";
			$clusterResults .= "<div id='elements_$i' class='none' ></div><br>";
			$clusterResults .= "<div id='elements_res' ></div><br>";
		}
	}
	else{
		$clusterResults = "<div class='title' ><label for='results'>
			\${search.tit.results}</label></div>
		<div id='results' >\${res.tit.noresults}</div>";
	}
	
 }


#Preencher as opções de select
# $optionsctype = "";
$optionsctype = $interface->generateOptions(\@clusterType, $ctparam, 0, 'type.tit');

#$optionsmtype = "";
$optionsmtype = $interface->generateOptions(\@matchType, $ctmatchparam, 1, 'type.tit');



%vars=("LANGCHANGE" => $langChange,
	"LANG" => $lang,
	"SCRIPT" => $script,
	"ACTION" => $action,
	"CLASS" => $class,
	"NAME_VALUE" => $nameToCluster,
	"CLUSTER_RESULTS" => $clusterResults,
	"OPTIONS_CTYPE" => $optionsctype,
	"OPTIONS_LETTERS" => $letters,
	"OPTIONS_MTYPE" => $optionsmtype
	);
	


#Susbtituir as variáveis
$cgiHTML = $interface->substituteVars($cgiHTML, \%vars);

$cgiHTML = $interface->substituteI18N($cgiHTML);
$cgiHTML = $interface->substituteClass($cgiHTML, $class);


print $cgiHTML;

#Passar para uma outra classe
#Modificar - Passar um letra tipo A para AÁÀÂ, etc
sub replaceLetter{
	my $letter =  shift;
	
	$letter =~ s/A/AÁÀÂÃÄÅÆ/; 
	$letter =~ s/E/EÉÈÊË/; 
	$letter =~ s/I/IÍÌÎÏ/; 
	$letter =~ s/O/OÓÒÔÕÖØ/; 
	$letter =~ s/U/UÚÙÛÜ/; 
	$letter =~ s/Y/YÝ/;
	
	$letter =~ s/C/CÇ/;
	$letter =~ s/N/NÑ/;
	
	return $letter;
}



