package BookPub::Import::Importer::TheBookPeople::Version2;

use strict;

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

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

sub _fieldMap {
    {
        currencyCode       => 'F',
        countryCode        => 'D',
        dateBegin          => 'J',
        rProductType       => 'C',
        isbn               => 'A',
        rTitle             => 'B',
        rSales             => 'L',
        rReturns           => 'M',
        rListPrice         => 'G',
        rListPriceCurrency => 'F',
        rPurchasePrice     => 'H',
        rRevenue           => 'I',
    };
}

sub purchaseType { BookPub::DB::Item::Sale::kPurchaseTypeDownload }
sub priceType    { 'rrp' }

# in the returns worksheet, they report one return as Order Qty (rSales) = 1 and
# Return Qty (rReturns) = 1, so if they're equal, we return a zero for rSales
sub rSales {
    my $self    = shift;
    my $sales   = $self->_getByFieldName('rSales');
    my $returns = $self->_getByFieldName('rReturns');

    my $validTabNames = _validTabNames();
    if (   $self->sheetname() =~ /@$validTabNames[1]/i
        && $self->sheetname() !~ /'ytd'/i
        && $sales == $returns ) {
        return 0;
    }

    return $sales;
}

# in the returns worksheet, they report one return as Order Qty (rSales) = 1 and
# Return Qty (rReturns) = 1, so if they're equal, we return a zero for rReturns
sub rReturns {
    my $self    = shift;
    my $sales   = $self->_getByFieldName('rSales');
    my $returns = $self->_getByFieldName('rReturns');

    my $validTabNames = _validTabNames();
    if (   $self->sheetname() =~ /@$validTabNames[1]/i
        && $self->sheetname() !~ /'ytd'/i
        && $sales == $returns ) {
        return 0;
    }

    return $returns;
}

sub rRevenue {
    my $self    = shift;
    my $sales   = $self->_getByFieldName('rSales');
    my $returns = $self->_getByFieldName('rReturns');
    my $revenue = $self->_getByFieldName('rRevenue');

    my $validTabNames = _validTabNames();
    if (   $self->sheetname() =~ /@$validTabNames[1]/i
        && $self->sheetname() !~ /'ytd'/i
        && $sales == $returns ) {
        return 0;
    }

    return $revenue;
}

sub units {
    my $self    = shift;
    my $sales   = $self->_getByFieldName('rSales');
    my $returns = $self->_getByFieldName('rReturns');

    my $validTabNames = _validTabNames();
    if (   $self->sheetname() =~ /@$validTabNames[1]/i
        && $self->sheetname() !~ /'ytd'/i
        && $sales == $returns ) {
        return 0;
    }

    return $self->SUPER::units();

}

sub _getDateBegin {
    my $self = shift;
    my $date = $self->_getByFieldName('dateBegin') || return;
    my ( $month, $day, $year );
    my %months = (
        jan => 1,
        feb => 2,
        mar => 3,
        apr => 4,
        may => 5,
        jun => 6,
        jul => 7,
        aug => 8,
        sep => 9,
        oct => 10,
        nov => 11,
        dec => 12,
    );

    # extract month name, day, year
    # they started with DD-MMM-YYYY (13-JAN-2013)
    if ( $date =~ /^(\d{2})-(\w{3})-(\d{4})/ ) {
        $day   = $1;
        $month = $months{ lc($2) };
        $year  = $3;

        # and moved to iso, YYYY-MM-DD
    } elsif ( $date =~ /^(\d{4})-(\d{2})-(\d{2})/ ) {
        $year  = $1;
        $month = $2;
        $day   = $3;
    } else {
        $self->fail("Unexpected date format: $date");
    }

    $date = sprintf( "%04d-%02d-%02d", $year, $month, $day );

    return $date;
}

sub productType {
    my $self = shift;

    my $productType = $self->_getByFieldName('rProductType');

    if ( lc($productType) eq 'ebook' ) {
        return BookPub::DB::Item::Sale::kProductTypeEBook;
    } else {
        $self->fail("Unknown product type: $productType");
        return undef;
    }
}

sub _validTabNames { [ 'eBook Sales', 'eBook Returns' ] }

sub _isValidSaleRecord {
    my $self = shift;

    # Only process sales from the valid sheets
    my $validTab;
    my $validTabNames = _validTabNames();
    foreach my $validTabName (@$validTabNames) {
        if ( $self->sheetname() =~ /$validTabName/i && $self->sheetname() !~ /ytd/i ) {
            $validTab = 1;
        }
    }
    return undef unless $validTab;

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

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