#!/usr/bin/perl -w
use strict;

use Getopt::Long;
use Config::Properties;
use YAML;
use MP3::Tag;

GetOptions(
    'file|f=s' => \my $META_FILE,
    'clear'    => \my $CLEAR,
);

my @AUDIO_FILES = @ARGV;

my $meta;

if ($META_FILE eq '-') {
    $meta = Config::Properties->new;
    $meta->load(*STDIN);
} else {
    $meta = Config::Properties->new(
        file => $META_FILE,
    );
}

my $metadata = $meta->splitToTree;

for my $i (1 .. @AUDIO_FILES) {
    my $mp3 = MP3::Tag->new($AUDIO_FILES[$i - 1]);

    # first clear the tags if asked
    if ($CLEAR) {
        warn "clearing first";
        $mp3->delete_tag($_) foreach qw{ID3v1 ID3v2};
    }

    my $track_key = sprintf "TRACK%02d", $i;
    my $track = $metadata->{$track_key};
    #TODO: for reissues, what should the year/date be tagged as?
    my ($year) = ($metadata->{ORIGINALDATE} || $metadata->{DATE} || '' =~ /^(\d{4})/);
    $mp3->title_set($track->{TITLE});
    $mp3->artist_set($track->{ARTIST} || $metadata->{ALBUMARTIST});
    $mp3->album_set($track->{ALBUM}  || $metadata->{ALBUM});
    $mp3->year_set($year) if $year;
    $mp3->track_set($i);
    $mp3->select_id3v2_frame_by_descr('TPE2', $metadata->{ALBUMARTIST}) if $metadata->{ALBUMARTIST};
    $mp3->update_tags;
    printf "    Apply to %s\n", $AUDIO_FILES[$i - 1];

    #TODO: full version of a make-string-filename-safe function
    my $sort_filename = lc $track->{ARTISTSORT};
    for ($sort_filename) {
        s/&/and/g;
        s/\W/-/g;
        s/--/-/g;
    }
    print "Artist sort filename would be: " . $sort_filename . "\n";
}
