package Distribution::Service::ShockHound;

use strict;

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

use Data::Dumper;

# directory structure:
# LabelName_YYYYMMDDHHMMSS/
#     UPCUPCUPCUPC/
#         UPCUPCUPCUPC_DD_TT.mp3
#         UPCUPCUPCUPC_front_1400x1400.jpg
#         UPCUPCUPCUPC.txt

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);

    my @manifest;
    push @manifest, join "\t", qw(Content_Provider_Name Manifest_Creation_Date Content_Delivery_ID Album_UPC Album_Track_Count);

    my $metadata_header = join "\t", qw(
      Content_Provider_Name
      Album_Artist
      Album_Title
      Album_Version
      Album_Retail_Price_Class
      Album_Label_Name
      Album_Copyright_C_Notice
      Album_Copyright_C_Year
      Album_Copyright_P_Notice
      Album_Copyright_P_Year
      Album_Catalog_Number
      Album_UPC
      Album_GRid
      Album_AMG_ID
      Album_Muze_TitleID
      Album_Content_Provider_SKU_Code
      Album_Parental_Advisory
      Album_Primary_Genre
      Album_Primary_Subgenre
      Album_Secondary_Genre
      Album_Secondary_Subgenre
      Album_Release_Date
      Album_Original_Release_Date
      Album_Available_Date
      Album_Stop_Sell_Date
      Album_Active
      Album_Allow_Preorders
      Album_Recording_Location
      Album_Description
      Track_Disc_Number
      Track_Number
      Track_Artist
      Track_Title
      Track_Version
      Track_Available_Date
      Track_Stop_Sell_Date
      Track_Copyright_C_Notice
      Track_Copyright_C_Year
      Track_Copyright_P_Notice
      Track_Copyright_P_Year
      Track_Duration
      Track_ISRC
      Track_ISWC
      Track_AMG_ID
      Track_HFA_ID
      Track_Content_Provider_SKU_Code
      Track_Explicit
      Track_Primary_Genre
      Track_Primary_Subgenre
      Track_Secondary_Genre
      Track_Secondary_Subgenre
      Track_Preview_Clip_Start_Point
      Track_Sellable
      Track_Single_Song_Download
    );

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

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

        my $orig_art = $self->_windoze_path( $album->{'image-path-full'} );
        my $conv_art = $upc . "_front_1400x1400.jpg";
        unless ( $self->_convert_image( src => $orig_art, dest => $dir . "/" . $conv_art, xy => 1400, dpi => 72 ) ) {
            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 );

        my @metadata;
        push @metadata, $metadata_header;

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

            foreach my $track ( @{ $volume->{track} } ) {
                my $track_num = $track->{sequence};
                $track_count++;
                my $orig_audio = $self->_windoze_path( $track->{'audio-path-full'} );

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

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

                push @metadata, $self->_get_metadata_line( album => $album, volume => $volume, track => $track );
            }

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

        push @manifest, join( "\t", $self->{AcctInfo}{code}, $self->_get_date(), $self->_get_dist_dir_name(), $upc, $track_count );

        my $metadata_file = $dir . "/$upc.txt";
        open( METADATA, ">$metadata_file" ) or die "can't open metadata file for $upc: $!\n";
        binmode( METADATA, ":utf8" );
        print METADATA join( "\n", @metadata );
        close(METADATA);
        $self->_complete_albums($album);
    }
    push @manifest, "END";

    open( MANIFEST, '>', $self->{TempDir} . '/manifest.txt' ) or die "can't open manifest file - $!\n";
    print MANIFEST join( "\n", @manifest );
    close(MANIFEST);

    return 1;
}

sub deliver_package {
    my $self = shift;

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

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

    $retval = $self->SUPER::deliver_package( src => 'manifest.txt', dest => $self->{DistDirName} );

    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;
    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 );
}

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

sub _get_metadata_line {
    my $self = shift;
    my %args = @_;

    my $album  = $args{album};
    my $volume = $args{volume};
    my $track  = $args{track};

    my ( $cyear, $ctext ) = $album->{'cline'} =~ m/^(\d{4}) (.+)$/;
    my ( $pyear, $ptext ) = $album->{'pline'} =~ m/^(\d{4}) (.+)$/;

    my $album_advisory = ( $album->{'advisory'} eq "explicit" ) ? "Y" : "";
    my $track_advisory = ( $track->{'advisory'} eq "explicit" ) ? "Y" : "N";

    my $metadata = join(
        "\t",
        $self->{AcctInfo}{code},       #Content_Provider_Name
        $album->{'display-artist'},    #Album_Artist
        $album->{'title'},             #Album_Title
        "",                            #Album_Version
        "Premium",                     #Album_Retail_Price_Class ## TODO: correct?
        $album->{'label'},             #Album_Label_Name
        $ctext,                        #Album_Copyright_C_Notice
        $cyear,                        #Album_Copyright_C_Year
        $ptext,                        #Album_Copyright_P_Notice
        $pyear,                        #Album_Copyright_P_Year
        $album->{'catalog-number'},    #Album_Catalog_Number
        $album->{'upc'},               #Album_UPC
        "",                            #Album_GRid
        "",                            #Album_AMG_ID
        "",                            #Album_Muze_TitleID
        $album->{'upc'},               #Album_Content_Provider_SKU_Code
        $album_advisory,               #Album_Parental_Advisory
        $album->{'genre'},             #Album_Primary_Genre
        "",                            #Album_Primary_Subgenre
        "",                            #Album_Secondary_Genre # TODO: maybe later...
        "",                            #Album_Secondary_Subgenre
        $album->{'release-date'},      #Album_Release_Date
        $album->{'release-date'},      #Album_Original_Release_Date
        $album->{'release-date'},      #Album_Available_Date
        "",                            #Album_Stop_Sell_Date
        "Y",                           #Album_Active
        "",                            #Album_Allow_Preorders
        "",                            #Album_Recording_Location
        "",                            #Album_Description
        $volume->{'sequence'},         #Track_Disc_Number
        $track->{'sequence'},          #Track_Number
        $track->{'display-artist'},    #Track_Artist
        $track->{'title'},             #Track_Title
        "",                            #Track_Version
        $album->{'release-date'},      #Track_Available_Date
        "",                            #Track_Stop_Sell_Date
        $ctext,                        #Track_Copyright_C_Notice
        $cyear,                        #Track_Copyright_C_Year
        $ptext,                        #Track_Copyright_P_Notice
        $pyear,                        #Track_Copyright_P_Year
        $track->{'duration'},          #Track_Duration
        $track->{'isrc'},              #Track_ISRC
        "",                            #Track_ISWC
        "",                            #Track_AMG_ID
        "",                            #Track_HFA_ID
        $track->{'isrc'},              #Track_Content_Provider_SKU_Code
        $track_advisory,               #Track_Explicit
        $album->{'genre'},             #Track_Primary_Genre
        "",                            #Track_Primary_Subgenre
        "",                            #Track_Secondary_Genre # TODO: maybe later...
        "",                            #Track_Secondary_Subgenre
        0,                             #Track_Preview_Clip_Start_Point
        "Y",                           #Track_Sellable
        "Y",                           #Track_Single_Song_Download
    );

    return $metadata;
}

1;
