package BookPub::RDAS::Request::SaleFeedAuthCheck::Apple;

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::RDAS::Parser::SaleData::Apple::Home;

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

use constant kLoginURL => 'https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa';

use constant kMaxRetries => 3;

sub error { shift->{_error} }

sub fetch {
    my $self = shift;

    # Disable warnings coming from HTTP::Cookie.
    $^W = 0;

    my $success = 0;
    $self->{_error} = undef;

    for ( my $retry = 1 ; $retry <= kMaxRetries && !$success && !$self->error() ; $retry++ ) {
        $self->{_parser} = {};

        unless ( $self->{_parser}->{home} = $self->loginRequired ? $self->_loginHomePage : $self->_fetchHomePage ) {
            Log->info( "Failed to fetch homepage.  Retry ( $retry of " . kMaxRetries . ")" );

            #die "Authentication failed" if( $retry > 1 );
            if ( $retry > 1 ) {
                Log->error("Authentication failed");
                return;
            }
            next;
        }

        $success = 1;
    }

    unless ($success) {
        $self->{_error} = "Service authentication failed for service" unless ( $self->error );
        Log->info( "ERROR: " . $self->error() ) if ( $self->error );
        $self->fail( failure => $self->error );
    }

    return $success;
}

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 loginRequired { shift->{_loginRequired} }

sub _isLoginPage {
    my $self = shift;
    my $parser = shift || die;

    if ( $parser->Login ) {
        $self->{_loginRequired} = 1;
        Log->info("Not authenticated!");
        return 1;
    }

    $self->{_loginRequired} = undef;

    return;
}

sub _loginHomePage {
    my $self = shift;
    my ( $uname, $passwd ) = $self->_credentials();
    my $credentials = { theAccountName => $uname, theAccountPW => $passwd };

    Log->info(" + Login to homepage");

    assert( $uname,  "Username required" );
    assert( $passwd, "Password required" );

    return $self->_fetchHomePage($credentials);
}

sub _fetchHomePage {
    my $self        = shift;
    my $credentials = shift;

    Log->info(" + Fetch homepage");
    my $fetcher = $self->_fetchPage( kLoginURL, form => $credentials ) || return;

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

    return $self->_isLoginPage($parser) ? undef : $parser;
}

sub _fetchPage {
    my $self = shift;
    my $url  = shift;
    my %args = @_;

    my $fetcher = $self->_getFetchObject($url);

    if ( $fetcher->fetch(%args) ) {
        return $fetcher;
    } else {
        $self->{_error} = "Fetch failed.  HTTP Code: " . $fetcher->errorCode();
        return;
    }
}

1;
