package BookPub::RDAS::Request::SaleFeedAuthCheck::BarnesNoble;

use WWW::Mechanize;
use Data::Dumper;

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

use lib '/app/tools/rdas/lib';
use RDAS::Fetcher::Mechanize::Authenticated;

use lib '/app/tools/bookpub/lib';
use BookPub::ServiceCredential;
use BookPub::Sale::Feed::SaleFeedService;
use BookPub::RDAS::Parser::SaleData::BarnesNoble::Home;

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

use constant kBaseURL => 'https://finance.bnsupplier.com/';

sub serviceID { return BookPub::Tracker::Service::BARNES_NOBLE() }

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

sub _init {

    # Disable host name verification because B&N certificate isn't
    $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;

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

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

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

sub fetch {
    my $self = shift;
    $self->{_error} = undef;

    return $self->_login();
}

sub _credentials {
    my $self = shift;

    unless ( $self->{_credentials} ) {
        my $cred = new BookPub::Sale::Feed::SaleFeedService( saleFeedServiceID => $self->saleFeedServiceID );
        if ( $cred && $cred->Username && $cred->Password ) {
            $self->{_credentials} = [ $cred->Username, $cred->Password ];
        }
    }

    if ( $self->{_credentials} ) {
        return @{ $self->{_credentials} };
    } else {
        die "No login credentials";
    }
}

sub _login {
    my $self = shift;
    my ( $uname, $passwd ) = $self->_credentials();
    my $url  = kBaseURL . "OA_HTML/AppsLogin";
    my %args = (
        usernameField => $uname,
        passwordField => $passwd,
    );
    my $fetcher = $self->_fetchPage( $url, form => \%args, click => 'Login' ) || return;

    my $parser = new BookPub::RDAS::Parser::SaleData::BarnesNoble::Home( content => $fetcher->content() );
    if ( $parser->Logout ) {
        Log->info(" ++ Login successful ++");
    } else {
        Log->error("Authentication failed");
        return;
    }

    return 1;
}

1;
