package BookPub::Import::Importer::Google::Version22;

use strict;
use warnings;

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

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

sub _fieldMap {
    {
        rPurchaseType      => 'D',
        isPreOrder         => 'F',
        currencyCode       => 'T',
        countryCode        => 'Q',
        dateBegin          => 'B',
        rIsbn13            => 'H',
        rTitle             => 'J',
        rAuthor            => 'K',
        rImprint           => 'I',
        rUnits             => 'G',
        rSales             => 'E',
        rReturns           => 'E',
        rListPrice         => 'P',
        rListPriceCurrency => 'N',
        rDiscount          => 'R',
        rCOGS              => 'R',
        rRevenue           => 'U',
        rDuration          => 'D',
    };
}

sub _unverifiedFieldMap {
    { nativeRevenue => 'S', };
}

sub rServiceName {
    return BookPub::Tracker::Service::GetDefaultServiceName( service_id => shift->serviceID );
}

sub productType { shift->rProductType }

sub _getDateBegin {
    my $self = shift;

    my $date = $self->_getByFieldName('dateBegin') || '';

    # m/d/yy ==> YYYY-MM-DD
    if ( $date =~ /^(\d{1,2})\/(\d{1,2})\/(\d{2})$/ ) {
        $date = sprintf "%04d-%02d-%02d", "20$3", $1, $2;
    }

    return $date;
}

sub rProductType {
    my $self = shift;

    my $fileName = $self->filename;
    return BookPub::DB::Item::Sale::kProductTypeAudioBook if $fileName =~ /^Audiobooks[_ ]?/i;

    return BookPub::DB::Item::Sale::kProductTypeEBook;
}

sub purchaseType {
    my $self         = shift;
    my $purchaseType = $self->_getByFieldName('rPurchaseType');

    if ( uc($purchaseType) eq "RENTAL 180 DAYS" || uc($purchaseType) eq "SCHOOL USE 360 DAYS" ) {
        return BookPub::DB::Item::Sale::kPurchaseTypeLoan;
    } elsif ( uc($purchaseType) eq "SINGLE PURCHASE" ) {
        return BookPub::DB::Item::Sale::kPurchaseTypeDownload;
    } else {
        $self->fail("Could not determine purchase type from $purchaseType");
    }
}

sub rDuration {
    my $self     = shift;
    my $duration = $self->_getByFieldName('rDuration');

    if ( uc($duration) eq "RENTAL 180 DAYS" || uc($duration) eq "SCHOOL USE 360 DAYS" ) {
        return $duration;
    }
}

sub priceType {
    my $self     = shift;
    my $clientID = Common::RSApp::GetClientID();

    # MMUS, MMUK and Wiley
    if ( $self->rDiscount == 0.7 && $clientID =~ /^(:?318|359|324)$/ && $self->productType eq BookPub::DB::Item::Sale::kProductTypeEBook ) {
        return 'agency';
    }

    return 'rrp';
}

sub rSales {
    my $self  = shift;
    my $sales = $self->SUPER::rSales();
    my $units = $self->SUPER::rUnits();

    return $sales eq "Sale" ? $units : 0;
}

sub rReturns {
    my $self    = shift;
    my $returns = $self->SUPER::rReturns();
    my $units   = $self->SUPER::rUnits();

    return $returns eq "Refund" ? abs($units) : 0;
}

sub rDiscount {
    my $self     = shift;
    my $discount = $self->SUPER::rCOGS();

    return 1 - $discount;
}

sub rRevenue {
    my $self    = shift;
    my $revenue = $self->SUPER::rRevenue();
    $revenue =~ s/,//g;

    return $revenue;
}

sub conversionRate {
    my $self           = shift;
    my $conversionRate = 1;

    my $nativeRevenue = $self->_getByFieldName('nativeRevenue');
    $nativeRevenue =~ s/,//g;
    if ($nativeRevenue && $self->isFree ne 'Y') {
        $conversionRate = $self->rRevenue / $nativeRevenue;
    }

    return $conversionRate;
}

sub rListPriceCurrency {
    my $self              = shift;
    my $listPriceCurrency = $self->_getByFieldName('rListPriceCurrency');
    my $revenueCurrency   = $self->_getByFieldName('currencyCode');

    if ( $self->listPriceRequired && $listPriceCurrency ) {
        $listPriceCurrency = $revenueCurrency;
    }

    return $listPriceCurrency;
}

sub rListPrice {
    my $self              = shift;
    my $listPrice         = $self->_getByFieldName('rListPrice');
    my $listPriceCurrency = $self->_getByFieldName('rListPriceCurrency');
    my $revenueCurrency   = $self->_getByFieldName('currencyCode');

    if ( $self->listPriceRequired && $listPriceCurrency && $listPriceCurrency ne $revenueCurrency && $listPrice != 0 ) {
        $listPrice =~ s/,//g;

        my $conversionRate = $self->conversionRate;
        $listPrice *= $conversionRate;
    }

    return $listPrice;
}

sub isFree {
    my $self = shift;

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

1;
