package BookPub::RDAS::Response::ProductPrice::Amazon;

use lib '/app/tools/bookpub/lib';
use BookPub::DB::Item::BookProduct;
use BookPub::Catalog::Product::Book::WithPricing;
use base 'BookPub::RDAS::Response::ProductPrice';

sub serviceID { return BookPub::Tracker::Service::AMAZON() }

sub _storeProductData {
    my $self = shift;

    $self->SUPER::_storeProductData();

    $self->_storeRank();
}

sub _getMetadata {
    my $self = shift;

    my $titleStr = $self->parser->Title();
    my $format   = $self->parser->Format();
    my $title;
    my $subtitle;

    if ( $titleStr && $titleStr =~ /^(.*)\s+\[(.*)\]$/ ) {
        $titleStr = $1;
        $format = $2 unless ($format);
    }

    ( $title, $subtitle ) = split( /: /, $titleStr ) if ($titleStr);

    my $fields = {
        isbn10   => $self->parser->ISBN10(),
        isbn13   => $self->parser->ISBN13(),
        asin     => $self->parser->ASIN(),
        title    => $title,
        subtitle => $subtitle,
        authors  => $self->parser->Author(),
        imprint  => $self->parser->Publisher(),
        format   => $format,
    };

    return $fields;
}

sub _getPriceData {
    my $self  = shift;
    my $price = $self->parser->ProductPrice();

    my $fields = { price => $price, };

    return $fields;
}

sub _getCoverArtData {
    my $self = shift;

    my $fields = { cover_art_url => $self->parser->CoverURL(), };

    return $fields;
}

sub _getRankData {
    my $self = shift;

    return { rank => $self->parser->Rank() };
}

sub _storeRank {
    my $self = shift;

    my $productID = $self->productID;
    my $rank      = new BookPub::RDAS::Form::ProductMonitor::ProductMonitorItem::Rank(
        serviceID => $self->serviceID,
        productID => $productID
    );

    my $websiteData = $self->_getRankData();

    if ( $rank->requiresUpdate($websiteData) ) {
        $rank->create($websiteData);

        my $currencyCode = 'USD';
        my $countryCode  = 'US';
        my $product      = new BookPub::Catalog::Product::Book::WithPricing( productID => $productID );
        my $price        = $product->getPriceByCurrency($currencyCode);

        BookPub::DB::Item::BookProduct->UpdateAverageRank(
            product_id    => $productID,
            currency_code => $currencyCode,
            country_code  => $countryCode,
            price         => $price->Price()
        );

    } else {
        $rank->updateTimestamp();
    }
}

1;
