package Distribution::Service::DJDownload;

use strict;

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

use constant TEMPLATE => 'nokia.tt';

# directory structure:
# BATCH_NAME/
#     UPCUPCUPCUPC/
#        UPCUPCUPCUPC_D_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);
    my $album->{'batch-name'} = $distDirName;

    my @service_countries = qw(GB BE BG CZ DK DE EE IE EL ES FR IT CY LV LT
      LU HU MT NL AT PL PT RO SI SK FI SE);

  ALBUM: foreach my $album ( @{ $self->albums() } ) {
        unless ( $self->_can_be_sold_in( $album, \@service_countries ) ) {
            $self->_album_denied( $album, $self->{TerritoriesDeniedMsg} );
            next ALBUM;
        }

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

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

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

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

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

                my $trackNum = $track->{'sequence'};
                my $trackName = sprintf( "%s_%d_%d.wav", $upc, $volumeNum, $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");
                $track->{'audio-filesize'} = $self->_get_file_size("$albDir/$trackName");
                $album->{'track-count'}++;
            }

            $album->{'volume-count'}++;
        }

        unless ( $self->_generate_metadata( dataSrc => $album, xmlDest => "$albDir/$upc.xml", wwCode => "Global" ) ) {
            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
    return $self->SUPER::deliver_package();
}

sub _get_dist_dir_name {
    my $self = shift;

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

1;
