package BookPub::Import::Importer::Knovel;

use strict;
use warnings;

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

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

sub _fieldMap {
    my $self = shift;

    my %fieldMap = (
        1 => {
            dateBegin        => 'P9',
            rTitle           => 'J',
            rIsbn13          => 'H',
            serviceProductID => 'B',
            rUnitPrice       => 'L',
            rDiscount        => 'N',
            rRevenue         => 'P',
        },
    );

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

sub _useIsSaleRec              { 1 }
sub _autoParseTitleAndSubtitle { 1 }
sub _dateNormalization         { 'quarter' }
sub _getDateEnd                { shift->{_dateBegin} }
sub countryCode                { 'US' }
sub currencyCode               { 'USD' }
sub priceType                  { 'rrp' }
sub rUnits                     { shift->units }
sub rProductType               { BookPub::DB::Item::Sale::kProductTypeEBook }
sub productType                { BookPub::DB::Item::Sale::kProductTypeEBook }
sub purchaseType               { BookPub::DB::Item::Sale::kPurchaseTypeStream }

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 rServiceName {
    return BookPub::Tracker::Service::GetDefaultServiceName( service_id => shift->serviceID );
}

sub _getDateBegin {
    my $self = shift;

    if ( $self->{_dateBegin} ) {
        return $self->{_dateBegin};
    }

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

    if ( $date =~ /(\w+) - \w+ (\d{4})/i ) {
        my $month = $months{ lc($1) };
        my $year  = $2;

        if ($month) {

            # Need to set this to the beginning of the quarter.
            $self->{_dateBegin} = $year . "-" . $month . "-01";
            return $self->{_dateBegin};
        }
    }

    # Didn't find it?  Give up.
    if ( !$self->{_dateBegin} ) {
        $self->errstr('Unable to find date in header');
        return undef;
    }
}

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

    if ( $revenue < 0 ) {
        return -1;
    } else {
        return 1;
    }
}

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

sub rTitle {
    my $self  = shift;
    my $title = $self->_getByFieldName('rTitle') || '';
    $title =~ tr/\x20-\x7f//cd;

    if ( $title =~ /^(\d{4}-)(.*)$/ ) {
        $title = $2;
    }

    return $title;
}

sub _isSaleRec {
    my $self      = shift;

    my $title    = $self->_getByFieldName('rTitle');
    my $isbn     = $self->_getByFieldName('rIsbn13');
    my $rRevenue = $self->_getByFieldName('rRevenue');
    return unless $title && $isbn && $rRevenue;

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


1;
