#! /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( exists($DBINFO{$key}) ){
    next;
  }
  $DBINFO{$key} = $line;
}
close(FH);

printf "\@prefix\trdf:\t<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\t.\n";
printf "\@prefix\trdfs:\t<http://www.w3.org/2000/01/rdf-schema#>\t.\n";
printf "\@prefix\tdcterms:\t<http://purl.org/dc/terms/>\t.\n";

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

my $t_collection = "";
my $t_type = "";
my $t_resource = "";
my $t_url = "";

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 $db = (split(/\:/, $e[0]))[0];
  my $id = (split(/\:/, $e[0]))[1];
  my @t_d = split(/\t/, $DBINFO{$db});
  my $t_collection = $t_d[1];
  my $t_type = $t_d[2];
  my $t_resource = $t_d[3];
  my $t_url = $t_d[4];

  $t_url =~ s/\$id/%s/;
  printf "<%s/%s>\trdfs:seeAlso\t<$t_url>\t.\n", $t_type, $id, $id;
  printf "<%s/%s>\trdf:type\t<%s>\t.\n", $t_type, $id, $t_type;
  printf "<%s/%s>\tdcterms:source\t<http://identifiers.org/miriam.collection/%s>\t.\n", $t_type, $id, $t_collection;
  printf "<$t_url>\tdcterms:publisher\t<http://identifiers.org/miriam.resource/%s>\t.\n", $id, $t_resource;

  for(my $i = 0; $i <= $#e; $i++){
    my $db1 = (split(/\:/, $e[$i]))[0];
    my $id1 = (split(/\:/, $e[$i]))[1];

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

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

    $url1 =~ s/\$id/%s/;
    if( $i ne 0 ){
      printf "<%s/%s>\trdfs:seeAlso\t<$url1>\t.\n", $type1, $id1, $id1;
    }

    for(my $j = 0; $j <= $#e; $j++){
      if( $e[$i] eq $e[$j] ){
        next;
      }
      my $db2 = (split(/\:/, $e[$j]))[0];
      my $id2 = (split(/\:/, $e[$j]))[1];

      if( exists($DBINFO{$db2}) ){
        my $type2 = (split(/\t/, $DBINFO{$db2}))[2] if( $DBINFO{$db2} );
        printf "<%s/%s>\trdfs:seeAlso\t<%s/%s>\t.\n", $type1, $id1, $type2, $id2;
      }
    } 
  }
}
