package Distribution::TransportAgent::ITMS;

use strict;

use base 'Distribution::TransportAgent';

use Common::Assert;
use Common::RSApp;

use Data::Dumper;

use Common::RSApp;

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

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

    assert( $self->{_accountName}, "Account name required for ITMS" );

    assert( $self->{_user} && $self->{_passwd}, "User credentials required for ITMS" );

    $self->{_confirmationFile} = $args{confirm_file};

    return $self;
}

sub testing {
    my $self = shift;

    my ($host) = split( /\./, Common::RSApp::GetHostname() );
    my $productionServers = Common::RSApp::GetConfig( 'distribution', 'cm_production_servers' );

    # If production CM Server
    unless ( grep( /^$host$/i, @{$productionServers} ) ) {
        assert( $self->{_testing}, "Non-production ($host) services must use the testing option" );
    }
}

sub deliver {
    my $self   = shift;
    my $source = shift;

    return $self->_transfer($source);
}

sub _transfer {
    my $self   = shift;
    my $source = shift;
    my $dest   = shift;
    my $error;

    my $transferedBytes = 0;
    my $complete        = 0;

    my $cmd = $self->_putCmd( $source, $dest ) . '2>&1';

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

    unless ( open( CMD, "$cmd |" ) ) {
        print STDERR "Failed to run: $cmd";
        return ( 0, 0 );
    }

    my $cmdOutput;
    while (<CMD>) { $cmdOutput .= $_; Common::Log::Print($_); }

    $error = $self->_parseResult($cmdOutput);

    $complete = $error ? 0 : 1;
    Common::Log::Debug("Complete level: $complete");

    # TODO implement some progress monitoring
    return ( $complete, 0 );
}

sub _get {
    my $self = shift;

    assert( 0, "Not Implemented" );
}

sub _putCmd {
    my $self    = shift;
    my $source  = shift;
    my $dest    = shift;
    my $confirm = $self->{_confirmationFile} ? " -loghistory $self->{_confirmationFile} " : "";
    my $mode    = $self->{_testing} ? " -m verify " : " -m upload ";

    ## can s/upload/verify/ for testing
    my $cmd =
        Common::RSApp::GetConfig( 'distribution', 'transporter_windows_itms' )
      . " -WONoPause true "
      . $mode
      . " -f $source "
      . " -s $self->{_accountName} "
      . " -u $self->{_user} "
      . " -p $self->{_passwd} "
      . " -v detailed "
      . $confirm
      . " done ";

    Common::Log::Debug("  - iTunes Command: $cmd");

    return $cmd;
}

sub Successes {
    my $self = shift;
    return $self->{_success};
}

sub Failures {
    my $self = shift;
    return $self->{_failed};
}

sub _parseResult {
    my $self = shift;
    my $output = shift || return;

    my @success;
    my @failed;

    my $sCount;
    my $fCount;

    foreach ( split( /\n/, $output ) ) {
        next unless ($_);

        if ($sCount) {
            if (/\t.*\\(\d+)\.itmsp$/) {
                push( @success, $1 ) if ($1);
                $sCount -= 1;
            }
        }

        if (/^(\d+) packages were .* successfully:/) {
            $sCount = $1;
        }

        if ($fCount) {
            if (/\t.*\\(\d+)\.itmsp/) {
                push( @failed, $1 ) if ($1);
                $fCount -= 1;
            }
        }

        if (/^(\d+).*were not .* because they had problems:/) {
            $fCount = $1;
        }
    }

    Common::Log::Debug("SUCESS: @success");
    Common::Log::Debug("FAILED: @failed");

    $self->{_success} = \@success;
    $self->{_failed}  = \@failed;

    return @failed ? 1 : 0;
}

1;
