package MediaServe::Audio::Converter::WMA;
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 WMA => Common::RSApp::GetConfig( 'distribution', 'encoders_windows_wma' );

sub Extension { 'wma' }

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

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

    $self->{_bitrate}   = $args{bitrate};
    $self->{_frequency} = $args{frequency};
    $self->{_signal}    = $args{signal} || 'stereo';

    assert( $self->{_bitrate}   && $self->{_bitrate} =~ /^\d+$/,          "bitrate required or invalid" );
    assert( $self->{_frequency} && $self->{_frequency} =~ /^\d+$/,        "frequency required or invalid" );
    assert( $self->{_signal}    && $self->{_signal} =~ /^(stereo|mono)$/, "signal required or invalid" );

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

sub write {
    my $self       = shift;
    my $dest       = shift;
    my $sourceFile = $self->_getSourceFile( $self->{_filename} );
    my $bitrate =
      $self->{_bitrate} < 100
      ? " $self->{_bitrate}"
      : $self->{_bitrate};
    my $frequency = $self->{_frequency};
    my $signal    = $self->{_signal};

    my $codec = Common::RSApp::GetConfig( 'distribution', 'windows_audio_codec' );

    assert($codec);
    assert($dest);

    Common::Log::Debug("Converting $self->{_filename} => $dest");

    my $cmd =
        WMA
      . " -noidtag "
      . "-infile=\"$sourceFile\" "
      . "-outfile=\"$dest\" "
      . '-convert_to="Windows Media Audio 10" '
      . "-codec=\"$codec\" "
      . "-settings=\"$bitrate kbps, $frequency kHz, $signal CBR\"";

    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;
