#!/usr/bin/perl

our $MAXSIZE = 1 * 1024 * 1024;

use EPrints;

my $repo = EPrints->new->current_repository;
exit if !defined $repo;

my $r = $repo->get_request;

my $uri = URI::http->new( $r->unparsed_uri );
my %q = $uri->query_form;

my $json;
$r->read( $json, $MAXSIZE + 1 );
EPrints->abort( "JSON read limit reached" ) if length($json) > $MAXSIZE;
utf8::upgrade( $json );

my $input = JSON::decode_json( $json );

EPrints->abort( "Expected HASH but got ".ref($input) ) if ref($input) ne "HASH";

my $textonly = $q{textonly};

my %phrases;

while(my( $phraseid, $pins ) = each %$input)
{
	$pins = {} if ref($pins) ne "HASH";
	if( $textonly )
	{
		$phrases{$phraseid} = $repo->phrase( $phraseid, %$pins );
	}
	else
	{
		for(values(%$pins))
		{
			my $doc = eval { $repo->xml->parse_string( $_ ) };
			if( defined $doc )
			{
				$_ = $repo->xml->clone( $doc->documentElement );
				$repo->xml->dispose( $doc );
			}
			else
			{
				$_ = $repo->xml->create_text_node( $_ );
			};
		}
		my $xml = $repo->html_phrase( $phraseid, %$pins );
		$phrases{$phraseid} = $repo->xhtml->to_xhtml( $xml );
		$repo->xml->dispose( $xml );
	}
}

$r->content_type( "application/json" );
binmode( STDOUT, ":utf8" );
print JSON::encode_json( \%phrases );
