#---------------------------------------------------------------
# ____                   _ _         ____  _
#|  _ \ ___  _   _  __ _| | |_ _   _/ ___|| |__   __ _ _ __ ___
#| |_) / _ \| | | |/ _` | | __| | | \___ \| '_ \ / _` | '__/ _ \
#|  _ < (_) | |_| | (_| | | |_| |_| |___) | | | | (_| | | |  __/
#|_| \_\___/ \__, |\__,_|_|\__|\__, |____/|_| |_|\__,_|_|  \___|
#            |___/             |___/
#
# Copyright (C) 2011 RoyaltyShare, Inc.   All Rights Reserved
#---------------------------------------------------------------
package BookPub::Sale::Feed::SaleFeedList;
use strict;
use warnings;

use Data::Dumper;

use lib '/app/tools/common/lib';
use Common::Assert;
use lib '/app/tools/bookpub/lib';
use BookPub::DB::Item::SaleFeed;
use BookPub::Sale::Feed::SaleFeed;
use BookPub::Sale::Feed::SaleFeedFileList;

use base 'Common::FormObject::List';

sub _itemName { return 'SaleFeed'; }

sub _getCollection {
    my ( $self, %args ) = @_;
    my $saleFeedServiceID = $args{saleFeedServiceID};

    $self->{_saleFeedServiceID} = $saleFeedServiceID;

    return $saleFeedServiceID
      ? BookPub::DB::Item::SaleFeed->GetAllBySaleFeedServiceID($saleFeedServiceID)
      : BookPub::DB::Item::SaleFeed->GetAll();
}

sub _getObj {
    my ( $self, $dbItem ) = @_;
    assert($dbItem);

    return BookPub::Sale::Feed::SaleFeed->new( dbItem => $dbItem, readOnly => 1 );
}

sub fetch {
    my $self              = shift;
    my $saleFeedServiceID = $self->{_saleFeedServiceID} || return;
    my $service           = new BookPub::Sale::Feed::SaleFeedService( saleFeedServiceID => $saleFeedServiceID );

    die "Sale Feed Service not found.  sale feed service id: $saleFeedServiceID" unless ( $service->SaleFeedServiceID );

    Log->info("Fetching all available files for sale feed service: $saleFeedServiceID");

    my $request =
      BookPub::RDAS::Request::SaleFeedFileList->GetRequestObject( $service->ServiceID, saleFeedServiceID => $saleFeedServiceID );

    #die "Failed file list request for sale feed service id: $saleFeedServiceID" unless( $request->run() );
    #
    # Rather than dying here, let's just log the error and keep things moving along.
    # That way we can still process feeds for other clients. FB16354
    unless ( $request->run() ) {
        Log->error("Failed file list request for sale feed service id: $saleFeedServiceID");
        return;
    }

    my $feeds = $request->Feeds();

    unless ($feeds) {
        Log->error("No sales feeds found");
        return;
    }

    my $itemName = $self->_itemName();

    foreach my $fetchedFeed (@$feeds) {
        my $storedFeed = new BookPub::Sale::Feed::SaleFeed(
            customName        => $fetchedFeed->{name},
            name              => $fetchedFeed->{feed},
            saleFeedServiceID => $saleFeedServiceID
        );

        unless ( $storedFeed->SaleFeedID ) {
            Log->notice("  - Storing sales feed: $fetchedFeed->{feed}");
            $storedFeed->save();
            push( @{ $self->{$itemName} }, $storedFeed );
        }
    }
}

1;
