#!/usr/bin/perl -w

use locale;
use XML::DT;
#use Data::Dumper

#our $cf;

my $filename= shift;
my @excluido;

sub plcs{
    $_[0]=~s/\'/\\\'/g;
    $_[0]=~s/^\-\-$//;
    return $_[0];
}

#lista de excluidos
if (-e $ARGV[0]){
    open EXCLUI, "<$ARGV[0]" or die "$!\n";
    while (<EXCLUI>){
	chomp;
	$excluido[$n++]=$_;
    }
    $excluido[$n]=0;
}

#comentários

print '/* Script SQL da Floresta Sintáctica (optimizado actualmente para PostgreSQL) - Linguateca, Pólo de Braga*/
';
print '/* Notas : createdb X */
';

#Criar tabelas

$dia =(gmtime)[3];
$mes =((gmtime)[4])+1;
$ano =1900+(gmtime)[5];
$data= "$ano-$mes-$dia";

if ($filename=~/(C[FP])_(\d\.\d)/){
    $descr=$1;
    $ver=$2;
    $descr=($descr eq "CP" ? "CetemPúblico" : "CentenFolha");
}elsif ($filename=~/FL_(\d\.\d)/){
    $descr="Floresta";
    $ver=$1;
}elsif ($filename=~/FL_(\d\.\d)/){
    $descr="Floresta Virgem";
    $ver=$1;
}

print "/* begin; */
create table metadados(
	nome varchar(30) default 'Floresta Sintá(c)tica',
	autor varchar(40) default 'Rui Vilela - Linguateca, pólo de Braga',
        email varchar(40) default 'ruivilela\@di.uminho.pt',
        url varchar(40) default 'http:\/\/linguateca.di.uminho.pt',
	data_sql timestamp default now(),
        data_script_sql timestamp default '$data',
	fonte varchar(30) default '$descr',
        versao varchar(4) default '$ver',
	formato varchar(80) default 'SQL (PostgreSQL) (Importado do Tiger-XML)',
	adicional text default 'Versão SQL em testes'
);

insert into metadados default values;

create table arvores(
	id int,
	referencia varchar(10),
	n int,
	cad varchar(20),
	sec varchar(10),
	sem varchar(10),
	texto text,
	analise int
);

create table extras(
        et varchar(10),
	pt varchar(200),
	en varchar(200)
);

create table funcoes(
        et varchar(10),
	pt varchar(200),
	en varchar(200)
);

create table formas(
        et varchar(10),
	pt varchar(200),
	en varchar(200)
);

create table ramos(
	id int,
	arvore int not null,
	palavra varchar(120),
	lema varchar(120),
	funcao varchar(10),
	forma varchar(10),
	morfo varchar(20),
	pai int
);

create table ramos_extras(    /* A arvore pode ter vários parametro extra */
	ramo int not null,
	extra varchar(10) not null
);

";

######################### Inserção das tags ################

open RAML, "<descEtiquetas.txt" or die "$!";

my %raml;

#fill extras, formas, funcoes
while (<RAML>){
  if (/^(.+):--$/){
     $act=$1;
     $act="formas" if ($act eq "catpos");
     $act="funcoes" if ($act eq "label");
     $act="extras" if ($act eq "extra");
  }elsif (/^\s+(.+): (.+) \/ (.+)/){
     $et=$1;
     $pt=$2;
     $uk=$3;
     $pt=~s/\&gt\;/>/;
     $pt=~s/\&lt\;/</;
     $uk=~s/\&gt\;/>/;
     $uk=~s/\&lt\;/</;
     print "insert into $act(et, pt, en) values ('$et','$pt','$uk');\n";
  }
}

print "insert into funcoes(et, pt, en) values ('PU','Associado à pontuação','Associated to punctuation');\n";

%handler = ( -outputenc => 'ISO-8859-1',
	     -inputenc => 'ISO-8859-1',
	     -default => sub{$c},
             -type    => {head => ZERO,
			  body => SEQ,
			  corpus => LAST_CHILD,
			  graph => MAP,
			  s => THE_CHILD,
			  nt => THE_CHILD,
			  nt => SEQ,
		          terminals => SEQ,
		          nonterminals => SEQ
			  },
	     s => sub{return {%v, nodo => $c}},
	     t => sub{return {%v}},
	     nt => sub{return {%v, nodo => $c}},
	     edge => sub{return {%v}},
            ); 

$a=dt($filename,%handler);

#print Dumper ($a);  

sub go_deep{
    my ($filho,$pai)=@_;
    my $lv;
    for (my $edg=0; $edg<=$#{@{$a->[$id]->{'nodo'}->{'nonterminals'}->[$filho-500]->{'nodo'}}}; $edg++) {
	$lv=$a->[$id]->{'nodo'}->{'nonterminals'}->[$filho-500]->{'nodo'}->[$edg]->{'idref'};
	print STDERR "$id, $idr, $filho, $pai, $lv, $edg\n" if (!defined($lv));
	$lv=~s/s(\d+)_//;
	$idr++;
	if ($lv>=500){ #Nó não terminal
	    print "insert into ramos (id,arvore,funcao,forma,pai) values ($idr,".($id+1).",'".plcs($a->[$id]->{'nodo'}->{'nonterminals'}->[$filho-500]->{'nodo'}->[$edg]->{'label'})."','".plcs($a->[$id]->{'nodo'}->{'nonterminals'}->[$lv-500]->{'cat'})."',". ($filho==500 ? $idr : $pai).");\n";
	    &go_deep ($lv,$idr);
	}else{        #Nó terminal
	    $a->[$id]->{'nodo'}->{'nonterminals'}->[$filho-500]->{'nodo'}->[$edg]->{'label'}="PU" if ($a->[$id]->{'nodo'}->{'terminals'}->[$lv-1]->{'pos'} eq 'pu'); #Função passa a ser PU
	    print "insert into ramos (id,arvore,funcao,forma,pai,palavra,lema,morfo) values ($idr,".($id+1).",'".plcs($a->[$id]->{'nodo'}->{'nonterminals'}->[$filho-500]->{'nodo'}->[$edg]->{'label'})."','".plcs($a->[$id]->{'nodo'}->{'terminals'}->[$lv-1]->{'pos'})."',$pai,'".plcs($a->[$id]->{'nodo'}->{'terminals'}->[$lv-1]->{'word'})."','".plcs($a->[$id]->{'nodo'}->{'terminals'}->[$lv-1]->{'lemma'})."','".plcs($a->[$id]->{'nodo'}->{'terminals'}->[$lv-1]->{'morph'})."');\n";

	    $ext1=$a->[$id]->{'nodo'}->{'terminals'}->[$lv-1]->{'extra'};
	    $ext2=$a->[$id]->{'nodo'}->{'terminals'}->[$lv-1]->{'extra2'};
	    $ext3=$a->[$id]->{'nodo'}->{'terminals'}->[$lv-1]->{'extra3'};
	    $ext1=~s/\-\-//;
	    $ext2=~s/\-\-//;
	    $ext3=~s/\-\-//;
	    print "insert into ramos_extras (ramo,extra) values ($idr,'$ext1');\n" if (!$ext1 eq '');
	    print "insert into ramos_extras (ramo,extra) values ($idr,'$ext2');\n" if (!$ext2 eq '');
	    print "insert into ramos_extras (ramo,extra) values ($idr,'$ext3');\n" if (!$ext3 eq '');
	}
    }
     return;
}


$idr=0;
$id_excluido=shift @excluido;# if (defined(@excluido));
$contagem_erro=0;
for ($id=0; $id<=$#{@{$a}}; $id++){
    $id_s=$a->[$id]->{'id'};
    $id_s=~s/s(\d+)/$1/;
    if ($id_excluido==$id_s){
	#print STDERR "B$id_s\n";
	$contagem_erro++;
	do{
	    $id_excluido=shift @excluido;
	}while ($id_excluido==$id_s); #para evitar erros na mesma linha
	next;
    }
    $referencia=$a->[$id]->{'ref'};
    $a->[$id]->{'source'}=~/n\=(\d+) (?:cad\=(.+) )?sec\=(.+) sem\=(.+)/;
    $n=$1;
    if (!defined($2)){$cad='';}
    else{$cad=$2;}
    $sec=$3;
    $sem=$4;
    #print STDERR "$1--$2--$3--$4--$5\n";
    $analise=$a->[$id]->{'forest'};
    $texto=$a->[$id]->{'text'};
    $texto=~s/\'/\\\'\\\'\\\'/g;
    print "insert into arvores (id,referencia,analise,n,cad,sec,sem,texto) values (".($id+1).", '$referencia', $analise, $n, '$cad', '$sec','$sem', '".$texto."');\n\n";
    #if (!defined ($referencia)){print STDERR "ref-$id\n";}
    #if (!defined ($analise)){print STDERR "analise-$id\n";}
    #if (!defined ($n)){print STDERR "n-$id\n";}
    #if (!defined ($cad)){print STDERR "cad-$id\n";}
    #if (!defined ($sec)){print STDERR "sec-$id\n";}
    #if (!defined ($sem)){print STDERR "sem-$id\n";}
    &go_deep (500,$idr);
}

#print "commit;\n";

print STDERR "Excluidos : $contagem_erro\n";
