package Distribution::Packager::Beatsource;

use strict;
use Data::Dumper;

use lib '/app/tools/distribution/lib';
use base 'Distribution::Packager';

use constant TEMPLATE => 'beatsource.tt';

# directory structure:
# YYYYMMDDHHMMSS/
#     UPCUPCUPCUPC/
#         UPCUPCUPCUPC_T.wav
#         UPCUPCUPCUPC.jpg
#         UPCUPCUPCUPC.xml

sub build_package {
    my $self = shift;

    my $distDirName = $self->_get_dist_dir_name();
    my $baseDir     = $self->dist_dir($distDirName);
    $self->make_path($baseDir);

  ALBUM: foreach my $album ( @{ $self->albums() } ) {
        my $upc = $album->{upc};
        my $albDir = join( '/', $baseDir, $upc );
        $self->make_path($albDir);

        my $genre = $self->_get_service_genre( genre_id => $album->{'genre-id'} );
        unless ($genre) {
            $genre = $self->_get_service_genre( genre_id => $album->{'genre-secondary-id'} );
        }
        unless ($genre) {
            $self->_album_denied( $album, "Album genres not accepted by service" );
            print STDERR "not a valid genre for beatsource!\n";
            print STDERR "primary genre id: " . $album->{'genre-id'} . "\n";
            print STDERR "secondary genre id: " . $album->{'genre-seconary-id'} . "\n";
            $self->_cleanup_dir($albDir);
            next ALBUM;
        }
        $album->{'genre'} = $genre;

        $album->{'vendor-id'}    = $self->{AcctInfo}{code};
        $album->{'volume-count'} = 0;
        $album->{'track-count'}  = 0;

        ## clean the catalog number just for them
        my $catalog_number = $album->{'catalog-number'};
        $catalog_number =~ s/[^a-zA-Z0-9]//g;
        $album->{'catalog-number'} = $catalog_number;

        my $imgDest = sprintf( "%s/%s.jpg", $albDir, $upc );
        unless (
            $self->_convert_image(
                src  => $album->{'image-path-windows'},
                dest => $imgDest,
                xy   => 240,
                dpi  => 72
            )
          ) {
            print STDERR "failed to convert image for $upc ($album->{'image-path-windows'})\n";
            $self->_cleanup_dir($albDir);
            next;
        }
        $album->{'image-filename'} = $upc . '.jpg';
        $album->{'image-checksum'} = $self->_get_file_checksum($imgDest);
        my $calculated_track_no = 1;

        foreach my $volume ( @{ $album->{volume} } ) {
            my %volAttrs  = $volume->getXMLParams();
            my $volumeNum = $volAttrs{id};

            foreach my $track ( @{ $volume->{track} } ) {
                my $trackSrc = $track->{'audio-path-windows'};
                my $trackSec = $self->_get_track_seconds($trackSrc);
                $track->{length}   = $self->_seconds_to_iso8601($trackSec);
                $track->{duration} = $trackSec;

                ## since beatport doesn't support volumes
                my $trackNum = $calculated_track_no++;
                $track->{'sequence'} = $trackNum;
                my $trackName = sprintf( "%s_%d.wav", $upc, $trackNum );
                unless ( $self->_flac_to_wav( src => $trackSrc, dest => "$albDir/$trackName" ) ) {
                    print STDERR "failed to copy $upc disc $volumeNum, track $trackNum: $!\n";
                    $self->_cleanup_dir($albDir);
                    next ALBUM;
                }
                $track->{'audio-filename'} = $trackName;
                $track->{'audio-checksum'} = $self->_get_file_checksum("$albDir/$trackName");
            }
        }

        unless ( $self->_generate_metadata( dataSrc => $album, xmlDest => "$albDir/$upc.xml" ) ) {
            print STDERR "metadata conversion failed on $upc\n";
            $self->_cleanup_dir($albDir);
            next;
        }

        # album is complete so add it to success list
        $self->_complete_albums($album);
    }

    return 1;
}

sub deliver_package {
    my $self = shift;

    # send the big blob
    my $retval = $self->SUPER::deliver_package();

    return $retval if ( $retval == 0 );

    my $confirmation_file = join( '/', $self->{TempDir}, 'delivery.complete' );
    open( F, '>', $confirmation_file ) or die "can't open $confirmation_file: $!";
    close(F) or warn "can't close $confirmation_file: $!";

    return $self->SUPER::deliver_package( src => 'delivery.complete', dest => $self->{DistDirName}, dont_retry => 1 );
}

sub _get_dist_dir_name {
    my $self = shift;
    return $self->{DistDirName} if $self->{DistDirName};

    my ( $sec, $min, $hour, $mday, $mon, $year ) = localtime( $self->{Timestamp} );
    my $date = sprintf( '%d%02d%02d',   $year + 1900, $mon + 1, $mday );
    my $time = sprintf( '%02d%02d%02d', $hour,        $min,     $sec );

    return $date . $time;
}

1;
