package RPS::Import::Merlin::Facebook;

use strict;
use warnings;
use POSIX qw/ceil/;

use lib '/app/tools/common/lib';
use Common::Assert;
use Common::Util qw(normalize_date normalize_upc);
use RPS::Import::ServiceMap;

use lib '/app/tools/rps/lib';

use base 'RPS::Import::Importer';

sub _fieldMap {
    my $self = shift;

    my %map = (
        1 => {
            serviceID    => 'A',
            countryCode  => 'E',
            dateBegin    => 'C',
            dateEnd      => 'D',
            artistName   => 'I',
            isrc         => 'H',
            trackName    => 'J',
            units        => 'L',
            currencyCode => 'M',
            price        => 'M',
        },
        2 => {
            serviceID    => 'A',
            countryCode  => 'E',
            dateBegin    => 'C',
            dateEnd      => 'D',
            artistName   => 'I',
            isrc         => 'H',
            trackName    => 'J',
            units        => 'G',
            currencyCode => 'L',
            price        => 'L',
        },
        3 => {
            serviceID    => 'A',
            countryCode  => 'E',
            dateBegin    => 'C',
            dateEnd      => 'D',
            artistName   => 'I',
            isrc         => 'H',
            trackName    => 'J',
            units        => 'G',
            currencyCode => 'K',
            price        => 'K',
        },
        4 => {
            serviceID    => 'A',
            countryCode  => 'E',
            dateBegin    => 'C',
            dateEnd      => 'D',
            artistName   => 'I',
            upc          => 'K',
            isrc         => 'H',
            trackName    => 'J',
            units        => 'M',
            currencyCode => 'N',
            price        => 'N',
        },
    );

    return $map{ $self->version };
}

sub _unverifiedFieldMap {}

sub _headerIdentifier {
    my $self = shift;

    my %map = (
        1 => {
            isrc => 'elected_isrc'
        },
        2 => {
            isrc => 'elected_isrc'
        },
        3 => {
            isrc => 'elected_isrc'
        },
        4 => {
            isrc => 'elected_isrc'
        },
    );

    return $map{ $self->version };
}

sub productType { RPS::File::Sale::TYPE_TRACK }
sub formatType  { RPS::File::Sale::FORMAT_STREAM }
sub mediaType   { RPS::DB::Item::MediaType::kMediaTypeAudio }

sub serviceID {
    my $self = shift;

    my $service = lc( $self->_getByFieldName('serviceID') || '' );
    my $serviceID = $self->getServiceID($service) || $RPS::Import::ServiceMap::SERVICE_ALIASES{$service};
    return $serviceID if $serviceID;

    $self->fail("Unknown service: $service");
}

sub countryCode {
    my $self = shift;

     my $countryCode = $self->_getByFieldName('countryCode') || '';
     return 'US' if !$countryCode || $countryCode =~ /n\/a/i;

     return $countryCode;
}

sub currencyCode {
    my $self = shift;

    return $self->{_currencyCode};
}

sub _processHeader {
    my $self = shift;

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

sub price     { abs( shift->_getByFieldName('price') || 0 ) }
sub unitPrice { abs( shift->SUPER::unitPrice) }
sub units {
    my $self = shift;

    my $units = ceil( abs( $self->_getByFieldName('units') || 0 ) );
    my $price = $self->_getByFieldName('price') || 0;

    if ( $price > 0 ) {
        $units = $units ? abs( $units ) : 1;
    } elsif ( $price < 0 ) {
        $units = $units ? -1 * abs( $units ) : -1;
    }

    return $units;
}

sub _isValidSaleRecord {
    my $self = shift;

    my $artist = $self->_getByFieldName('artistName') || "";
    my $track  = $self->_getByFieldName('trackName') || "";
    my $isrc   = $self->_getByFieldName('isrc') || "";

    if ( ($artist || $track || $isrc) && ($self->price || $self->units) ) {
        return 1;
    }
    if ( (!$artist || !$track || !$isrc) && ($self->price || $self->units) ) {
        $self->fail("Missing sales data...");
    }

    return 0;
}

1;
