#!/usr/bin/perl -s

use strict;
use warnings;

use CGI qw(:standard);
use CQP;
use Data::Dumper;

# directoria onde estão registados os corpora 
my $regis = "/usr/local/share/cwb/registry";

# corpus seleccionado
my $corpus = lc(param('corpus')) || '';

my $cqp;

# n - tipo do resultado da pesquisa
# max - número máximo de pesquisas apresentadas
# result - resultados obtidos
my $n = param('n') || '7 words';
my $max = param('max') || '20';
my @result = ();

if ($corpus) {
	# load do corpus escolhido
	$cqp = CQP -> new("-b 10 -D".uc($corpus));
	print STDERR $corpus;
} else {
	$cqp = CQP -> new("-b 10");
}

# array com todos os corpora que tenho disponíveis
my @corpora = map { s/^\s*//; ucfirst(lc($_)); } $cqp -> exec("show corpora");

# procura dos corpora paralelos
my $registry = param('r') || $regis;
my $paral = `grep ALIGNED $registry/$corpus`;
chomp($paral);
$paral =~ s/ALIGNED\s*(\S+)/$1/;

# associação do corpus escolhido às opções disponíveis
my %corpora;
for (@corpora) {
   $cqp = CQP->new("-b 10 -D".uc($_));
	my @tags = $cqp -> exec("show cd");
	my @tags1;
	for my $tag (@tags) {
		push (@tags1,$tag) if ($tag !~ /s-Att[.]*/);
	}
	$corpora{$_}=[@tags1];
}

print header,"\n";
print start_html("-title" => "Corpora Forge"),
		h1("Ferramenta de pesquisa em corpora"),hr,"\n";
print p("Escolha um corpus dispon&iacute;vel"),"\n";

print start_form({"name" => "corporaForm"}),"\n",
# selecção dos corpora
		p("<select name=\"corpus\" size=\"1\" onChange=\"redirect(this.options.selectedIndex)\">"),"\n";

my @ordem = keys %corpora;
for (@ordem) {
	print "<option>$_</option>\n";
}
print "</select>\n";
# fim de selecção dos corpora

# selecção dos atributos do corpus
print "<select name=\"tag\" size=\"1\" onChange=\"adder()\">\n";

for (@{$corpora{$ordem[0]}}) {
	if ($_ =~ /p-Att\s+lema/) {
		print "<option value='lema contains \"*\"'>$_</option>\n";
	}
	else {
		print "<option>$_</option>\n";
	}
}

print "</select>\n";
# fim de selecção dos atributos do corpus

print "<script> 
//<!--
var groups=document.corporaForm.corpus.options.length;
var group=new Array(groups);
for (i=0; i<groups; i++)
group[i]=new Array();
";
my ($i,$j) = (0,0);

for (@ordem) {
	for (@{$corpora{$_}})  {
			print "group[$i][$j]=new Option(\"$_\",\"$_\");","\n";
		$j++;
	}
	$i++;
	$j=0;
}

print "var temp=document.corporaForm.tag;

function adder() {
document.corporaForm.p.value = document.corporaForm.p.value+' ['+document.corporaForm.tag.value+'] ';
}

function redirect(x){
for (m=temp.options.length-1;m>0;m--)
temp.options[m]=null;
for (i=0;i<group[x].length;i++){
temp.options[i]=new Option(group[x][i].text,group[x][i].value);
}
temp.options[0].selected=true;
}
//-->
</script>\n";

print table(
			Tr(
				td(["procurar"," contexto"," max"])),
			Tr(
				td([input({type=>"text",name=>"p",size=>"18",value=>""}),
#					textfield('k'),
					popup_menu('n',["7 words","20 words","1 tu","1 s","1 p","0 words"]),
					popup_menu('max',[20,200,1000,2000])]))
		),

end_form;

print "<a onClick='window.location=\"info.pl?corpus=\"+document.corporaForm.corpus.options[document.corporaForm.corpus.options.selectedIndex].text' \">Informa&ccedil;&atilde;o sobre o corpus</a>";

if(param()) {
	
	print br;

   $cqp = CQP->new("-b 10 -D ".uc($corpus));
	
	my $pat = param('p');
	$pat = doyourbest($pat);
	print "<pre>\n$pat\n</pre>\n";

   $cqp->exec("set HardBoundary 15;");
   $cqp->exec("set LeftContext $n ;");
   $cqp->exec("set RightContext $n ;");
   $cqp->exec("set LeftKWICDelim  '<b>' ;");
   $cqp->exec("set RightKWICDelim '</b>' ;");
   $cqp->exec("show +$paral ;") if $paral;

	$cqp -> exec("A = $pat;");
	@result = $cqp -> exec("cat A 1 $max;");

	print "Foram encontradas ",
		b($cqp -> exec("size A;"))," ocorrencias",
		hr;

	if($paral){
     print "<table border='1' >\n";
     while(@result){
       my $a=shift(@result);
       my $b=shift(@result);
       $b =~ s/-->$paral?://;
       print Tr(td([$a,$b]));
     }
     print "</table>\n";
   }
   else{ 
     print ol(li([@result]));
   }
 }
		
sub doyourbest{ 
	my $pat = shift;
   $pat =~ s/^\s*(\w+)\s*$/"$1";/;
	$pat =~ s/\b(alema|apos)\s*=\s*"(.*?)"/$1 contains "$2"/g;
   $pat
}
__END__

