#!/usr/bin/perl -w

use strict;
use Text::BibTeX;

my $preserve_values = 1;

my $destfile = $ARGV[0];
my @srcfiles = @ARGV[1..$#ARGV];

my %macros  = ();
my %regular = ();

die "No destination file\n" unless $destfile;
die "No input files\n" unless @srcfiles;

foreach my $bibfile(@srcfiles)
{
    print "Processing $bibfile\n";
    $bibfile = new Text::BibTeX::File $bibfile or die "$bibfile: $!\n";
    $bibfile->preserve_values($preserve_values);
    
    while (my $entry = new Text::BibTeX::Entry $bibfile)
    {
	next unless $entry->parse_ok;
	next if $entry->metatype eq BTE_COMMENT || $entry->metatype eq BTE_PREAMBLE;
	
	if ($entry->metatype eq BTE_REGULAR)
	{
	    my $key0 = $entry->key;
	    my $key  = lc $key0;
	    $regular{$key} = {} unless defined $regular{$key};
	    $regular{$key}->{__key} = $key0 unless defined $regular{$key}->{__key};
	    $regular{$key}->{__type} = $entry->type
		if !defined $regular{$key}->{__type} || $entry->type eq 'article';
	    my @fields = $entry->fieldlist;
	    foreach my $field(@fields)
	    {
		my $value = $entry->get($field);
		$regular{$key}->{$field} = $value 
		    unless defined $regular{$key}->{$field} &&
		    length join(' ', map($_->text, $value->values)) <
		    length join(' ', map($_->text, $regular{$key}->{$field}->values));
	    }
	}
	elsif ($entry->metatype eq BTE_MACRODEF)
	{
	    my @fields = $entry->fieldlist;
	    foreach my $field(@fields)
	    {
		my $value = $entry->get($field);
		$macros{$field} = $value
		    unless defined $macros{$field} && length $macros{$field} > length $value;
	    }
	}
	else
	{
	    $entry->warn('Unknown entry type');
	}
    }
    $bibfile->close;
}

print "Saving to $destfile\n";

my $dest = new Text::BibTeX::File ">$destfile" or die "$destfile: $!\n";

foreach my $key(keys %macros)
{
    my $entry = new Text::BibTeX::Entry;
    $entry->set_type('string');
    $entry->set_metatype(BTE_MACRODEF);
    $entry->set($key, $macros{$key});
    $entry->write($dest);
}

foreach my $key(sort keys %regular)
{
    my $entry = new Text::BibTeX::Entry;
    $entry->set_type($regular{$key}->{__type});
    $entry->set_metatype(BTE_REGULAR);
    $entry->set_key($regular{$key}->{__key});
    foreach my $field(sort keys %{$regular{$key}})
    {
	$entry->set($field, $regular{$key}->{$field})
	    unless $field =~ /^__/;
    }
    $entry->write($dest);
}

$dest->close;

__END__
    
