package Distribution::TransportAgent::FTP;

use strict;

use base 'Distribution::TransportAgent';

use Common::Assert;
use Data::Dumper;
use Proc::Background;

use constant NCFTP => 'D:/NcFTP/ncftp';

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

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

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

    $self->{_passive} = defined( $args{passive} ) ? $args{passive} : 1;
    return $self;
}

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

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

    my $ftp_cmd = $self->_putCmd( $source, $dest );

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

    my $process = Proc::Background->new( { die_upon_destroy => 1 }, $ftp_cmd );
    $result = $process->wait();

    Common::Log::Print("RESULT: $result");

    $complete = $result ? 0 : 1;

    # 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 $port   = $self->{_port} ? " -P $self->{_port} " : "";
    my $mode   = $self->{_passive} ? " " : " -E ";

    my $cmd = NCFTP . "put " . " -R " .    # recursive
      " -z " .                             # resume
      " -v " .                             # no progress bar
      " -m " .                             # make missing dirs
      $mode .                              # Active (-E) or Passive (nothing, it's default)
      " -u $self->{_user} " . " -p $self->{_passwd} " . $port . " $self->{_host} " . " $dest " . " $source ";

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

    return $cmd;
}

1;
