package RPS::Import::AWAL::v36;

use strict;
use warnings;

use RPS::Import::OrchardPub2;
use parent qw/RPS::Import::AWAL::v35/;

sub physical { 2 }

sub _fieldMapExtended {
    {
        mixed => {
            option1 => {
                serviceID       => 'F',
                countryCode     => 'G',
                dateBegin       => 'E',
                dateEnd         => 'E',
                productType     => 'V',
                formatType      => 'V',
                clientProductID => 'J',
                artistName      => 'L',
                upc             => 'H',
                albumName       => 'M',
                isrc            => 'R',
                trackNum        => 'T',
                trackName       => 'Q',
                units           => 'Z',
                currencyCode    => 'Y',
                grossRevenue    => 'AB',
                totalRevenue    => 'AC',
                price           => 'AC',
                mediaType       => 'U',
            },
        }
    }
}

sub _unverifiedFieldMapExtended {
    {
        mixed => {
            option1 => {
                _netUnits       => 'Z',
                _rel_man_upc    => 'I',
            },
        }
    };
}

sub _headerIdentifierExtended {
    {
        mixed => {
            option1 => {
                formatType => 'Transaction Transaction Type',
            },
        }
    };
}

my $ORCHARD_PUB2_FORMAT_MAP = RPS::Import::OrchardPub2::get_format_map();

sub productType {
    my $self = shift;

    my $type      = $self->_getByFieldName('productType') || '';
    my $trackName = $self->_getByFieldName('trackName')   || '';

    # physical
    if ( $type =~ /^(?:PS|RE|TP|TR|LP|LR|OP|OR|MP|MR)$/i ) {
        return RPS::File::Sale::TYPE_CD;
    }

    # digital
    if ( $type =~ /^(?:DA|DV|EQ|TA|UA|VR)$/i ) {
        return RPS::File::Sale::TYPE_ALBUM;
    } elsif ( $type =~ /^(?:AC|AO|AP|AS|AV|CL|DB|DJ|DR|DT|ER|FA|FS|MA|MD|MT|MV|NR|NS|NT|OC|OG|PA|PP|RB|RR|RW|S|SA|SC|SF|SV|TD|TV|UN|UP|UQ|UT|VA|XA|XC|XG|XM|YA|YC|YG|YM|YP|CC|EH|PV|RC|RL|SL|TP|TR|VS|WA|WS|NQ|FP|KS|KA|PX|CT|PT|ST|TY|ME)$/i ) {
        return RPS::File::Sale::TYPE_TRACK;
    } elsif ( $type =~ /^(?:SB)$/i ) {
        return $trackName =~ /^(?:Full Album|^$)$/ ? RPS::File::Sale::TYPE_ALBUM : RPS::File::Sale::TYPE_TRACK;
    } elsif ( $type =~ /^\(all\)$/i ) {
        return RPS::File::Sale::TYPE_TRACK;
    }

    $self->fail("Unknown product_type from: '$type'");
}

sub formatType {
    my $self = shift;

    if ( $self->serviceID eq Client::Service::DSP_SOUNDEXCHANGE ) {
        return RPS::File::Sale::FORMAT_NON_EPHEMERAL;
    }

    my $type = $self->_getByFieldName('formatType') || '';

    if ( $type =~ /^(?:DT|DA|DV)$/i ) {
        return RPS::File::Sale::FORMAT_DOWNLOAD;
    } elsif ( $type =~ /^(?:AC|AO|AP|AS|AV|CL|DB|DJ|EQ|FA|FS|MT|MV|NR|NS|NT|OC|OG|S|SA|SB|SF|SV|UQ|VA|XA|XC|XG|XM|YA|YC|YG|YM|YP|VS|WA|WS|NQ|FP|KS|KA|CT|PT|ST|TY|ME)$/i ) {
        return RPS::File::Sale::FORMAT_STREAM;
    } elsif ( $type =~ /^(?:TD|TA|VR)$/i ) {
        return RPS::File::Sale::FORMAT_TETHERED;
    } elsif ( $type =~ /^(?:UA|UT)$/i ) {
        return RPS::File::Sale::FORMAT_DOWNLOADUPGRADE;
    } elsif ( $type =~ /^(?:UP|UN|TV|RW|RR|PX|PP|PA|MD|MA|ER|RL|SL|CC)$/i ) {
        return RPS::File::Sale::FORMAT_PERFORMANCE;
    } elsif ( $type =~ /^(?:DR|RB)$/i ) {
        return RPS::File::Sale::FORMAT_RINGTONE;
    } elsif ( $type =~ /^(?:EH|PV)$/i ) {
        return RPS::File::Sale::FORMAT_EPHEMERAL;
    } elsif ( $type =~ /^RC$/i ) {
        return RPS::File::Sale::FORMAT_NON_EPHEMERAL;
    } elsif ( $type =~ /^SC$/i ) {
        return RPS::File::Sale::FORMAT_SYNC;
    }

    # fallback to OrchardPub2 mapping
    if ( exists $ORCHARD_PUB2_FORMAT_MAP->{uc $type} ) {
        my $orchard_pub2_mapping = $ORCHARD_PUB2_FORMAT_MAP->{uc $type};
        return $orchard_pub2_mapping->{format_type} if $orchard_pub2_mapping->{format_type};
    }

    return $self->handleError( "Unknown format_type: '$type'", RPS::DB::Item::SaleImportError::kErrorFormatType );
}

sub mediaType {
    my $self = shift;

    my $type = $self->_getByFieldName('mediaType') || '';

    return RPS::DB::Item::MediaType::kMediaTypeAudio if !$type || $type =~ /^Music$/i;
    return RPS::DB::Item::MediaType::kMediaTypeVideo if $type =~ /^Video$/i;

    return $self->handleError( "Unknown media_type: '$type'", RPS::DB::Item::SaleImportError::kErrorMediaType );
}

sub upc {
    my $self = shift;

    my $upc = $self->_getByFieldName('upc') || '';
    my $relManUPC = $self->_getByFieldName('_rel_man_upc') || '';

    $upc =~ s/^\s+|\s+$//g;
    $relManUPC =~ s/^\s+|\s+$//g;

    # physical
    if ( !$self->isDigitalProduct( $self->productType() ) ) {
        return $upc || $relManUPC;
    }

    # digital
    return $relManUPC;
}

sub _isValidSaleRecord {
    my $self = shift;

    # see RSD-12242
    return 1 if ($self->price || $self->totalRevenue)
        || ($self->units || $self->netUnits);

    return 0;
}


1;
