#!/usr/bin/perl -w -I/opt/eprints2/perl_lib

use EPrints::Session;

use Text::BibTeX;
use Text::BibTeX::Name;

use strict;




my $session = new EPrints::Session( 0 );
exit( 1 ) unless( defined $session );

my $timeout = 180;
local $SIG{ALRM} = sub { $session->terminate;  die "alarm; bibimport timed out after $timeout seconds.\n" }; # NB: \n required
alarm $timeout;

if( $session->param( 'bibtex' ) )
{
	my( $eprint, $error ) = bibtex2eprint( $session, $session->param( 'bibtex' ) );
	if( !defined $eprint )
	{
		$session->build_page( 
			$session->make_text( "Make EPrint from BibTeX" ),
			$session->make_text( "Error parsing BibTeX entry: ".$error ) );
		$session->send_page();
	}
	else
	{	
		my $url = '/perl/users/submit?eprintid='.$eprint->get_id.'&_action_edit=1';
		$session->redirect( $url );
	}
}
else
{
	my $page = $session->make_doc_fragment;
	my $p = $session->make_element( "p" );
	$p->appendChild( $session->make_text( "Cut and paste a single bibtex entry into the box to create an eprint from it." )) ;
	$page->appendChild( $p );
	my $form = $session->render_form( "post", "bibimport" );
	my $textarea = $session->make_element( "textarea", name=>"bibtex", wrap=>"virtual", rows=>20, cols=>60 );
	$textarea->appendChild( $session->make_text("") );
	$form->appendChild( $textarea );
	$form->appendChild( $session->make_element( "br" ));
	$form->appendChild( $session->make_element( "input", type=>"submit" ));
	$page->appendChild( $form );

	$session->build_page( 
		$session->make_text( "Make EPrint from BibTeX" ),
	$page );
	$session->send_page();
}
$session->terminate();
exit;

sub bibtex2eprint
{
	my( $session, $bibtex ) = @_;

	my $entry= new Text::BibTeX::Entry $bibtex;

	if( ! EPrints::Utils::is_set( $entry ) || ! $entry->parse_ok )
	{
		my $tmpfile = '/tmp/bad_bibtex.'.$$;
		open( BIBDUMP, '>'.$tmpfile );
		print BIBDUMP $bibtex;
		close BIBDUMP;

		my $exe = "perl -e 'use Text::BibTeX; \$file = new Text::BibTeX::File \"$tmpfile\"; new Text::BibTeX::Entry \$file;' 2>&1";
		my $error = `$exe`;
		$error =~ s/^[^,]*,//;

		unlink( $tmpfile );
		return( undef, $error );
	}

   	my $data = {};
	$data->{userid} = $session->current_user->get_value( "userid" );
	$data->{bibtype} = $entry->type;
	$data->{bibkey} = [ $entry->key ];

	# note: 'pages' and 'year' are now handled seperately
	# below.
	foreach(   
		'title', 
		'abstract', 
		'pind', 
		'publisher', 
		'school', 
		'series', 
		'volume', 
		'institution',
		'organization',
		'chapter',
		'edition',
		'issn', 
		'isbn', 
		'note', 
		'number', 
		'keywords', 
		'address' )
	{
		$data->{$_} = bibclean($entry->get($_));
	}

	# put the pages in the correct fields.  
	if (defined $entry->get('pages')) {
           my $t = $entry->get('pages');
           if ($t =~ m/(\d+)-+(\d+)/) {
               $data->{'pagerange'}=$1."-".$2;
           } else {
               $data->{'pages'} = $t;
           }
       }

	
	my $url = $entry->get('url');
	my $urltype = $entry->get('urltype');
	if( defined $url )
	{
		$data->{altloc} = [ $url ];
	}
	
	my $month = $entry->get('month');
	if( defined $month )
	{
		$data->{month} = "\L$month";
	}

	# puts 'year' in the correct field.
	my $year = $entry->get('year');
	if( defined $year )
	{
		$data->{date_issue} = "$year";
	}

	
	my $groups = $entry->get('groups');
	if( defined $groups )
	{
		$groups =~ m/ecs:(.*)/;
		$data->{groups} = [ 'group-'.$1 ];
	}
	
	$data->{publication} = bibclean($entry->get('booktitle'));
	if( !defined $data->{publication} ) 
	{ 
		$data->{publication} = bibclean($entry->get('journal'));
	}
	
	$data->{confloc} = bibclean($entry->get('location'));
	
	foreach my $ae ( 'author', 'editor' )
	{
		$data->{$ae.'s'} = [];
		my $names = $entry->get($ae);
		next unless defined $names;
		foreach( split( " and ",  $names ))
		{
			s/~/ /g;
   			my $name = new Text::BibTeX::Name( $_ );
			push @{$data->{$ae.'s'}}, { id=>'', main=>{ given=>bibclean(join(' ',$name->part( "first" ))), family=>bibclean(join( ' ', $name->part( "last" ))) } };
		}
	}

	# work on old AND new metadata scheme
	$data->{creators} = $data->{authors};	
	

	my $ds = $session->get_archive->get_dataset( "inbox" );
	my $eprint = EPrints::EPrint::create( $session, $ds, $data );

	if( defined $url )
	{
		my $doc = EPrints::Document::create( $session, $eprint );
		if( $urltype =~ m/^html|pdf|ps|ascii|ppt|msword|other|coverimage$/ )
		{
			$doc->set_format( $urltype );
		}
		else
		{
			$doc->set_format( "other" );
		}
		$doc->set_value( "security" , "" );
		$doc->upload_url( $url );
		$doc->commit();
	}

	return $eprint;
}


sub bibclean
{
	my( $text ) = @_;

	return unless defined $text;

	$text =~ s/[{}]//g;
	$text =~ s/\\(.)/$1/g;

	return $text;
}

