#! /usr/bin/env perl

use strict;
use warnings;
use File::Basename;
use File::Path;
use Cwd 'getcwd';

my $dbxl = $ARGV[0];
use Cwd 'abs_path';
$dbxl = abs_path($dbxl);

my $CWD=dirname(${0});
chdir $CWD;
$CWD=getcwd;
my $PWD=dirname($CWD);
my $ESROOT=$PWD;

my %DBINFO=();
my $miriam = $ESROOT . "/data/table/miriam.tab";
open(FH, $miriam);
while(my $line = <FH>){
  chomp($line);
  my $key = (split(/\t/, $line))[0];
  if( $key eq 'uniprot' && $line !~ /purl/ ){
    next;
  }
  if( exists($DBINFO{$key}) ){
    next;
  }
  $DBINFO{$key} = $line;
}
close(FH);

my %prefix=();
open(FH, $dbxl);
while(my $line = <FH>){
  chomp($line);
  my $e1 = (split(/\t/, $line))[0];
  my $e2 = (split(/\t/, $line))[1];
  my ($db1, $id1) = ($e1 =~ /(\w+):(.*)$/);
  my ($db2, $id2) = ($e2 =~ /(\w+):(.*)$/);
  $prefix{$db1} = "";
  $prefix{$db2} = "";
}
close(FH);

printf "\@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n";
printf "\@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n";
printf "\@prefix dcterms: <http://purl.org/dc/terms/> .\n";
printf "\@prefix idoo: <http://rdf.identifiers.org/ontology/> .\n";

foreach my $p (keys %prefix){
  if(exists($DBINFO{$p})){
    printf "\@prefix id-%s: <%s/> .\n", $p, (split(/\t/, $DBINFO{$p}))[2];
  }
}

my $target = "";
my $db = "";
my $id = "";

my @entry=();
my $i = 0;
open(FH, $dbxl);
while(my $line = <FH>){
  chomp($line);
  my $e1 = (split(/\t/, $line))[0];
  my $e2 = (split(/\t/, $line))[1];
  if( $target eq $e1 ){
    $entry[$i] = $e2;
    $i++;
  }else{
    if( ! $target ){
      $entry[0] = $e1;
      $entry[1] = $e2;
      $i = 2;
      $target = $e1;
      next;
    }

    if( $#entry >= 0 ){
      &print_ttl(@entry);
    }

    @entry = ();
    $entry[0] = $e1;
    $entry[1] = $e2;
    $i = 2;
    $target = $e1;
  }
}
close(FH);
sub print_ttl(){
  my @e = @_;
  my ($db1, $id1) = ($e[0] =~ /(\S+):(.*)$/);

  my @d = split(/\t/, $DBINFO{$db1}) if( $DBINFO{$db1} );
  my $collection1 = $d[1];
  my $type1 = $d[2];
  my $resource1 = $d[3];
  my $url1 = $d[4];

  if( ! exists($DBINFO{$db1}) ){
    printf STDERR "%s\n", $db1;
    return;
  }

  $url1 =~ s/\$id/%s/;
  printf "id-%s:%s rdfs:seeAlso <$url1> .\n", $db1, $id1, $id1;
  printf "id-%s:%s idoo:database <%s> .\n", $db1, $id1, $type1;

  for(my $j = 1; $j <= $#e; $j++){
    my ($db2, $id2) = ($e[$j] =~ /(\S+):(.*)$/);
    my @d = split(/\t/, $DBINFO{$db2}) if( $DBINFO{$db2} );
    my $collection2 = $d[1];
    my $type2 = $d[2];
    my $resource2 = $d[3];
    my $url2 = $d[4];

    if( exists($DBINFO{$db2}) ){
      $url2 =~ s/\$id/%s/;
      printf "id-%s:%s rdfs:seeAlso id-%s:%s .\n", $db1, $id1, $db2, $id2;
      printf "id-%s:%s rdfs:seeAlso <$url2> .\n", $db2, $id2, $id2;
      printf "id-%s:%s idoo:database <%s> .\n", $db2, $id2, $type2;
    }
  }
}
