package BookPub::RDAS::Response::SalesData;

use Data::Dumper;

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

use lib '/app/tools/bookpub/lib';
use BookPub::Sale::Feed::SaleFeedFile;
use BookPub::Sale::File;
use BookPub::Tracker::Job::ImportSalesFile;
use BookPub::DB::Item::SaleFeed;

use base 'BookPub::RDAS::Response';

sub _validOptions {
    return ( shift->SUPER::_validOptions, 'report', 'saleFeedFileID' );
}

sub SaleFeedFile {
    my $self = shift;
    return $self->{SaleFeedFile} if ( $self->{SaleFeedFile} );

    assert( $self->saleFeedFileID );

    $self->{SaleFeedFile} = new BookPub::Sale::Feed::SaleFeedFile( saleFeedFileID => $self->saleFeedFileID );
}

sub serviceID { die "must be overloaded" }

sub run {
    my $self = shift;

    return unless ( $self->report() );

    if ( my $fileID = $self->_saveFile() ) {
        $self->SaleFeedFile->updateStatus('downloaded');
        $self->_enqueueImportJob($fileID);
    }

    return 1;
}

sub _saveFile {
    my $self = shift;

    my $tmpfile = new File::Temp( UNLINK => 1 );
    open( OUT, "> $tmpfile" );

    print OUT $self->report;
    close OUT;

    my $md5 = Common::Util::md5sum($tmpfile);
    die "MD5 calculation failed" unless ($md5);

    my $result;

    my $file;
    my $feed = BookPub::DB::Item::SaleFeed->Lookup( sale_feed_id => $self->SaleFeedFile->SaleFeedID );

    if ( $feed->allow_dupes eq 'N' ) {
        $file = BookPub::DB::Item::File->Lookup( orig_file_name => $self->SaleFeedFile->Filename );
    }

    eval {
        die "File with duplicate name detected" if ($file);

        $result = BookPub::Sale::File::SimpleUploadFromShell(
            client_id => Common::RSApp::GetClientID(),
            filepath  => $tmpfile->filename,
            filename  => $self->SaleFeedFile->Filename,
            md5_sum   => $md5,
        );
    };

    if ($@) {
        my $error = $@;
        Log->error("ERROR: $error");

        #my $reportEmail = Common::RSApp::GetConfig( 'bookpub', 'error_report_email' );
        my $body = "A duplicate sales file has been detected\n\n" . $self->SaleFeedFile->Filename . "\n\nERROR: $error";

        #my $client = new Common::Client( clientID => Common::RSApp::GetClientID() );
        #my $name = $client->ClientName || "Client ID: " . Common::RSApp::GetClientID();

        #Common::Email->Send(
        #                    to => $reportEmail,
        #                    subject => 'Duplication Sale File Error Detected (' . $name . ')',
        #                    body => $body );

        $self->SaleFeedFile->Status('invalid');
        $self->SaleFeedFile->save();

        Log->error("$body");
    }

    return $result;
}

sub _getJobObj {
    my $self = shift;
    return BookPub::Tracker::Job::ImportSalesFile->new(@_);
}

sub _enqueueImportJob {
    my $self   = shift;
    my $fileID = shift;

    assert($fileID);

    Log->notice("Creating import job for file id $fileID");

    my $job = $self->_getJobObj( fileID => $fileID );
    return $job->enqueue();
}

1;
