package RPS::Import::Sony::Digital;

use strict;

use lib '/app/tools/common/lib';
use Common::Date;

use lib '/app/tools/rps/lib';
use base 'RPS::Import::Importer';

use Data::Dumper;

sub _headerIdentifier { ( albumName => 'Product Title' ) }

sub units {
    my $self   = shift;
    my $_units = $self->_getByFieldName('units') || return;
    my $_price = $self->_getByFieldName('price') || return;

    # Making units follow the sign of the revenue
    if ( ( $_price < 0 && $_units > 0 ) || ( $_price > 0 && $_units < 0 ) ) {
        $_units *= -1;
    }

    return $_price ? $_units : undef;    # This will effectively skip lines with no revenue
}

sub _isValidSaleRecord {
    my $self = shift;
    my $type = $self->type();

    if ( $type && lc($type) eq 'wallpapr' ) {
        return;
    }

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

sub _productTypes {
    my $self = shift;

    my $format = lc( $self->_getByFieldName('format') ) || return;
    my $type = lc( $self->type() ) || return;
    my $result;

    if ( $type eq 'audio lp' ) {
        $result = $format eq 'mobile'
          ? {
            formatType  => RPS::File::Sale::FORMAT_DOWNLOAD,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_ALBUM,
          }

          : $format eq 'online' && $self->trackName ? {
            formatType  => RPS::File::Sale::FORMAT_DOWNLOAD,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'online' ? {
            formatType  => RPS::File::Sale::FORMAT_DOWNLOAD,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_ALBUM,
          }

          : $format eq 'physical retail' ? {
            formatType  => RPS::File::Sale::FORMAT_DOWNLOAD,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_ALBUM,
          }

          : $format eq 'subscription' ? {
            formatType  => RPS::File::Sale::FORMAT_STREAM,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_ALBUM,
          }

          : $format eq 'brkg-subscript' ? {
            formatType  => RPS::File::Sale::FORMAT_STREAM,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_ALBUM,
          }

          : $format eq 'brkg-online' ? {
            formatType  => RPS::File::Sale::FORMAT_STREAM,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_ALBUM,
          }

          : undef;
    }

    elsif ( $type eq 'audtrack' ) {
        $result = $format eq 'd2c-dig'
          ? {
            formatType  => RPS::File::Sale::FORMAT_DOWNLOAD,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'mobile' ? {
            formatType  => RPS::File::Sale::FORMAT_DOWNLOAD,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'online' ? {
            formatType  => RPS::File::Sale::FORMAT_DOWNLOAD,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'physical retail' ? {
            formatType  => RPS::File::Sale::FORMAT_DOWNLOAD,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'subscription' ? {
            formatType  => RPS::File::Sale::FORMAT_STREAM,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'brkg-online' ? {
            formatType  => RPS::File::Sale::FORMAT_STREAM,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'brkg-mobile' ? {
            formatType  => RPS::File::Sale::FORMAT_RINGTONE,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'brkg-subscript' ? {
            formatType  => RPS::File::Sale::FORMAT_STREAM,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'locker-download' ? {
            formatType  => RPS::File::Sale::FORMAT_STREAM,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'locker-stream' ? {
            formatType  => RPS::File::Sale::FORMAT_STREAM,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'dl-condi' ? {
            formatType  => RPS::File::Sale::FORMAT_TETHERED,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'brkg-con' ?    # FB9011
          {
            formatType  => RPS::File::Sale::FORMAT_TETHERED,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : undef;
    } elsif ( $type eq 'vidlp' ) {
        $result = $format eq 'online'
          ? {
            formatType  => RPS::File::Sale::FORMAT_DOWNLOAD,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeVideo,
            productType => RPS::File::Sale::TYPE_ALBUM,
          }

          : $format eq 'subscription' ? {
            formatType  => RPS::File::Sale::FORMAT_DOWNLOAD,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_ALBUM,
          }

          : undef;
    } elsif ( $type eq 'audbndle' ) {
        $result =
          $format eq 'subscription'
          ? {
            formatType  => RPS::File::Sale::FORMAT_STREAM,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeVideo,
            productType => RPS::File::Sale::TYPE_TRACK,
          }
          : undef;
    }

    elsif ( $type eq 'bundle' ) {
        $result = $format eq 'online' && $self->trackName
          ? {
            formatType  => RPS::File::Sale::FORMAT_DOWNLOAD,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'online' ? {
            formatType  => RPS::File::Sale::FORMAT_DOWNLOAD,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_ALBUM,
          }

          : undef;
    }

    elsif ( $type eq 'ringback' ) {
        $result = $format eq 'brkg-mobile'
          ? {
            formatType  => RPS::File::Sale::FORMAT_RINGTONE,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'mobile' ? {
            formatType  => RPS::File::Sale::FORMAT_RINGTONE,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'subscription' ? {
            formatType  => RPS::File::Sale::FORMAT_RINGTONE,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : undef;
    }

    elsif ( $type eq 'ringtone' ) {
        $result = $format eq 'brkg-mobile'
          ? {
            formatType  => RPS::File::Sale::FORMAT_RINGTONE,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'mobile' ? {
            formatType  => RPS::File::Sale::FORMAT_RINGTONE,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'online' ? {
            formatType  => RPS::File::Sale::FORMAT_RINGTONE,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'subscription' ? {
            formatType  => RPS::File::Sale::FORMAT_RINGTONE,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'brkg-con' ?    # FB9011
          {
            formatType  => RPS::File::Sale::FORMAT_RINGTONE,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : undef;
    }

    elsif ( $type eq 'vidtone' ) {
        $result = $format eq 'mobile'
          ? {
            formatType  => RPS::File::Sale::FORMAT_RINGTONE,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeVideo,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'brkg-mobile' ? {
            formatType  => RPS::File::Sale::FORMAT_RINGTONE,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeVideo,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : undef;
    }

    elsif ( $type eq 'vidtrack' ) {
        $result = $format eq 'brkg-subscript'
          ? {
            formatType  => RPS::File::Sale::FORMAT_STREAM,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeVideo,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'online' ? {
            formatType  => RPS::File::Sale::FORMAT_DOWNLOAD,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeVideo,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'other' ? {
            formatType  => RPS::File::Sale::FORMAT_STREAM,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeVideo,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'subscription' ? {
            formatType  => RPS::File::Sale::FORMAT_STREAM,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeVideo,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'mobile' ? {
            formatType  => RPS::File::Sale::FORMAT_DOWNLOAD,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeVideo,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'locker-download' ? {
            formatType  => RPS::File::Sale::FORMAT_STREAM,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeVideo,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'brkg-online' ? {
            formatType  => RPS::File::Sale::FORMAT_DOWNLOAD,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeVideo,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : $format eq 'dl-condi' ?    # FB9011
          {
            formatType  => RPS::File::Sale::FORMAT_TETHERED,
            mediaType   => RPS::DB::Item::MediaType::kMediaTypeVideo,
            productType => RPS::File::Sale::TYPE_TRACK,
          }

          : undef;
    }

    $self->fail("Could not determine format information. Type: '$type' Format: '$format'") unless ($result);

    return { $type => $result };
}

sub _getDateBegin {
    my $self = shift;
    my $date = $self->SUPER::_getDateBegin() || return;

    my $d = new Common::Date($date);
    return $d->halfBegin;
}

sub _getDateEnd {
    my $self = shift;
    my $date = $self->SUPER::_getDateEnd() || return;

    my $d = new Common::Date($date);
    return $d->halfEnd;
}

sub currencyCode { shift->{_currencyCode} }

sub countryCode {
    my $self    = shift;
    my $country = $self->SUPER::countryCode();

    $self->fail("No country specified")
      unless ( $country && length($country) );

    my %countryMap = (
        'rep. korea'      => 'KR',
        'slovakia rep.'   => 'SK',
        'arab emirates'   => 'AE',
        'dominican rep.'  => 'DO',
        'st. lucia'       => 'LC',
        'antigua & barbu' => 'AG',
    );

    $country = $countryMap{ lc $country } if ( exists $countryMap{ lc $country } );

    my $c = new Common::Country( search => $country );
    return $c->alpha2() if ($c);

    $self->fail("Unable to determine country code from '$country'");
}

sub _processHeader {
    my $self = shift;
    my $currencyCode = $self->SUPER::currencyCode || return;

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

    $self->{_currencyCode} = $currencyCode if ( $currencyCode =~ /^\w{3}$/ );
}

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