package BookPub::Import::Importer::Google::Version21;

use strict;
use Data::Dumper;

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

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

sub _fieldMap {
    {
        isPreOrder         => 'F',
        purchaseType       => 'D',
        currencyCode       => 'Z',
        conversionRate     => 'AB',
        countryCode        => 'R',
        rState             => 'S',
        rPostalCode        => 'T',
        dateBegin          => 'B',
        rIsbn13            => 'I',    # Labeled 'Primary ISBN'
        rTitle             => 'L',
        rAuthor            => 'M',
        rImprint           => 'K',
        rUnits             => 'H',
        rSales             => 'E',
        rReturns           => 'E',
        rListPrice         => 'O',
        rListPriceCurrency => 'N',
        rPurchasePrice     => 'Q',
        rDiscount          => 'W',
        rRevenue           => 'X',
    };
}

sub _unverifiedFieldMap {
    {
        eIsbn              => 'J',    # Labeled 'Secondary ISBN'
        transactionType    => 'E',
        unconvertedRevenue => 'Y',
        convertedRevenue   => 'AA',
    };
}

sub _useIsSaleRec { 1 }

sub purchaseType {
    my $self         = shift;
    my $purchaseType = $self->_getByFieldName('purchaseType');
    if ( $purchaseType =~ /Single Purchase/i ) {
        return BookPub::DB::Item::Sale::kPurchaseTypeDownload;
    } elsif ( $purchaseType =~ /Rental 90-Day/i ) {
        return BookPub::DB::Item::Sale::kPurchaseTypeLoan;
    } elsif ( $purchaseType =~ /Rental 90 Days/i ) {
        return BookPub::DB::Item::Sale::kPurchaseTypeLoan;
    } elsif ( $purchaseType =~ /Rental DAY_90/i ) {
        return BookPub::DB::Item::Sale::kPurchaseTypeLoan;
    } elsif ( $purchaseType =~ /Rental DAY_180/i ) {
        return BookPub::DB::Item::Sale::kPurchaseTypeLoan;
    } elsif ( $purchaseType =~ /Rental 180-Day/i ) {
        return BookPub::DB::Item::Sale::kPurchaseTypeLoan;
    } elsif ( $purchaseType =~ /Rental 180 Days/i ) {
        return BookPub::DB::Item::Sale::kPurchaseTypeLoan;
    } elsif ( $purchaseType =~ /school purchase/i ) {
        return BookPub::DB::Item::Sale::kPurchaseTypeDownload;
    } else {
        $self->fail("Unrecognized purchase type: $purchaseType");
    }
}

sub rIsbn13 {
    my $self    = shift;
    my $rIsbn13 = $self->_getByFieldName('rIsbn13');
    my $eIsbn   = $self->_getByFieldName('eIsbn');
    $rIsbn13 =~ s/'//g;
    $eIsbn =~ s/'//g;

    if ( !$rIsbn13 || $rIsbn13 eq 'N/A' ) {
        return $eIsbn;
    }

    return $rIsbn13;
}

sub rRevenue {
    my $self            = shift;
    my $revenue         = $self->_getByFieldName('rRevenue');
    my $conversionRate  = $self->conversionRate;
    my $transactionType = $self->_getByFieldName('transactionType');

    $revenue =~ s/,//g;
    $revenue *= $conversionRate;

    if ( $transactionType =~ /refund/i && $revenue > 0 ) {
        $revenue *= -1;
    }

    return $revenue;
}

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

    # If the conversion rate is missing, let's try to take our best guess.
    if ( !$conversionRate ) {
        my $convertedRevenue = $self->_getByFieldName('convertedRevenue');
        $convertedRevenue =~ s/,//g;
        my $foreignRevenue = $self->_getByFieldName('unconvertedRevenue');
        $foreignRevenue =~ s/,//g;
        if ( $foreignRevenue && $foreignRevenue != 0 ) {
            $conversionRate = $convertedRevenue / $foreignRevenue;
        }
    }

    return $conversionRate;
}

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

    # For Wiley, we're going to set the currency code to the revenue currency.
    # We'll also be converting the list pricewith the conversion rate
    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');

    # For Wiley, we're going to convert the list price to the revenue currency
    # with the conversion rate
    if ( $self->listPriceRequired && $listPriceCurrency && $listPriceCurrency ne $revenueCurrency && $listPrice != 0 ) {
        $listPrice =~ s/,//g;

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

    return $listPrice;
}

###
1;    # Play nicely.
###
