package BookPub::Import::Importer::Bookshop::v2;

use strict;
use warnings;

use lib '/app/tools/bookpub/lib';
use base 'BookPub::Import::Importer';

sub _fieldMap {
    {
        dateBegin          => 'I',
        dateEnd            => 'I',
        rAuthor            => 'N',
        rTitle             => 'M',
        rIsbn13            => 'L',
        rState             => 'D',
        rPostalCode        => 'H',
        countryCode        => 'C',
        rTaxAmount         => 'AB',
        rUnits             => 'O',
        rListPrice         => 'P',
        rListPriceCurrency => 'R',
        rRevenue           => 'B',
        currencyCode       => 'R',
    }
}

sub _unverifiedFieldMap {
    {
        _main_product_id_type => 'K',
        line_item_id          => 'A',
    }
}

sub _headerIdentifier { rTitle => 'product_title' }

sub rServiceName  { 'Bookshop' }
sub priceType     { 'agency' }
sub _useIsSaleRec { 1 }
sub purchaseType  { BookPub::DB::Item::Sale::kPurchaseTypeDownload }
sub productType { BookPub::DB::Item::Sale::kProductTypeEBook }

sub dateBegin {
    my $self = shift;

    my $date = $self->_getByFieldName('dateBegin') || '';
    $date = int($date) if ( $date =~/\./ );

    my ($d, $m, $y);

    # YYYYMMDD
    if ( ($y, $m, $d) = $date =~ /(\d{4})(\d{2})(\d{2})$/) {
        return sprintf "%04d-%02d-%02d", $y, $m, $d;
    }

    $self->fail("dateBegin '$date' is not in correct format");
}

sub dateEnd {
    my $self = shift;

    my $date = $self->_getByFieldName('dateEnd') || '';
    $date = int($date) if ( $date =~/\./ );

    my ($d, $m, $y);

    # YYYYMMDD
    if ( ($y, $m, $d) = $date =~ /(\d{4})(\d{2})(\d{2})$/) {
        return sprintf "%04d-%02d-%02d", $y, $m, $d;
    }

    $self->fail("dateEnd '$date' is not in correct format");
}

sub isFree {
    my $self = shift;

    return (((!$self->rRevenue || $self->rRevenue =~ /^0.0+/) && $self->rUnits) ? 'Y' : 'N');
}

sub rIsbn13 {
    my $self = shift;

    my $type = $self->_getByFieldName('_main_product_id_type') || "";
    my $isbn13 = $self->_getByFieldName('rIsbn13') || "";

    return $isbn13 if ($type =~ /^ISBN.13$/i);

    $self->fail("main_product_id_type ('$type') is not ISBN-13");
}

sub rUnits {
    my $self = shift;

    my $units = $self->_getByFieldName('rUnits') || 0;

    return int($units);
}

sub _isSaleRec {
    my $self = shift;

    my $lineItemId = $self->_getByFieldName('line_item_id') || '';
    return 0 if $lineItemId =~ /^Total/i;

    my $units = $self->rUnits;
    my $revenue = $self->rRevenue || 0;

    return $units || $revenue;
}

1;
