package BookPub::Import::Importer::ALKEM::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 {
    {
        rServiceName       => 'N2',
        dateBegin          => 'A3',
        dateEnd            => 'A3',
        rAuthor            => 'D',
        rTitle             => 'C',
        rIsbn13            => 'B',
        rImprint           => 'F',
        countryCode        => 'L',
        rReturns           => 'I',
        rSales             => 'H',
        rUnits             => 'J',
        rListPrice         => 'G',
        rListPriceCurrency => 'A',
        rDiscount          => 'K',
        rRevenue           => 'N',
        currencyCode       => 'N',
    };
}

sub _headerIdentifier { rTitle => 'Title' }

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 _useIsSaleRec        { 1 }
sub priceType            { 'rrp' }
sub productType          { BookPub::DB::Item::Sale::kProductTypeEBook }
sub rProductType         { BookPub::DB::Item::Sale::kProductTypeEBook }
sub purchaseType         { BookPub::DB::Item::Sale::kPurchaseTypeDownload }
sub priceTypeQualifierID { BookPub::DB::Item::PriceTypeQualifier::kCorporate }
sub currencyCode         { shift->{_currencyCode} }

sub _processHeader {
    my $self = shift;

    my $code = $self->_getByFieldName('currencyCode') || '';
    if ( $code =~ /^Amount Due (\w{3})$/ ) {
        $self->{_currencyCode} = $1;
    }

    return $self->SUPER::_processHeader;
}

sub rServiceName {
    my $self = shift;

    return $self->{__r_service_name} if $self->{__r_service_name};

    my $rServiceName = $self->_getByFieldName('rServiceName') || '';
    if ( $rServiceName =~ /^Alkem Company/i ) {
        return $self->{__r_service_name} = 'ALKEM';
    }

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

# 1/8/2023 - 25/8/2023
sub dateBegin {
    my $self = shift;

    return $self->{__date_begin} if $self->{__date_begin};

    my $date = $self->_getByFieldName('dateBegin') || '';
    if ( my ($day, $month, $year) = ($date =~ /(\w{3})\w*[-_ ]?(\d{4}).*/ || $date =~ /(\d+)\/(\d+)\/(\d{4}) -/)) {
        $month = $months{lc($month)} if $month =~ /\D+/;
        return $self->{__date_begin} = sprintf "%04d-%02d-%02d", $year, $month, $day;
    }

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

sub dateEnd {
    my $self = shift;

    return $self->{__date_end} if $self->{__date_end};

    my $date = $self->_getByFieldName('dateEnd') || '';
    if ( my ($day, $month, $year) = ($date =~ /(\w{3})\w*[-_ ]?(\d{4})/ || $date =~ /- (\d+)\/(\d+)\/(\d{4})/)) {
        $month = $months{lc($month)} if $month =~ /\D+/;
        return $self->{__date_end} = sprintf "%04d-%02d-%02d", $year, $month, $day;
    }

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

sub rUnitPrice {
    my $self = shift;

    my $units = $self->_getByFieldName('rUnits') || 0;
    my $revenue = $self->_getByFieldName('rRevenue') || 0;
    return $revenue / $units if $units;
}

sub isFree {
    my $self = shift;

    return (!$self->rRevenue && $self->rUnits) ? 'Y' : 'N';
}

sub _isSaleRec {
    my $self = shift;

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

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

1;
