package BookPub::Import::Importer::Booktopia;

use strict;

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

use Date::Calc qw( Add_Delta_YM );

sub _headerIdentifier { ( rIsbn13 => 'ISBN' ) }

sub _fieldMap {
    my $self = shift;

    my %fieldMap = (
        1 => {
            serviceProductID => 'A',
            currencyCode     => 'K',
            countryCode      => 'J',
            rIsbn13          => 'B',
            rTitle           => 'C',
            rAuthor          => 'D',
            rUnits           => 'E',
            rListPrice       => 'F',
            rDiscount        => 'G',
            rUnitPrice       => 'H',
            rRevenue         => 'I',
        },
        2 => {
            serviceProductID => 'A',
            currencyCode     => 'K',
            countryCode      => 'J',
            rIsbn13          => 'B',
            rTitle           => 'C',
            rAuthor          => 'D',
            rUnits           => 'E',
            rListPrice       => 'F',
            rTaxAmount       => 'G',
            rDiscount        => 'H',
            rRevenue         => 'I',
        },
    );

    return $fieldMap{ $self->_version() };
}

sub _useIsSaleRec              { 1 }
sub _autoParseTitleAndSubtitle { 1 }

sub purchaseType { BookPub::DB::Item::Sale::kPurchaseTypeDownload }
sub priceType    { 'agencyplustax' }
sub productType  { BookPub::DB::Item::Sale::kProductTypeEBook }

sub _isSaleRec {
    my $self = shift;

    my $isbn   = $self->_getByFieldName('rIsbn13');
    my $title  = $self->_getByFieldName('rTitle');
    my $author = $self->_getByFieldName('rAuthor');

    # We're going to skip the subtotal lines, which are blank for these fields
    if ( !$isbn && !$title && !$author ) {
        return 0;
    }

    return $self->SUPER::_isSaleRec();
}

sub rRevenue {
    my $self = shift;

    if ( defined $self->_getByFieldName('rTaxAmount') ) {
        my $revenue = $self->_getByFieldName('rRevenue');
        my $tax     = $self->_getByFieldName('rTaxAmount');

        return $revenue - $tax;
    } else {
        return $self->_getByFieldName('rRevenue');
    }
}

sub rTaxAmount {
    my $self = shift;

    if ( defined $self->_getByFieldName('rTaxAmount') ) {
        return $self->_getByFieldName('rTaxAmount');
    } else {
        my $revenue   = $self->_getByFieldName('rRevenue');
        my $unitPrice = $self->_getByFieldName('rUnitPrice');

        return $unitPrice - $revenue;
    }
}

my %months = (
    january   => 1,
    february  => 2,
    march     => 3,
    april     => 4,
    may       => 5,
    june      => 6,
    july      => 7,
    august    => 8,
    september => 9,
    october   => 10,
    november  => 11,
    december  => 12,
);

sub dateBegin {
    my $self = shift;
    my $file = $self->filename;

    $file =~ /(\w{3,9}) -?\s?(\d{4})\./;

    $self->fail("Failed to determine start date from filename ($file)") unless ($1);

    my $startDate = sprintf( "%04d-%02d-%02d", $2, $months{ lc($1) }, 1 );
    my $date = new Common::Date( date => $startDate, type => 'iso' );

    return $date->monthBegin();
}

sub dateEnd {
    my $self = shift;
    my $file = $self->filename;

    $file =~ /(\w{3,9}) -?\s?(\d{4})\./;

    $self->fail("Failed to determine end date from filename ($file)") unless ($1);

    my $endDate = sprintf( "%04d-%02d-%02d", $2, $months{ lc($1) }, 1 );
    my $date = new Common::Date( date => $endDate, type => 'iso' );

    return $date->monthEnd();
}

1;
