package WebApp;
use Dancer ':syntax';

use Cwd;
use File::Slurp qw/slurp/;
use File::Basename;
use File::Path qw/make_path/;

our $VERSION = '0.1';

my $EXDIR = '/home/smash/playground/natura.svn.main/Conclave/libclang/WebApp/examples';
my $UPDIR = '/home/smash/playground/natura.svn.main/Conclave/libclang/WebApp/uploads';

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

get '/' => sub {
  redirect '/view';
};

get '/view' => sub {
  my $file = session 'file';
  my ($source, $res, $data);

  if ($file) {
    my $example = session 'example';
    print STDERR "View file $file\n";
    
    my $curr = getcwd;
    $example ? chdir $EXDIR : chdir $UPDIR;
    $res = `/home/smash/llvm/Debug+Asserts/bin/clang-conclave $file`;
    my @lines = split /\n/, $res;
    @lines = grep(!/^#/, @lines); 
    foreach (@lines) {
      push @$data,  [split /,/, $_];
    }
    $source = slurp $file;
    chdir $curr;
  }

  template 'view' => {active=>'view', source=>$source, data=>$data, filename=>$file};
};

post '/upload' => sub {
  my $file = request->upload('upload_file');
  $file->copy_to($UPDIR.'/'.$file->filename);

  session 'file' => $file->filename;
  session 'example' => 0;
  redirect '/view';
};

get '/upload' => sub {
  template 'upload' => {active=>'upload'};
};

get '/examples' => sub {
  template 'examples' => {active=>'examples'};
};

get '/examples/:file' => sub {
  my $file = param('file');
  print STDERR "Load example $file\n";

  session 'file' => $file;
  session 'example' => 1;
  redirect '/view';
};

get '/ws' => sub {
  template 'ws' => {active=>'ws'};
};

post '/ws' => sub {
  my $file = request->upload('upload_file');
  content_type 'text/plain';

  return "file not found" unless $file;
  my $filename = $file->filename;
  $filename =~ s/.*?\///;
  make_path($UPDIR.'/'.dirname($filename));
  $file->copy_to($UPDIR.'/'.$filename);

  my $curr = getcwd;
  chdir $UPDIR;
  my $res = `/home/smash/llvm/Debug+Asserts/bin/clang-conclave $filename`;
  chdir $curr;

  return $res;
};

true;
