package BookPub::RDAS::Request::SaleFeedFileList;

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 base 'BookPub::RDAS::Request';

# period for sales reports.
sub reportFrequency { die 'must be overloaded' }

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

sub _init {
    my $self = shift->SUPER::_init(@_);

    assert( $self->saleFeedServiceID );

    $self->{_service} = new BookPub::Sale::Feed::SaleFeedService( saleFeedServiceID => $self->saleFeedServiceID );
    $self->{_feed} = new BookPub::Sale::Feed::SaleFeed( saleFeedID => $self->saleFeedID ) if ( $self->saleFeedID );

    return $self;
}

sub service { shift->{_service} }
sub feed    { shift->{_feed} }

sub run {
    my $self = shift;

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

sub _getFetchObject {
    my $self = shift;
    my $url  = shift || die;
    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::SaleFeedFileList::BarnesNoble,
        BookPub::Tracker::Service::APPLE()        => BookPub::RDAS::Request::SaleFeedFileList::Apple,
        BookPub::Tracker::Service::AMAZON()       => BookPub::RDAS::Request::SaleFeedFileList::Amazon,
    );

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

    die "Not a valid RDAS service id: $serviceID\n" unless ($type);

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

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

sub _startDate {
    my $self = shift;
    my $startDate;

    if ( $self->feed ) {
        $startDate = new Common::Date( $self->feed->DownloadStartDate() );
    } else {
        $startDate = new Common::Date( $self->service->DownloadStartDate() );
    }

    die "Unable to determine start date" unless ($startDate);

    return $startDate;
}

1;
