#!/usr/bin/perl

use strict;
use Getopt::Std;
use MARC::Field;
use MARC::File::USMARC;
$| = 1;

my %options=();
getopts("t:c:",\%options);
my $tag = $options{t};
my $map = {};
foreach my $codes (split(/,/, $options{c})) {
    next if length($codes) != 2;

    $map->{substr($codes, 0, 1)} = substr($codes, 1, 1);
}

my $c;
foreach my $file (@ARGV) {
    my $marcfile = MARC::File::USMARC->in( "$file" );

    my $field_count = 0;

    while (my $record = $marcfile->next()) {
        my @fields = $record->field($tag);
        $field_count = scalar(@fields);

        #next if $field_count == 0;

        my @new_fields = ();
        foreach my $f (@fields) {
            my @subfields = $f->subfields();
            next if scalar(@subfields) == 0;

            $c = ($map->{$subfields[0]->[0]}) ? $map->{$subfields[0]->[0]} : $subfields[0]->[0];

            my $new_field = MARC::Field->new(
                $f->tag(), $f->indicator(1), $f->indicator(2),
                $c => $subfields[0]->[1]
            );
            for (my $i = 1; $i < scalar(@subfields); $i++) {
                $c = ($map->{$subfields[$i]->[0]}) ? $map->{$subfields[$i]->[0]} : $subfields[$i]->[0];

                $new_field->add_subfields(
                    $c => $subfields[$i]->[1]
                );
            }

            push @new_fields, $new_field;
        }

        $record->delete_fields(@fields);
        $record->insert_fields_ordered(@new_fields);
        print $record->as_usmarc;
    }

    $marcfile->close();
}

exit 0;
