package BookPub::RDAS::Response::ProductPrice::Apple;

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

use lib '/app/tools/bookpub/lib';
use BookPub::RDAS::URL::ProductPrice::Apple;

use base 'BookPub::RDAS::Response::ProductPrice';

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

sub run {
    my $self = shift;

    assert( $self->serviceID, "Service ID required" );
    assert( $self->productID, "Product ID required" );
    assert( $self->parser,    "Parser required" );

    Log->info("Validating parsed data");

    my $parsers = $self->parser;

    foreach my $key ( keys(%$parsers) ) {
        Log->info("Parser validate: $key");
        my $error = $self->parser->{$key}->validate() if ( $self->parser->{$key} );
        last if ($error);
    }

    # Updating product page URL
    $self->_replaceProductURL();

    if ($error) {
        $self->fail( failure => $error );
    } else {
        $self->_storeData();
    }
}

sub _replaceProductURL {
    my $self          = shift;
    my $productParser = $self->parser->{product} || return;
    my $generated     = BookPub::RDAS::URL::ProductPrice::Apple->ProductPageURL() . $productParser->AppleID;

    my $url = new BookPub::RDAS::URL::ProductPrice::Apple( productID => $self->productID, serviceID => $self->serviceID );
    $url->replaceURL($generated) if ( !$url->url || $url->url ne $generated );
}

sub _getAvailabilityData {
    my $self = shift;

    my $parser    = $self->parser->{metadata};
    my $available = 'not_available';

    if ($parser) {
        $available =
            $parser->available() < 0 ? 'pre_order'
          : $parser->available() > 0 ? 'available'
          :                            'not_available';
    }

    return { availability => $available };
}

sub _getMetadata {
    my $self = shift;

    my $productParser  = $self->parser->{product};
    my $metadataParser = $self->parser->{metadata};

    my $fields = {
        title   => $metadataParser->Title(),
        authors => $metadataParser->Author(),
    };

    if ($productParser) {
        $fields->{isbn13} = $productParser->ISBN13();
    } else {
        $fields->{isbn13} = $self->_getLastISBN();
    }

    return $fields;
}

sub _getLastISBN {
    my $self = shift;

    my $dbItem =
      BookPub::DB::Item::ProductMonitorItemBookMetadata->GetCurrent( product_id => $self->productID, service_id => $self->serviceID );

    return $dbItem ? $dbItem->isbn13 : undef;
}

sub _getPriceData {
    my $self = shift;

    #my $parser = $self->parser->{price} || $self->parser->{metadata};
    my $parser = $self->parser->{metadata};

    my $fields = { price => $parser->ProductPrice(), };

    return $fields;
}

sub _getCoverArtData {
    my $self = shift;

    my $parser = $self->parser->{metadata};

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

    return $fields;
}

1;
