package BookPub::Import::Importer::Zebralution::v2;

use strict;
use warnings;

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

use parent 'BookPub::Import::Importer';

sub _fieldMap {
    {
        dateBegin          => 'F',
        dateEnd            => 'F',
        rPurchaseType      => 'V',
        rProductType       => 'K',
        rAuthor            => 'M',
        rImprint           => 'E',
        countryCode        => 'U',
        rUnits             => 'AA',
        rListPriceCurrency => 'AE',
        rRevenue           => 'AE',
        currencyCode       => 'AE',
        rDistributor       => 'H',
        rComments          => 'B',
    };
}

sub _unverifiedFieldMap {
    {
        _item_type      => 'K',
        _track_title    => 'S',
        _product_title  => 'N',
        _isrc           => 'Q',
        _ean            => 'L',
    }
}

sub _headerIdentifier { rAuthor => 'Product Display Artist' }

sub _useIsSaleRec      { 1 }
sub rServiceName       { 'Zebralution' }
sub purchaseType       { shift->rPurchaseType() }
sub rProductType       { shift->_getByFieldName('rProductType') }
sub productType        { BookPub::DB::Item::Sale::kProductTypeAudioBook }
sub priceType          { 'rrp' }
sub rUnits             { shift->units() }
sub rListPriceCurrency { shift->currencyCode() }



sub dateBegin {
    my $self = shift;

    my $date = $self->_getByFieldName('dateBegin') || '';
    if ( $date =~ /^(\d{4})-(\d{2})$/ ) {
        return sprintf "%04d-%02d-%02d", $1, $2, 1;
    }

    $self->fail("Can't determine dateBegin from: '$date'.");
}

sub dateEnd {
    my $self = shift;

    my $date = $self->_getByFieldName('dateEnd') || '';
    if ( $date =~ /^(\d{4})-(\d{2})$/ ) {
        return sprintf "%04d-%02d-%02d", $1, $2, Days_in_Month( $1, $2 );
    }

    $self->fail("Can't determine dateEnd from: '$date'.");
}

sub rPurchaseType  {
    my $self = shift;

    my $type = $self->_getByFieldName('rPurchaseType') || '';
    if ( $type =~ /^(?:Subscription|Cloud|breakage|streaming)$/i ) {
        return BookPub::DB::Item::Sale::kPurchaseTypeStream ;
    } elsif ( $type =~ /^(?:Download|digital\-sale)$/i ) {
        return BookPub::DB::Item::Sale::kPurchaseTypeDownload;
    }

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

sub rTitle {
    my $self = shift;

    my $itemType     = $self->_getByFieldName('_item_type')     || '';
    my $trackTitle   = $self->_getByFieldName('_track_title')   || '';
    my $productTitle = $self->_getByFieldName('_product_title') || '';

    return $trackTitle   if $itemType =~ /^music\-track$/i;
    return $productTitle if $itemType =~ /^music\-release$/i;

    $self->fail("Unable to determine rTitle.");
}


sub rIsbn13 {
    my $self = shift;

    my $itemType = $self->_getByFieldName('_item_type') || '';
    my $ean      = $self->_getByFieldName('_ean')       || '';

    return undef if $itemType =~ /^music\-track$/i;
    return $ean  if $itemType =~ /^music\-release$/i;

    $self->fail("Unable to determine rIsbn13.");
}

sub rClientProductID {
    my $self = shift;

    my $itemType = $self->_getByFieldName('_item_type') || '';
    my $isrc     = $self->_getByFieldName('_isrc')      || '';
    my $ean      = $self->_getByFieldName('_ean')       || '';

    return $isrc if $itemType =~ /^music\-track$/i;
    return $ean  if $itemType =~ /^music\-release$/i;
}

sub serviceProductID { shift->rClientProductID }

sub units {
    my $self = shift;

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

    $units =~ s/,/\./g;

    return 1 if $units == 0 && $revenue;
    return ceil($units);
}

sub rUnitPrice {
    my $self = shift;

    my $revenue = $self->rRevenue();
    my $units = $self->units();

    $revenue =~ s/,/\./g;

    return ($revenue / $units) if ($revenue && $units);
}

sub currencyCode {
    my $self = shift;

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

    $self->fail("Unable to determine currencyCode.");
}

sub rRevenue {
    my $self = shift;

    my $revenue = $self->_getByFieldName('rRevenue') || 0;
    $revenue =~ s/,/\./g;

    return $revenue;
}

sub rComments {
    my $self = shift;

    # MMUK only
    return unless Common::RSApp::GetClientID() == 359;

    return $self->_getByFieldName('rComments');
}

sub isFree {
    my $self = shift;

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

    return !$revenue && $units ? 'Y' : 'N';
}

sub _processHeader {
    my $self = shift;

    my $currency = $self->_getByFieldName('currencyCode') || '';
    if ( $currency =~ /^Licensor Amount in (\w{3})$/ ) {
        $self->{_currency} = $1;
    }
}

sub _isSaleRec {
    my $self = shift;

    my $revenue = $self->rRevenue;
    my $units  = $self->rUnits;

    return 0 if !$revenue && !$units;

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


1;