package BookPub::RDAS::Request::SalesData;

use Carp;
use Data::Dumper;

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

use lib '/app/tools/bookpub/lib';
use BookPub::POS::Sale::Feed;
use BookPub::DB::Item::POSFile;
use BookPub::POS::Tracker::File;

use BookPub::Sale::Feed::SaleFeedFile;
use BookPub::Sale::Feed::SaleFeed;
use BookPub::Sale::Feed::SaleFeedService;

use base 'BookPub::RDAS::Request';

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

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 SaleFeed {
    my $self = shift;
    return $self->{SaleFeed} if ( $self->{SaleFeed} );

    assert( $self->SaleFeedFile );

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

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

    assert( $self->SaleFeed );

    $self->{SaleFeedService} = new BookPub::Sale::Feed::SaleFeedService( saleFeedServiceID => $self->SaleFeed->SaleFeedServiceID );
}

sub report { shift->{_report} }

sub run {
    my $self = shift;

    if ( $self->fetch(@_) ) {
        return $self->respond();
    }

    return;
}

sub _getFetchObject {
    my $self = shift;
    my $url  = shift || confess;
    my $ua   = $self->userAgent;

    return RDAS::Fetcher::Mechanize::Authenticated->new(
        maxRedirect => 6,
        timeout     => 300,
        url         => $url,
        userAgent   => $ua,
    );
}

sub GetRequestObject {
    my $class     = shift;
    my $serviceID = shift;
    my %args      = @_;

    assert( $serviceID, "Service ID Required" );

    my %classes = (
        BookPub::Tracker::Service::BARNES_NOBLE() => BookPub::RDAS::Request::SalesData::BarnesNoble,
        BookPub::Tracker::Service::APPLE()        => BookPub::RDAS::Request::SalesData::Apple,
        BookPub::Tracker::Service::AMAZON()       => BookPub::RDAS::Request::SalesData::Amazon,
    );

    my $type = $classes{"$serviceID"};

    die "Not a valid RDAS service id: $serviceID\n" unless ($type);
    Log->info(" ++ Sale data request object: $type");

    eval "require $type";
    die "$@" if ($@);

    return $type->new(%args);
}

1;
