=pod

=head1 FILE FORMAT

See L<EPrints::Plugin::Import::EndNote>

=cut

package EPrints::Plugin::Export::EndNote;

use EPrints::Plugin::Export;
use EPrints;

@ISA = ( "EPrints::Plugin::Export" );

use strict;

sub new
{
	my( $class, %opts ) = @_;
	
	my $self = $class->SUPER::new( %opts );

	$self->{name} = "EndNote";
	$self->{accept} = [ 'list/eprint', 'dataobj/eprint' ];
	$self->{visible} = "all";
	$self->{suffix} = ".enw";
	$self->{mimetype} = "text/plain";

	return $self;
}

sub convert_dataobj
{
	my( $plugin, $dataobj ) = @_;

	my $data = ();

	# 0 Citation type
	my $type = $dataobj->get_type;
	$data->{0} = "Generic";
	$data->{0} = "Book" if $type eq "book";
	$data->{0} = "Book Section" if $type eq "book_section";
	$data->{0} = "Conference Paper" if $type eq "conference_item";
	$data->{0} = "Edited Book" if $type eq "book" && !$dataobj->is_set( "authors" ) && $dataobj->is_set( "editors" );
	$data->{0} = "Journal Article" if $type eq "article";
	$data->{0} = "Patent" if $type eq "patent";
	$data->{0} = "Report" if $type eq "monograph";
	$data->{0} = "Thesis" if $type eq "thesis";

	# D Year
	if( $dataobj->exists_and_set( "date_effective" ) )
	{
		$dataobj->get_value( "date_effective" ) =~ /^([0-9]{4})/;
		$data->{D} = $1;
	}
	# J Journal
	if( $type eq "article" )
	{
		$data->{J} = $dataobj->get_value( "publication" ) if $dataobj->exists_and_set( "publication" );
	}
	# K Keywords
	$data->{K} = $dataobj->get_value( "keywords" ) if $dataobj->exists_and_set( "keywords" );
	# T Title
	$data->{T} = $dataobj->get_value( "title" ) if $dataobj->exists_and_set( "title" );
	# U URL
	$data->{U} = $dataobj->get_url;
	# X Abstract
	$data->{X} = $dataobj->get_value( "abstract" ) if $dataobj->exists_and_set( "abstract" );
	# Z Notes
	$data->{Z} = $dataobj->get_value( "note" ) if $dataobj->exists_and_set( "note" );
	# 9 Thesis Type, Report Type
	$data->{9} = EPrints::Utils::tree_to_utf8( $dataobj->render_value( "monograph_type" ) ) if $dataobj->exists_and_set( "monograph_type" );
	$data->{9} = EPrints::Utils::tree_to_utf8( $dataobj->render_value( "thesis_type" ) ) if $dataobj->exists_and_set( "thesis_type" );

	# A Author	
	if( $dataobj->exists_and_set( "creators" ) )
	{
		foreach my $name ( @{ $dataobj->get_value( "creators" ) } )
		{
			# Family name first
			push @{ $data->{A} }, EPrints::Utils::make_name_string( $name->{main}, 0 );
		}
	}

	# B Conference Name, Department (Thesis), Series (Book, Report), Book Title (Book Section)
	if( $type eq "conference_item")
	{
		$data->{B} = $dataobj->get_value( "event_title" ) if $dataobj->exists_and_set( "event_title" );
	}
	elsif( $type eq "thesis" )
	{
		$data->{B} = $dataobj->get_value( "department" ) if $dataobj->exists_and_set( "department" );
	}
	elsif( $type eq "book" || $type eq "monograph" )
	{
		$data->{B} = $dataobj->get_value( "series" ) if $dataobj->exists_and_set( "series" );
	}
	elsif( $type eq "book_section" )
	{
		$data->{B} = $dataobj->get_value( "book_title" ) if $dataobj->exists_and_set( "book_title" );
	}

	# C Conference Location, Country (Patent), City (Other Types)
	if( $type eq "conference_item")
	{
		$data->{C} = $dataobj->get_value( "event_location" ) if $dataobj->exists_and_set( "event_location" );
	}
	elsif( $type eq "patent" )
	{
		# Unsupported
	}
	else
	{
		$data->{C} = $dataobj->get_value( "place_of_pub" ) if $dataobj->exists_and_set( "place_of_pub" );
	}

	# E Issuing Organisation (Patent), Editor (Other Types)
	if( $type eq "patent")
	{
		$data->{E} = $dataobj->get_value( "institution" ) if $dataobj->exists_and_set( "institution" );
	}
	elsif( $dataobj->exists_and_set( "editors" ) )
	{
		foreach my $name ( @{ $dataobj->get_value( "editors" ) } )
		{
			# Family name first
			push @{ $data->{E} }, EPrints::Utils::make_name_string( $name->{main}, 0 );
		}
	}

	# I Institution (Report), University (Thesis), Assignee (Patent), Publisher (Other Types)
	if( $type eq "monograph" || $type eq "thesis" )
	{
		$data->{I} = $dataobj->get_value( "institution" ) if $dataobj->exists_and_set( "institution" );
	}
	elsif( $type eq "patent" )
	{
		# Unsupported
	}
	else
	{
		$data->{I} = $dataobj->get_value( "publisher" ) if $dataobj->exists_and_set( "publisher" );
	}

	# N Application Number (Patent), Issue (Other Types)
	if( $type eq "patent" )
	{
		# Unsupported
	}
	else
	{
		$data->{N} = $dataobj->get_value( "number" ) if $dataobj->exists_and_set( "number" );
	}	

	# P Number of Pages (Book, Thesis), Pages (Other Types)
	if( $type eq "book" || $type eq "thesis" )
	{
		$data->{P} = $dataobj->get_value( "pages" ) if $dataobj->exists_and_set( "pages" );
	}
	else
	{
		$data->{P} = $dataobj->get_value( "pagerange" ) if $dataobj->exists_and_set( "pagerange" );
	}

	# S Series (Book Section)
	if( $type eq "book_section" )
	{
		$data->{S} = $dataobj->get_value( "series" ) if $dataobj->exists_and_set( "series" );
	}

	# V Patent Version Number, Degree (Thesis), Volume (Other Types)
	if( $type eq "patent" )
	{
		# Unsupported
	}
	elsif( $type eq "thesis" )
	{
		# Unsupported
	}
	else
	{
		$data->{V} = $dataobj->get_value( "volume" ) if $dataobj->exists_and_set( "volume" );
	}

	# @ ISSN (Article), Patent Number, Report Number, ISBN (Book, Book Section)
	if( $type eq "article" )
	{
		$data->{"@"} = $dataobj->get_value( "issn" ) if $dataobj->exists_and_set( "issn" );
	}
	elsif( $type eq "patent" || $type eq "monograph" )
	{
		$data->{"@"} = $dataobj->get_value( "id_number" ) if $dataobj->exists_and_set( "issn" );
	}
	elsif( $type eq "book" || $type eq "book_section" )
	{
		$data->{"@"} = $dataobj->get_value( "isbn" ) if $dataobj->exists_and_set( "issn" );
	}

	# F Label
	$data->{F} = $plugin->{session}->get_repository->get_id . $dataobj->get_id;

	return $data;
}

sub output_dataobj
{
	my( $plugin, $dataobj ) = @_;

	my $data = $plugin->convert_dataobj( $dataobj );

	my $out;
	foreach my $k ( sort keys %{ $data } )
	{
		if( ref( $data->{$k} ) eq "ARRAY" )
		{
			foreach( @{ $data->{$k} } )
			{
				$out .= "%$k " . remove_utf8( $_ ) . "\n";
			}
		} else {
			$out .= "%$k " . remove_utf8( $data->{$k} ) . "\n";
		}
	}
	$out .= "\n";

	return $out;
}

sub remove_utf8
{
	my( $text, $char ) = @_;

	$char = '?' unless defined $char;

	$text = "" unless( defined $text );

	my $stringobj = Unicode::String->new();
	$stringobj->utf8( $text );
	my $escstr = "";

	foreach($stringobj->unpack())
	{
		if( $_ < 128)
		{
			$escstr .= chr( $_ );
		}
		else
		{
			$escstr .= $char;
		}
	}

	return $escstr;
}

1;
