<?php 
session_start();
$pTipoUtilizador = $_SESSION['tipoUtilizador'];
if ($pTipoUtilizador=="anonymous" || $pTipoUtilizador=="regular") { // separa por tipo de utilizador
  require('headersubUsers.inc');
  require('menusubUsers.inc');
  echo "<meta http-equiv='refresh' content='0; url=../users.php' />";
  exit;  // os anonimos não têem acesso a esta página
}
else {
  require('headersubAdmins.inc');
  require('menusubAdmins.inc');
}
?>

<?php
echo "<meta http-equiv='refresh' content='2; url=insertUpdateGeoThms.php' />\n";
?>

<center>
<h3 class="maketitle">Geometric theorems - Insert a New Theorem</h3>
</center>

<hr/>



<?php
require('loginsub.php');
?>

<?php

// Obtêm os valores do formulário.
$pTeoId            = $_POST['TeoId'];
$pDateSubmission   = $_POST['DateSubmission'];
$pUserId           = $_POST['UserId'];
$pDrwIdNameVersion = $_POST['DrwIdNameVersion'];
$pBibrefDrw        = $_POST['BibrefDrw'];
$pCodeDrw          = $_POST['CodeDrw'];
$pPrvIdNameVersion = $_POST['PrvIdNameVersion'];
$pBibrefPrv        = $_POST['BibrefPrv'];
$pCodePrv          = $_POST['CodePrv'];


// Como obter de um campo múltipo os valores individuais através de exp. reg.

// DrawerId
preg_match("§([A-Za-z0-9 _.]+) -- ([A-Za-z0-9 _.]+) -- ([A-Za-z0-9 _.]+)§",$pDrwIdNameVersion,$matches);

$pDrawerId = $matches[1];

// ProverId
preg_match("§([A-Za-z0-9 _.]+) -- ([A-Za-z0-9 _.]+) -- ([A-Za-z0-9 _.]+)§",$pPrvIdNameVersion,$matches);

$pPrvId = $matches[1];

// Formata os valores para posterior inserção na Tabela
if (!get_magic_quotes_gpc())
  { //    $pNumeroIdentificacao = addslashes($pNumeroIdentificacao);
    $pTeoId           = addslashes($pTeoId);
    $pDateSubmission  = addslashes($pDateSubmission);
    $pUserId          = addslashes($pUserId);
    $pDrawerId        = addslashes($pDrawerId);	 
    $pBibrefDrw       = addslashes($pBibrefDrw);
    $pCodeDrw         = addslashes($pCodeDrw);
    $pPrvId           = addslashes($pPrvId);
    $pBibrefPrv       = addslashes($pBibrefPrv);
    $pCodePrv         = addslashes($pCodePrv);
  }


// Insere os dados genéricos da figura 

// No caso das figuras o processamento ainda não é feito em ficheiros
// separados.


// Inicio da transaccao
@ mysql_query("BEGIN");


$sqlInsertFigure = 
     "INSERT INTO figures
       (teoId,drawerId,code,dateSubmission,bibref,userId)
      VALUES 
       ('$pTeoId','$pDrawerId','$pCodeDrw','$pDateSubmission','$pBibrefDrw',
        '$pUserId')";


$resultadoInsertFigure = mysql_query($sqlInsertFigure,$ligacao);

if (!$resultadoInsertFigure) {
  // Transações - ROLLBACK
  @ mysql_query("ROLLBACK");
  echo "Error - Figure, generic data";
  echo "<meta http-equiv='refresh' content='5; url=insertUpdateGeoThms.php' />\n";
  exit;
}

echo "<p>Processing the figure - Please wait</p>";

// Vai criar o ficheiro jpeg com a figura para guardar na base de dados.

// Escreve o ficheiro "txt" referente ao código
// começa por apagar os ficheiros anteriores
// 
// Os nomes dos ficheiros tem apenso o identificador de utilizador
// para desta forma permitir a escrita de ficheiros por mais do que um
// utilizador ao mesmo tempo.

$vNameCode = 'figure'.$pUserId.'.code';
$vNameErr = 'figure'.$pUserId.'.err';
$vNameErrors = 'figure'.$pUserId.'.errors';
$vNamePIC = 'figure'.$pUserId.'.pic';
$vNameTeX = 'figure'.$pUserId.'.tex';
$vNameDVI = 'figure'.$pUserId.'.dvi';
$vNamePS = 'figure'.$pUserId.'.ps';
$vNameEPSI = 'figure'.$pUserId.'.epsi';
$vNameJPG = 'figure'.$pUserId.'.jpg';

ob_start();
print $pCodeDrw."\n";
$texfile=fopen($vNameCode,"w");
fwrite($texfile,ob_get_contents()); 
fclose($texfile); 
ob_end_clean(); 

// Vai processar o código com o programa de desenho
// Consoante o programa de desenho
// 2 - Eukleides - 1.0.2
// 3 - GCLC - 5.00
ob_start();
if ($pDrawerId==2) 
  system("/usr/local/bin/eukleides $vNameCode > $vNamePIC 2> $vNameErr");
elseif ($pDrawerId==3) {
  system("/usr/local/bin/gclc $vNameCode $vNamePIC > $vNameErrors");
  system("grep Syntax $vNameErrors > $vNameErr");
}

ob_end_clean(); 

$filename = $vNameErr;

// Vai verificar se houve erros ou não
if  (file_exists($filename) and filesize($filename)>0) { // há erros 
  $file = fopen ($filename, "r");
  $contents = fread ($file, filesize ($filename));
  echo $contents;
  //system("rm figure.err");
  // Transações - ROLLBACK
  @ mysql_query("ROLLBACK");
  echo "<center>\n";
  echo "<br>There are errors in the figure's code. The figure was not inserted in the database</b>\n";
  echo "</center>\n";
  echo "<meta http-equiv='refresh' content='5; url=insertUpdateGeoThms.php' />\n";
 }
 else { // Caso não haja erros vai processar a figura
   // Vai produzir o texto LaTeX referente à Figura
   ob_start();
   print "\documentclass[11pt]{article}\n";
   if ($pDrawerId==2)
     print "\usepackage{pstricks}\n";
   elseif ($pDrawerId==3) 
     print "\usepackage{gclc}\n";
   print "\pagestyle{empty}\n";
   print "\begin{document}\n";
   print "\input{ $vNamePIC }\n";
   print "\end{document}\n";
   
   $texfile=fopen($vNameTeX,"w");
   fwrite($texfile,ob_get_contents()); 
   fclose($texfile); 
   
   $vNameTeX = 'figure'.$pUserId.'.tex';
   $vNameDVI = 'figure'.$pUserId.'.dvi';
   $vNamePS = 'figure'.$pUserId.'.ps';
   $vNameEPSI = 'figure'.$pUserId.'.epsi';
   $vNameJPG = 'figure'.$pUserId.'.jpg';

   system("latex $vNameTeX"); 
   system("dvips $vNameDVI -o $vNamePS"); 
   system("ps2epsi $vNamePS $vNameEPSI");
   system("convert $vNameEPSI $vNameJPG");
   ob_end_clean();    
   
   // Agora vai produzir os ficheiros XML e SVG  - para já só para o GCLC
   
   $vNameXML = 'figure'.$pUserId.'.xml';
   $vNameXMLaux = 'fig'.$pUserId.'.xml';
   
   $vNameSVG = 'figure'.$pUserId.'.svg';

   ob_start();   
   if ($pDrawerId==2) { // No caso do Eukleides deixa o ficheiro XML em branco 
     system("rm $vNameXML"); 
     system("cat ' ' > $vNameXML"); 
     system("rm $vNameSVG"); 
     system("cat ' ' > $vNameSVG"); 
     // ainda tenho de resolver os problemas com o eps2svg à conta da
     // dependência do X11 será necessário recorrer a um "emulador" de
     // X11 em memória...
     //system("eps2svg $vNameEPSI");
   }
   elseif ($pDrawerId==3) {
     // primeiro cria o XML correspondente ao GCLC
     system("/usr/local/bin/gclc $vNameCode $vNameXML -xml");
     // depois faz o "rendering" do XML em linguagem natural
     // modifica o estilo de saída para a Natural Language
     system("sed -e 's/GeoConsHTML.xsl/GeoConsNL.xsl/g' $vNameXML > $vNameXMLaux"); 
     // agora cria o SVG correspondente ao GCLC
     system("/usr/local/bin/gclc $vNameCode $vNameSVG -svg");    
   }
   ob_end_clean(); 
  
  
   // e agora a escrita do ficheiro referente à imagem
   $fpJPG   = fopen($vNameJPG, 'r');
   $contentJPG = fread($fpJPG, filesize($vNameJPG));
   $contentJPG = addslashes($contentJPG);
   fclose($fpJPG);
   
   // e do ficheiro XML
   $fpXML = fopen($vNameXMLaux,'r');
   $contentXML = fread($fpXML,filesize($vNameXMLaux));
   $contentXML = addslashes($contentXML);
   fclose($fpXML);
   
   // e do ficheiro SVG
   $fpSVG = fopen($vNameSVG,'r');
   $contentSVG = fread($fpSVG,filesize($vNameSVG));
   $contentSVG = addslashes($contentSVG);
   fclose($fpSVG);
   
   // e agora a inserção dos três

   $sqlLastInsert = "SELECT LAST_INSERT_ID()";
   $resultadoLastInsert = mysql_query($sqlLastInsert,$ligacao);
   $linha = mysql_fetch_assoc($resultadoLastInsert);
   $pFigureIdLast = $linha['LAST_INSERT_ID()'];
   
   $sqlfigure = "UPDATE figures
                    SET codeXML = '$contentXML',
                        figure = '$contentJPG',
                        figureSVG = '$contentSVG'
                  WHERE figureId = $pFigureIdLast";
   
   $resultadofigure = mysql_query($sqlfigure,$ligacao);
   
   if (!$resultadofigure) {
     // Transações - ROLLBACK
     @ mysql_query("ROLLBACK");
     echo "Error - figure not inserted";
     echo "<meta http-equiv='refresh' content='2; url=insertUpdateGeoThms.php' />\n";
     exit;
   }
 }   

// Fim - inserção da figura 
// Está tudo bem - Termina a transacção.
@mysql_query("COMMIT");


// Inserção da Prova


// Começa-se por introduzir os dados gerais e depois vai-se, provador a
// provador, processar a prova e fazer a inserção desta. Se Houver
// Erros É Necessário Desfazer (I.E. Transações) A Inserção Já Efectuada,
// só no caso de tudo correr bem é que se fecha a Transação

// Inicio da transaccao
@ mysql_query("BEGIN");

// Inserção dos dados gerais

// esta modificação de nomes é para poder usar inalterado os ficheiros
// de inserção das provas
$pCode=$pCodePrv;
$pBibref=$pBibrefPrv;

$sqlInsertProof =  "INSERT INTO demonstrations
                        (teoId,proverId,code,dateSubmission,bibref,userId)
                    VALUES 
                       ('$pTeoId','$pPrvId','$pCode','$pDateSubmission','$pBibref',
                       '$pUserId')";


$resultadoInsertProof = mysql_query($sqlInsertProof,$ligacao);


if (!$resultadoInsertProof) {
  echo 'Error - Proof not inserted!';
  // TRANSAÇÕES - ROLLBACK
  @ mysql_query("ROLLBACK"); 
  echo "<meta http-equiv=\"refresh\" content=\"2; url=../forms.php\" />";
  exit;
}

// Obtêm o valor do demId
$sqlLastInsert = "SELECT LAST_INSERT_ID()";
$resultadoLastInsert = mysql_query($sqlLastInsert,$ligacao);
$linhaLastInsert = mysql_fetch_assoc($resultadoLastInsert);
$pDemId=$linhaLastInsert['LAST_INSERT_ID()'];


// começa por apagar o resultado anterior


$vNameParaApagar     = 'proof'.$pUserId.'.*';
system("rm $vNameParaApagar");


echo "<p>Processing the proof, please wait</p>\n";
flush(); // limpa o buffer de saída para ter a certeza de que a
	 // mensagem anterior é mostrada

// O restante processamento é dependente do provador escolhido os
// ficheiros que processam as Provas são os mesmos que no caso de se
// tratar somente da inserção da prova (sem figura)

if ($pPrvId==2) { // GCLCprover
  echo "<p>GCLCprover -- Processing, please wait";
  flush(); 
  require('iInsertPrfGeoThmGCLCprover.php');
}
elseif ($pPrvId==3) { // GCLCprover+euk2gclc 
  // ---> tenho de ver isto com mais cuidado
  echo "GCLCprover+euk2gclc -- Processing, please wait";
  flush(); 
  require('iInsertPrfGeoThmGCLCproverEuk.php');
}
elseif ($pPrvId==4) { //Coq+JNarboux (por antecipação)
  echo "Coq+Area Method (by J. Narboux) -- Processing, please wait";
  flush(); 
  require('iInsertPrfGeoThmCoqJN.php');
}

// está tudo bem volta à página dos formulários

echo "<p>Proof inserted</p>";
//echo "<meta http-equiv=\"refresh\" content=\"2; url=../forms.php\" />";





// Não sei se este "if" é significativo - XXX
if ($resultadoInsertProof && $resultadoInsertFigure) {
  echo 'New Figure & Proof Inserted.'; 
 }
 else {
   if ($resultadoInsertFigure)
     echo 'New Figure Inserted.'; 
   else {
     echo 'Error - Figure not inserted!';
     echo "<meta http-equiv='refresh' content='2; url=insertUpdateGeoThms.php' />\n";
     exit;
   }
   if ($resultadoInsertProof)
     echo 'New Proof Inserted.'; 
   else {
     echo 'Error - Proof not inserted!';
     echo "<meta http-equiv='refresh' content='2; url=insertUpdateGeoThms.php' />\n";
     exit;
   }
 }
?>


<hr/>

<p>&nbsp;</p>

<?php
  require('footer.inc');
?>
