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

use lib '/app/tools/common/lib';
use Common::Date;
use Common::Assert;

use lib '/app/tools/bookpub/lib';
use BookPub::DB::Item::POSFeed;

use base 'Common::FormObject';

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

    $self->SUPER::_init(%args);

    my %properties;
    if ( $args{dbItem} ) {
        $self->_propertiesFromDBItem( \%properties, $args{dbItem} );
    } elsif ( $args{posFeedID} ) {
        $self->_propertiesFromDB( \%properties, $args{posFeedID} );
    } elsif ( $args{serviceID} ) {
        $self->_propertiesFromServiceID( \%properties, $args{serviceID} );
    } else {
        $self->_propertiesFromDefaults( \%properties );
    }

    $self->_initProperties( \%properties );

    return $self;
}

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

    my $dbItem = BookPub::DB::Item::POSFeed->Lookup( pos_feed_id => $id );

    $self->_propertiesFromDBItem( $hrProperties, $dbItem );
}

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

    my $dbItem = BookPub::DB::Item::POSFeed->Lookup( service_id => $id );

    die "No feed found for service id $id" unless ($dbItem);

    $self->_propertiesFromDBItem( $hrProperties, $dbItem );
}

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

    $hrProperties->{pos_feed_id}   = $dbItem->pos_feed_id;
    $hrProperties->{service_id}    = $dbItem->service_id;
    $hrProperties->{start_date}    = $dbItem->start_date;
    $hrProperties->{last_download} = $dbItem->last_download;
}

sub _initProperties {
    my ( $self, $props ) = @_;

    $self->{POSFeedID}    = $props->{pos_feed_id};
    $self->{ServiceID}    = $props->{service_id};
    $self->{StartDate}    = $props->{start_date};
    $self->{LastDownload} = $props->{last_download};
}

sub isPassedStartDate {
    my $self   = shift;
    my $dateIn = shift;
    my ($date) = split( /T/, $dateIn );

    assert($date);

    return 1 unless ( $self->StartDate );
    return 1 if ( $self->StartDate eq '0000-00-00' );

    my $inputDate = new Common::Date($date);
    my $startDate = new Common::Date( $self->StartDate );

    return $inputDate->asString ge $startDate->asString;
}

sub isNew {
    my $self   = shift;
    my $dateIn = shift;
    my ($date) = split( /T/, $dateIn );

    assert($date);

    return 1 unless ( $self->LastDownload );
    return 1 if ( $self->LastDownload eq '0000-00-00' );

    my $inputDate = new Common::Date($date);
    my $lastDate  = new Common::Date( $self->LastDownload );

    if ( $inputDate->asString gt $lastDate->asString ) {
        Log->info( $inputDate->asString . " gt " . $lastDate->asString );
        return 1;
    } else {
        Log->info( $inputDate->asString . " NOT gt " . $lastDate->asString );
        return;
    }
}

sub setLastDownload {
    my $self = shift;
    my $date = shift || return;

    # Don't save anything unless the date passed in is newer than what's stored
    return unless ( $self->isNew($date) );

    assert( $self->POSFeedID );

    my $dbItem = BookPub::DB::Item::POSFeed->Lookup( pos_feed_id => $self->POSFeedID );
    $dbItem->last_download($date);
    $dbItem->save;

    $self->_init( dbItem => $dbItem );
}

###
1;    #
###
