package RDAS::Fetcher::FTP;

use File::Temp qw(tempfile);
use Data::Dumper;
use Net::FTP;

use lib '/app/tools/rdas/lib';
use base 'RDAS::Fetcher';

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

use constant kDefaultUserAgent => 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12)';

sub _validOptions {
    ( qw( server ), shift->SUPER::_validOptions() );
}

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

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

sub get {
    my $self     = shift;
    my $filename = shift;
    my $content  = '';
    my $fh;

    assert($filename);

    my $ftp = $self->_getFTPObject();

    open( $fh, '>', \$content );

    $ftp->get( $filename, $fh )
      || die "get failed ", $ftp->message;

    my $remoteSize = $self->size($filename);
    if ( $remoteSize != length($content) ) {
        Log->error( "File get failed.  Mismatch file size, server size: " . $remoteSize . " local size: " . length($content) );
        return;
    }

    return $content;
}

sub login {
    my $self = shift;
    my ( $uname, $passwd ) = @_;

    assert($uname);
    assert($passwd);

    my $ftp = $self->_getFTPObject();
    return $ftp->login( $uname, $passwd );
}

sub ls {
    my $self = shift;

    my $ftp   = $self->_getFTPObject();
    my @files = $ftp->ls();

    return @files;
}

sub size {
    my $self = shift;
    my $file = shift;

    assert($file);

    my $ftp = $self->_getFTPObject();
    return $ftp->size($file);
}

sub _getFTPObject {
    my $self = shift;

    return $self->{_ftp} if ( $self->{_ftp} );

    assert( $self->server );
    Log->info( " -- Setup Net::FTP object.  Server: " . $self->server );

    $self->{_ftp} = new Net::FTP( $self->server );
    $self->{_ftp}->binary(1);

    die "Failed to create FTP object: $!" unless ( $self->{_ftp} );
    return $self->{_ftp};
}

1;
