package Distribution::Packager::PassAlong;

use strict;

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

use constant TRANSFORM => 'passalong-transform.xsl';

# directory structure:
# YYYYMMDDHHMMSS/
#     UPCUPCUPCUPC/
#         UPCUPCUPCUPC_DD_TT_256.mp3
#         UPCUPCUPCUPC_DD_TT_32.mp3 <- preview
#         UPCUPCUPCUPC.jpg
#         UPCUPCUPCUPC.xml

sub build_package {
    my $self = shift;

    ## create delivery directory structure
    $self->{DistDirName} = $self->_get_dist_dir_name();
    my $baseDir = $self->dist_dir( $self->{DistDirName} );
    $self->{PackageDir} = $baseDir;
    $self->make_path($baseDir);

  ALBUM: foreach my $album ( @{ $self->albums() } ) {
        unless ( $self->_can_be_sold_in( $album, [ "US", "CA" ] ) ) {
            $self->_album_denied( $album, $self->{TerritoriesDeniedMsg} );
            next ALBUM;
        }

        $self->_force_countries_allowed($album);

        ## set up directories
        my $upc = $album->{upc};
        my $dir = $baseDir . "/" . $upc;
        $self->make_path($dir);

        my $orig_art = $album->{'image-path-windows'};
        my $conv_art = $upc . ".jpg";
        unless ( $self->_convert_image( src => $orig_art, dest => $dir . "/" . $conv_art, xy => 300, dpi => 300 ) ) {
            print STDERR "image conversion failed on $upc";
            $self->_cleanup_dir($dir);
            next ALBUM;
        }
        $album->{'image-filename'} = $conv_art;
        $album->{'image-checksum'} = $self->_get_file_checksum( $dir . "/" . $conv_art );

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

            foreach my $track ( @{ $volume->{track} } ) {
                my $track_num  = $track->{sequence};
                my $orig_audio = $track->{'audio-path-windows'};

                my $track_seconds = $self->_get_track_seconds($orig_audio);
                $track->{length} = $self->_seconds_to_iso8601($track_seconds);
                $volume_seconds += $track_seconds;

                my $conv_audio = sprintf( "%s_%02d_%02d_256.mp3", $upc, $vol_num, $track_num );
                unless (
                    $self->_flac_to_mp3(
                        src      => $orig_audio,
                        dest     => $dir . "/" . $conv_audio,
                        bit_rate => 256
                    )
                  ) {
                    print STDERR "audio conversion failed on $upc, disc $vol_num, track $track_num\n";
                    $self->_cleanup_dir($dir);
                    next ALBUM;
                }
                $track->{'audio-filename'} = $conv_audio;
                $track->{'audio-checksum'} = $self->_get_file_checksum( $dir . "/" . $conv_audio );

                ## create previews
                ## note: filename is _32, but bitrate is 96
                my $preview_audio = sprintf( "%s_%02d_%02d_32.mp3", $upc, $vol_num, $track_num );
                if ( $track_seconds <= 30 ) {
                    ## preview is the full track
                    unless (
                        $self->_flac_to_mp3(
                            src      => $orig_audio,
                            dest     => $dir . "/" . $conv_audio,
                            bit_rate => 96
                        )
                      ) {
                        print STDERR "audio preview creation failed on $upc, disc $vol_num, track $track_num";
                        $self->_cleanup_dir($dir);
                        next ALBUM;
                    }
                } else {
                    unless (
                        $self->_flac_to_mp3_preview(
                            src      => $orig_audio,
                            dest     => $dir . "/" . $preview_audio,
                            length   => 30,
                            bit_rate => 96
                        )
                      ) {
                        print STDERR "audio preview creation failed on $upc, disc $vol_num, track $track_num";
                        $self->_cleanup_dir($dir);
                        next ALBUM;
                    }
                }
                $track->{'preview-filename'} = $preview_audio;
                $track->{'preview-checksum'} = $self->_get_file_checksum( $dir . "/" . $preview_audio );
            }

            $volume->{'total-length'} = $self->_seconds_to_iso8601($volume_seconds);
        }

        my $metadata_file = $dir . "/$upc.xml";
        unless (
            $self->_translate_metadata(
                xmlSrc  => Common::WriteXML::GetXMLString( $album, 'album', skip_array_indexing => 1 ),
                xmlDest => $metadata_file
            )
          ) {
            print STDERR "metadata conversion failed on $upc";
            $self->_cleanup_dir($dir);
            next ALBUM;
        }
        $self->_complete_albums($album);
    }
    return 1;
}

sub deliver_package {
    my $self = shift;

    my $retval = $self->SUPER::deliver_package();

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

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

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

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;
