#!/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,
    'tracks|t=s' => \my $TRACKS,
);

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;

my $track_count = scalar grep { /^TRACK/ } keys %{ $metadata };

my @track_numbers;
if ($TRACKS) {
    foreach (split /,/, $TRACKS) {
        if (/^(\d+)$/) {
            push @track_numbers, $1;
        } elsif (/^(\d+)-(\d+)$/) {
            push @track_numbers, ($1 .. $2);
        } elsif (/^-(\d+)$/) {
            push @track_numbers, (1 .. $1);
        } elsif (/^(\d+)-$/) {
            push @track_numbers, ($1 .. $track_count);
        }
    }
} else {
    @track_numbers = (1 .. $track_count);
}

for my $i (@track_numbers) {
    my $audio_file = shift or die "No more audio files to process\n";
    my $mp3 = MP3::Tag->new($audio_file);

    # 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->update_tags;
    printf "    Apply to %s\n", $audio_file;

    #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";
}
