package ConclaveOntologyBrowser;
use Dancer ':syntax';

use Conclave::Utils::OTK;
use Cwd;
use Data::Dumper;

our $VERSION = '0.1';

our $HOME = '/home/smash/conclave-website-root';
our $OWLROOT = "$HOME/owl";

hook before_template => sub {
    my $tokens = shift;
    my $path = request->base->path;
    $tokens->{uri_base} = $path eq '/' ? $path : $path.'/';
};

get '/' => sub {
  my @packages = __package_list($OWLROOT);

  template 'index' => { packages =>[@packages] };
};

get '/package/:pkgid' => sub {
  my $pkgid = param 'pkgid';
  my @available = __package_available_list($OWLROOT,$pkgid);

  my $onto = shift @available;

  redirect "/package/$pkgid/$onto";
};

get '/package/:pkgid/:onto' => sub {
  my $pkgid = param 'pkgid';
  my $onto = param 'onto';
  my @packages = __package_list($OWLROOT);
  my @available = __package_available_list($OWLROOT,$pkgid);

  my $hash;
  my $o = Conclave::Utils::OTK->new($pkgid, $onto);
  my @classes = $o->get_classes;
  foreach (@classes) {
    $hash->{$_} = [ $o->get_instances($_) ];
  }
  my $tree = $o->get_class_tree;

  template 'package' => { pkgid => $pkgid, packages => [@packages], onto => $onto, available => [@available], tree=>$tree, hash=>$hash };
};

post '/instances' => sub {
  my $pkgid = param 'pkgid';
  my $onto = param 'onto';
  my $class = param 'class';
  $class =~ s/^<//;
  $class =~ s/>$//;

  my $name = $class;
  $name =~ s/.*?#//;

  my $o = Conclave::Utils::OTK->new($pkgid, $onto);
  my @instances = $o->get_instances($class);

  template 'instances' => { name=>$name, class=>$class, instances=>[@instances]}, { layout=>undef };
};

post '/properties' => sub {
  my $pkgid = param 'pkgid';
  my $onto = param 'onto';
  my $instance = param 'instance';
  $instance =~ s/^<//;
  $instance =~ s/>$//;

  my $o = Conclave::Utils::OTK->new($pkgid, $onto);
  my @obj_props = $o->get_obj_props($instance);
  my %data_props = $o->get_data_props($instance);

  my %ranges = $o->get_ranges;

  foreach (@obj_props) {
    $_->{dc} = shift [ $o->get_instance_classes($_->{d}) ]; # FIXME
  }

  my $class = shift [ $o->get_instance_classes($instance) ]; # FIXME

  template 'properties' => { instance=>$instance, class=>$class, obj_props=>[@obj_props], data_props=>{%data_props}, ranges=>{%ranges} }, { layout=>undef };
};

post '/getClass' => sub {
  my $pkgid = param 'pkgid';
  my $onto = param 'onto';
  my $instance = param 'instance';
  #$instance =~ s/^<//;
  #$instance =~ s/>$//;

  my $o = Conclave::Utils::OTK->new($pkgid, $onto);
  my @classes = $o->get_classes($instance);

  content_type 'text/plain';
  return "zbr";
};

sub __package_list {
  my $root = shift;

  my @packages;
  opendir(my $dh, $root) or die "can't opendir $root: $!";
  while(readdir $dh) {
    next if $_ =~ m/^\.{1,2}$/;
    next unless -d "$root/$_";

    push @packages, $_;
  }
  closedir $dh;

  return @packages;
}

sub __package_available_list {
  my ($root, $pkgid) = @_;

  my %available;
  opendir(my $dh, "$root/$pkgid") or die "can't opendir $root/$pkgid: $!";
  while(readdir $dh) {
    next if $_ =~ m/^\.{1,2}$/;

    $_ =~ s/\..*?$//;
    $available{$_}++;
  }
  closedir $dh;

  return keys %available;
}

true;
