package MediaServe::Audio::Converter::MP3;
use strict;
use warnings;

use File::Basename;
use File::Copy;
use File::Temp;
use Audio::FLAC;

use lib '/app/tools/common/lib';
use Common::RSApp;
use Common::Util;
use Common::Assert;

use lib '/app/tools/mediaserve/lib';

use base 'MediaServe::Audio::Converter';

use constant MP3 => Common::RSApp::GetConfig( 'distribution', 'encoders_windows_mp3' );

sub Extension { 'mp3' }

sub _sourceFormat { 'wav' }

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

    $self->{_bitrate}  = $args{bitrate};
    $self->{_variable} = $args{variable};

    assert( $self->{_sourceFormat} =~ /^(wav|flac|mp3|wma)$/, "source format invalid" )
      if ( $self->{_sourceFormat} );

    assert( $self->{_bitrate} =~ /^\d+$/, "bitrate invalid" )
      if ( $self->{_bitrate} );

    assert( $self->{_variable} =~ /^\d+$/, "variable invalid" )
      if ( $self->{_variable} );

    assert( $self->{_bitrate} || $self->{_variable}, "Bitrate required" );

    return $self->SUPER::_init(@_);
}

sub write {
    my $self = shift;
    my $dest = shift;
    my $bitrate;
    my $sourceFile = $self->_getSourceFile( $self->{_filename} );

    assert( $sourceFile && -e $sourceFile, "$sourceFile does not exists" );

    if ( $self->{_bitrate} ) {
        $bitrate = "-b $self->{_bitrate} ";
    } elsif ( $self->{_variable} ) {
        $bitrate = "-V $self->{_variable} --vbr-new ";
    } else {
        die("Rate required");
    }

    assert($dest);

    Common::Log::Debug("Converting $sourceFile => $dest");

    my $cmd = MP3 . " " . $bitrate . " -q0 -h --quiet  " . " \"$sourceFile\" " . " \"$dest\" ";

    Common::Log::Debug("   - CMD: $cmd");

    my $good = system($cmd) ? undef : 1;

    my @stat = stat($dest) if ($dest);

    unless ( $good && -r $dest && $stat[7] ) {
        my $error = "Failed to convert file to $dest\n";
        print STDERR $error;
        return;
    }

    return 1;
}

1;
