#! /usr/bin/env perl

use Getopt::Long;

my $graph = "<http://togogenome.org/graph/edgestore/>";
my $uri = "";
my @dbs = ();
my $todb = "";
my $opt_help = "";

GetOptions('uri=s' => \$uri, 'db=s' => \@dbs, 'to=s' => \$todb, 'help' => \$opt_help );

if( $opt_help || ! $uri ){
  printf STDERR "%s --uri \"<URI>\" [--db \"dbname\" [--db \"dbname\" [...]]] [--to \"dbname\"] [--help]\n", $0;
  exit(0);
}

my $SPARQL="";
my $i=0;
if( $#dbs < 0 ){
  $SPARQL="SPARQL SELECT ?link\n";
  $SPARQL.="WHERE {\n";
  $SPARQL.=sprintf("%2s"," ") . sprintf("GRAPH %s\n", $graph);
  $SPARQL.=sprintf("%2s"," ") . "{\n";
  if( $todb ){
    $SPARQL.=sprintf("%4s"," ") . sprintf("?miriam rdfs:label \"%s\" .\n", $todb);
  }
  $SPARQL.=sprintf("%4s"," ") . "$uri rdfs:seeAlso ?link .\n" ;
  if( $todb ){
    $SPARQL.=sprintf("%4s"," ") . "?link rdf:type ?miriam\n";
  }else{
    $SPARQL.=sprintf("%4s"," ") . sprintf("FILTER(?link != %s)\n", $uri);
  }
  $SPARQL.=sprintf("%2s"," ") . "}\n";
  $SPARQL.="};\n";
}else{
  $SPARQL=sprintf("SPARQL SELECT ?link%d\n", $#dbs+1);
  $SPARQL.="WHERE {\n";
  $SPARQL.=sprintf("%2s"," ") . sprintf("GRAPH %s\n", $graph);
  $SPARQL.=sprintf("%2s"," ") . "{\n";
  foreach $db (@dbs){
    $SPARQL.=sprintf("%4s"," ") . sprintf("?miriam%d rdfs:label \"%s\" .\n", $i, $db);
    $i++;
  }
  if( $todb ){
    $SPARQL.=sprintf("%4s"," ") . sprintf("?miriam%d rdfs:label \"%s\" .\n", $i, $todb);
  }
  $SPARQL.=sprintf("%4s"," ") . sprintf("%s rdfs:seeAlso ?link0 .\n", $uri);
  $SPARQL.=sprintf("%4s"," ") . sprintf("?link0 rdf:type ?miriam0 .\n");
  $SPARQL.=sprintf("%4s"," ") . sprintf("?link0 rdfs:seeAlso ?link1 .\n");
  for($i=1; $i<=$#dbs; $i++){
    $SPARQL.=sprintf("%4s"," ") . sprintf("?link%d rdf:type ?miriam%d .\n", $i, $i);
    $SPARQL.=sprintf("%4s"," ") . sprintf("?link%d rdfs:seeAlso ?link%d .\n", $i, $i+1);
  }
  if( $todb ){
    $SPARQL.=sprintf("%4s"," ") . sprintf("?link%d rdf:type ?miriam%d .\n", $i, $i);
  }else{
    $SPARQL.=sprintf("%4s"," ") . sprintf("FILTER(?link%d != %s)\n", $i, $uri);
  }
  $SPARQL.=sprintf("%2s"," ") . "}\n";
  $SPARQL.="};\n";
}
print $SPARQL;
