package Distribution::DistributionObject;

use strict;

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

use lib '/app/tools/distribution/lib';
use Distribution::DB::Item::ServiceAccount;

use base 'Common::Script';

use File::Path;

use constant PACKAGE_BASE => 'h:/packages';
$| = 1;

sub new {
    my $class = shift;

    my $self = bless {}, $class;

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

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

    assert( $args{client_id} );
    assert( $args{service_id} );
    assert( $args{distribution_process_id} );

    $self->{_clientID}              = $args{client_id};
    $self->{_serviceID}             = $args{service_id};
    $self->{_distributionProcessID} = $args{distribution_process_id};

    $self->{_acctInfo} = Distribution::DB::Item::ServiceAccount->GetAccountInfo(
        service_id => $self->{_serviceID},
        client_id  => $self->{_clientID}
    );

    $self->{_encodeDir} = $self->_getEncodeDir();
    $self->{_timestamp} = time();

    assert( $self->{_acctInfo}, "Account info not found" );

    # Turn on debugging
    $ENV{DEV_SERVER} = 1 if ( $args{debug} );

    return $self;
}

sub run {
    my $self = shift;

    assert( 0, "Must be overloaded" );
}

sub _windoze_path {
    my $self = shift;
    my $path = shift;

    # for now, always return f:
    # soon we'll need to use initial part of path to determine drive letter
    return 'f:' . $path;
}

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

    my $fh;
    open( $fh, $file ) or return undef;
    binmode $fh or return undef;

    my $md5 = Digest::MD5->new();
    eval { $md5->addfile(*$fh) } or return undef;
    my $digest = $md5->hexdigest;

    close($fh);

    return $digest;
}

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

    my $filesize = -s $file;
    return $filesize;
}

sub _cleanup_dir {
    my $self = shift;
    my $dir  = shift;
    rmtree( $dir, { error => \my $err } );
    if ( ref $err eq 'ARRAY' && scalar @$err > 0 ) {
        die "couldn't clean up $dir: $!";    # more verbose info?
    }
    return 1;
}

sub _getEncodeDir {
    my $self = shift;

    my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime( $self->{Timestamp} );
    my $date_pid = sprintf( "%4d%02d%02d%02d%02d%02d_%d", $year + 1900, $mon + 1, $mday, $hour, $min, $sec, $$ );
    my $tmp_dir = join( '/', PACKAGE_BASE, $self->{_serviceID}, $self->{_clientID}, $date_pid );

    return $tmp_dir;
}

1;
