package Support::News::Feed;
use strict;

use lib '/app/tools/common/lib';
use lib '/app/tools/raptor/lib';
use lib '/app/tools/support/lib';

use Common::Assert;

use base 'Common::XMLObject';

use LWP::Simple;
use XML::Simple;

use Data::Dumper;

sub _init {
    my ( $self, %args ) = @_;

    if ( $args{dbItem} ) {
        $self->_initFromDBItem( $args{dbItem} );
    } elsif ( defined $args{feedID} ) {
        $self->_initFromID( $args{feedID} );
    }

    return $self;
}

sub _initFromID {
    my ( $self, $id ) = @_;

    my $dbItem = Common::DB::Item::Feed->Lookup( feed_id => $id );
    return $self->_initFromDBItem($dbItem);
}

sub _initFromDBItem {
    my ( $self, $dbItem ) = @_;
    my $properties = {};

    foreach my $fieldName ( keys %$dbItem ) {
        next if '_' eq substr( $fieldName, 0, 1 );
        $properties->{$fieldName} = $dbItem->$fieldName;
    }

    $self->_initProperties($properties);
}

sub _initProperties {
    my $self       = shift;
    my $properties = shift;

    $self->{FeedID}   = $properties->{feed_id};
    $self->{Name}     = $properties->{name};
    $self->{Keywords} = $properties->{keywords};
    $self->{URL}      = $properties->{url};
    $self->{Product}  = $properties->{product};
}

sub error { shift->{_error} }

sub getNews {
    my $self = shift;
    my @news;

    assert( $self->{URL} );

    Common::Log::Debug( "Fetching RSS from " . $self->{URL} );

    my $content = get( $self->{URL} );

    unless ($content) {
        $self->{_error} = "Failed to fetch URL: $self->{URL}";
        return;
    }

    my $hash;

    eval { $hash = XMLin($content) };

    if ($@) {
        $self->{_error} = "Failed to parse XML: $self->{URL}\n$@";
        return;
    }

    @news = $self->_parseRSS($hash);
    unless (@news) {
        $self->{_error} = "No news found: $self->{URL}";
        return;
    }

    return @news;
}

sub _parseRSS {
    my $self = shift;
    my $rssHash = shift || return;
    my @added;

    my $items = $rssHash->{channel}->{item};
    $items = [$items] unless ( ref($items) eq 'ARRAY' );

    foreach my $item (@$items) {
        my $obj = new Support::News::News( rssdata => $item, feedID => $self->{FeedID} );
        push( @added, $obj ) if ($obj);
    }

    return @added;
}

1;
