package BookPub::RDAS::Request::SaleFeedAuthCheck::Amazon;

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

use lib '/app/tools/common/lib';
use Common::Assert;
use Common::DB::Item::SaleFeedServiceURL;

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::Amazon::Home;

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

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

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 {
    $^W = 0;    # disable UTF8 warnings

    my $self = shift;
    my ( $uname, $passwd ) = $self->_credentials();
    my $url = $self->_baseURL() . "/gp/flex/sign-in";

    my $fetcher = $self->_fetchPage($url) || return;

    # Use the underlying Mechanize object to submit the login form.
    #
    my $_mech  = $fetcher->_getMechObject();
    my $result = $_mech->submit_form(
        form_number => 0,
        fields      => {
            username => $uname,
            password => $passwd,
        }
    );

    my $parser = new BookPub::RDAS::Parser::SaleData::Amazon::Home( content => $fetcher->content() );

    if ( $parser->InEnglish ) {
        Log->info(" Using In English link ");
        $fetcher = $self->_fetchPage( $parser->InEnglish );
        $parser = new BookPub::RDAS::Parser::SaleData::Amazon::Home( content => $fetcher->content() );
    } elsif ( $parser->InEnglishBR ) {
        Log->info(" Using In English link ");
        $fetcher = $self->_fetchPage( $parser->InEnglishBR );
        $parser = new BookPub::RDAS::Parser::SaleData::Amazon::Home( content => $fetcher->content() );
    } else {
        Log->info(" Using default link ");
        $fetcher = $self->_fetchPage("/");
        $parser = new BookPub::RDAS::Parser::SaleData::Amazon::Home( content => $fetcher->content() );
    }

    if ( $parser->Logout ) {
        Log->info(" ++ Login successful ++");
    } elsif ( $parser->Interstitial ) {
        Log->info(" ++ Login successful ++");
    } elsif ( $parser->UpdatePrompt ) {
        Log->info(" ++ Login successful ++");
    } elsif ( $parser->Welcome ) {
        Log->info(" ++ Login successful ++");
    } else {
        Log->error("BookPub::RDAS::Request::SaleFeedAuthCheck::Amazon - Authentication failed");
        return;
    }

    return 1;
}

sub _baseURL {
    my $self = shift;

    my $saleFeedService = BookPub::DB::Item::SaleFeedService->Lookup( sale_feed_service_id => $self->saleFeedServiceID );

    unless ( $self->{_baseURL} ) {
        my $saleFeedURL = Common::DB::Item::SaleFeedServiceURL->Lookup(
            service_id   => $saleFeedService->service_id,
            country_code => $saleFeedService->country_code
        );
        if ( $saleFeedURL && $saleFeedURL->url ) {
            $self->{_baseURL} = $saleFeedURL->url;
        }
    }

    if ( $self->{_baseURL} ) {
        return $self->{_baseURL};
    } else {
        die "No URL found";
    }
}

1;
