package RDAS::Request;

use Carp;

use lib '/app/tools/common/lib';
use base 'RDAS::RDAS';

sub _validOptions {
    return qw( url cache_fetch );
}

sub content { shift->{_content} }
sub error   { shift->{_error} }

sub run {
    my $self = shift;

    if ( $self->fetch() ) {
        $self->parse();
        $self->respond();
    }
}

sub userAgent { }

sub fetch {
    my $self  = shift;
    my $fetch = $self->_getFetchObject()
      || die "No fetch object created, can not continue";

    $self->{_content} = $fetch->content();

    if ( $fetch->success ) {
        return 1;
    } else {
        $self->fail( code => $fetch->errorCode );
        return;
    }
}
sub _getFetchObject { confess "Must be overloaded" }

sub parser { shift->{_parser} }

sub parse {
    my $self = shift;
    my $parse = $self->_getParserObject( $self->_parserObjectArgs( content => $self->{_content} ) )
      || die "No parser object created, can not continue";

    $self->{_parser} = $parse;

    $self->parser->parse();
}
sub _parserObjectArgs { shift; return @_ }
sub _getParserObject { confess "Must be overloaded" }

sub fail {
    my $self     = shift;
    my $response = $self->_getResponseObject();

    return $response->fail(@_) if ($response);
}

sub respond {
    my $self     = shift;
    my $response = $self->_getResponseObject();

    return $response->run() if ($response);
}
sub _getResponseObject { confess "Must be overloaded" }

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;
