package BookPub::Import::Importer::WilloLabs::v1;

use strict;
use warnings;


use lib '/app/tools/common/lib';
use Date::Calc qw(Days_in_Month);

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


sub _fieldMap {
    {
        dateBegin     => 'T',
        rPurchaseType => 'I',
        rProductType  => 'M',
        rAuthor       => 'L',
        rTitle        => 'K',
        rIsbn13       => 'H',
        rInstitution  => 'A',
        rState        => 'W',
        rPostalCode   => 'W',
        countryCode   => 'V',
        rReturns      => 'R',
        rUnits        => 'Q',
        rUnitPrice    => 'N',
        rListPrice    => 'O',
        rDiscount     => 'J',
        rRevenue      => 'S',
        currencyCode  => 'X',
        rModel        => 'I',
    };
}

sub _headerIdentifier { rIsbn13 => 'Digital ISBN' }

sub _useIsSaleRec      { 1 }
sub rServiceName       { 'Willo Labs' }
sub priceType          { 'rrp' }
sub rListPriceCurrency { 'USD' }

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,
);

sub dateBegin {
    my $self = shift;

    my $date = $self->_getByFieldName('dateBegin') || '';
    # Month YYYY
    if ( $date =~ /^(\w{3})\w{6} (\d{4})$/i ) {
        return sprintf "%04d-%02d-%02d", $2, $months{ lc $1 }, 1;
    }
    # M/D/YYYY
    elsif ( $date =~ /^(\d{1,2})[-\/.](\d{1,2})[-\/.](\d{4})$/ ) {
        return sprintf "%04d-%02d-%02d", $3, $1, $2;
    }
    # YYYY-MM-DD
    elsif ( $date =~ /^(\d{4})[-\/.](\d{1,2})[-\/.](\d{1,2})$/ ) {
        return sprintf "%04d-%02d-%02d", $1, $2, $3;
    }
    # Excel format
    elsif ( $date =~ /^\d{5}\..*$/ && $date > 38716 ) {
        return Spreadsheet::ParseExcel::Utility::ExcelFmt( "yyyy-mm-dd", int($date) );
    }

    $self->fail("Unable to determine dateBegin from: '$date'");
}

sub purchaseType {
    my $self = shift;

    my $type = $self->_getByFieldName('rPurchaseType') || '';
    return BookPub::DB::Item::Sale::kPurchaseTypeSubscriptionDL;
}

sub productType {
    my $self = shift;

    my $type = $self->_getByFieldName('rProductType') || '';
    return BookPub::DB::Item::Sale::kProductTypeEBook;
}

sub rState {
    my $self = shift;

    my $str = $self->_getByFieldName('rState') || '';
    if ( $str =~ /,\s?([a-z ]+)(\s\d+)?$/i ) {
        return $1;
    }

    return;
}

sub rPostalCode {
    my $self = shift;

    my $str = $self->_getByFieldName('rPostalCode') || '';
    if ( $str =~ /(\d+)$/i ) {
        return $1;
    }

    return;
}

sub rUnits {
    my $self = shift;

    my $units = $self->_getByFieldName('rUnits') || 0;
    return int($units);
}

sub _isSaleRec {
    my $self = shift;

    my $units    = $self->_getByFieldName('rUnits')   || 0;
    my $rRevenue = $self->_getByFieldName('rRevenue') || 0;
    return unless ($units && $rRevenue);

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


1;