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

sub Extension { 'aac' }

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

    $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->{_signal}  && $self->{_signal} =~ /^(stereo|mono)$/, "signal required or invalid" );

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

sub _sourceFormat { 'wav' }

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} || 'stereo';

    assert($dest);

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

    my $cmd =
        AAC . " "
      . "-chmode $self->{_signal} "
      . "-silent "
      . "-bsformat m4a "
      . "-codec AAC "
      . "-br $self->{_bitrate} "
      . "-if \"$sourceFile\" "
      . "-of \"$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;
