package BookPub::Import::Importer::EBook::Version18;

use strict;

use Data::Dumper;
use POSIX;

use lib '/app/tools/common/lib';

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

sub _headerIdentifier { ( rTitle => 'Title' ) }

sub _fieldMap {
    {
        purchaseType         => 'I',
        rTitle               => 'D',
        rIsbn13              => 'G',
        rImprint             => 'C',
        countryCode          => 'T',
        serviceProductID     => 'E',
        rUnits               => 'M',
        rListPrice           => 'O',
        rListPriceCurrency   => 'N',
        rDiscount            => 'V',
        rRevenue             => 'W',
        currencyCode         => 'N',
        rChannel             => 'H',
        rPromoCode           => 'P',
        rModel               => 'J',
        rTransactionCategory => 'I',
    };
}

sub productType { BookPub::DB::Item::Sale::kProductTypeEBook }
sub formatType  { BookPub::DB::Item::Sale::kFormatTypeEBL }
sub priceType   { 'rrp' }

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

#sub rChannel {
#  my $self = shift;
#  my $channel = $self->_getByFieldName( 'rChannel' );
#
#  print STDERR "channel: " . $channel . "\n";
#  return $channel;
#}

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

    if ( lc($purchaseType) eq 'stl' ) {
        return BookPub::DB::Item::Sale::kPurchaseTypeLoan;
    } elsif ( lc($purchaseType) eq 'firm order' ) {
        return BookPub::DB::Item::Sale::kPurchaseTypeDownload;
    } elsif ( lc($purchaseType) =~ 'auto-purchase' ) {
        return BookPub::DB::Item::Sale::kPurchaseTypeDownload;
    } elsif ( lc($purchaseType) =~ 'upgrade' ) {
        return BookPub::DB::Item::Sale::kPurchaseTypeDownload;
    } elsif ($purchaseType) {
        $self->fail("Unknown purchase type '$purchaseType'");
    }
}

sub _dateFormat { [ 'numerical', 'quarter', 'iso' ] }

sub _getDateBegin {
    my $self = shift;
    $self->{_dateBegin} || $self->_setDates;
    return $self->{_dateBegin};
}

sub _getDateEnd {
    my $self = shift;
    $self->{_dateEnd} || $self->_setDates;
    return $self->{_dateEnd};
}

sub _setDates {
    my $self     = shift;
    my $filename = $self->filename;
    my ( $begin, $end );

    if ( $filename =~ m/(\d{4}Q\d)/ ) {
        my $get = $1;
        $get =~ s/Q/ Q/;
        ( $begin, $end ) = $self->_getDates( date_begin => $get, type => 'quarter' );
    }

    unless ( $begin && $end ) {
        die "Unable to determine date range from filename $filename";
    }

    $self->{_dateBegin} = $begin;
    $self->{_dateEnd}   = $end;
}

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

    # Need to round up any fractional units now.
    $units = ceil($units);

    if ( $revenue < 0 && $units > 0 ) {
        $units *= -1;
    }
    return $units;
}

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

    return $self->rTitle && ( $rIsbn13 || $self->rRevenue ) && $self->dateBegin;
}

1;
