package RPS::Import::Sony::v50;

use strict;
use warnings;

use lib '/app/tools/rps/lib';
use Date::Calc qw(Days_in_Month Add_Delta_Days Decode_Month);

use parent 'RPS::Import::Sony::v39';

sub physical { 2 }

sub _fieldMapExtended {
    {
        mixed => {
            option1 => {
                labelName      => 'F',
                serviceID      => 'AB',
                countryCode    => 'AA',
                productType    => 'R',
                formatType     => 'Y',
                artistName     => 'M',
                upc            => 'J',
                albumName      => 'K',
                isrc           => 'S',
                trackName      => 'T',
                units          => 'AJ',
                channel        => 'Y',
                priceLevel     => 'Z',
                currencyCode   => 'G',
                wholesalePrice => 'AD',
                totalRevenue   => 'AK',
                price          => 'AK',
                mediaType      => 'R',
            },
         },
    };
}

sub _unverifiedFieldMapExtended {
    {
        mixed => {
            option1 => {
                _period   => 'V',
                _netUnits => 'AJ',
            }
        }
    }
};

sub _headerIdentifierExtended {
    {
        mixed => {
            option1 => {
                upc => 'Product Number',
            },
        },
    };
}

my %quarters = (
    1 => { begin_month => 1,  end_month => 3  },
    2 => { begin_month => 4,  end_month => 6  },
    3 => { begin_month => 7,  end_month => 9  },
    4 => { begin_month => 10, end_month => 12 },
);

sub saleDates {
    my $self = shift;

    # YYYY Q[\d]
    my $period = $self->_getByFieldName('_period') || '';

    my ($dateBegin, $dateEnd);
    if ( $period =~ /^(\d{4})\s+Q(\d)$/i ) {
        $dateBegin = sprintf( "%04d-%02d-%02d", $1, $quarters{$2}{begin_month}, 1 );
        $dateEnd   = sprintf( "%04d-%02d-%02d", $1, $quarters{$2}{end_month}, Days_in_Month($1, $quarters{$2}{end_month}) );
    }
    # YYYY MM
    elsif ( $period =~ /^(\d{4})\s+(\d+)$/i ) {
        $dateBegin = sprintf( "%04d-%02d-%02d", $1, $2, 1 );
        $dateEnd   = sprintf( "%04d-%02d-%02d", $1, $2, Days_in_Month($1, $2) );
    }
    # YYYY H[\d]
    elsif ( $period =~ /^(\d{4})\s+H(\d)$/i ) {
        if ( $2 == 1 ) {
            $dateBegin = sprintf( "%04d-%02d-%02d", $1, 1, 1 );
            $dateEnd   = sprintf( "%04d-%02d-%02d", $1, 6, 30 );
        } elsif ( $2 == 2 ) {
            $dateBegin = sprintf( "%04d-%02d-%02d", $1, 7, 1 );
            $dateEnd   = sprintf( "%04d-%02d-%02d", $1, 12, 31 );
        }
    }

    return $self->_getDates( date_begin => $dateBegin, date_end => $dateEnd );

    return $self->handleError("Unable to determine date from: '$period'.", RPS::DB::Item::SaleImportError::kErrorNonqualifying );
}

sub productType {
    my $self = shift;

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

    # physical
    return RPS::File::Sale::TYPE_CD if $type =~ /^CD Longplay$/i;

    # digital
    my $isrc = $self->_getByFieldName('isrc') || 'n/a';
    if ( $type =~ /^(?:Digital (?:Audio|Video) Track|Mastertone|Ringback Tone)$/i ) {
        return RPS::File::Sale::TYPE_TRACK;
    } elsif ( $type =~ /^Digital (?:Audio|Combo) (?:Longplay|Bundle|Extended Play)$/i || $type =~ /^Digital Video Longform$/i ) {
        # exception for 'Digital Audio Longplay', 'Digital Combo Longplay',
        # 'Digital Audio Bundle', 'Digital Audio Extended Play'
        if ( $isrc !~ /^N\/A$/i && $type =~ /^Digital (?:Audio|Combo) (?:Longplay|Bundle|Extended Play)$/i ) {
            return RPS::File::Sale::TYPE_TRACK;
        }
        return RPS::File::Sale::TYPE_ALBUM;
    } elsif ( $type =~ /^(?:Master Use|Other)$/i ) {
        return $self->handleError( "Product type is incorrect: '$type'.", RPS::DB::Item::SaleImportError::kErrorNonqualifying );
    }

    return $self->handleError( "Product type not set: '$type'.", RPS::DB::Item::SaleImportError::kErrorProductType );
}

sub mediaType {
    my $self = shift;

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

    if ( $type =~ /^Digital (?:Audio|Combo) (?:Longplay|Track|Bundle|xtended Play)$/i
         || $type =~ /^(?:CD Longplay|Ringback Tone|Mastertone)$/i ) {
        return RPS::DB::Item::MediaType::kMediaTypeAudio;
    } elsif ( $type =~ /^Digital Video (?:Longform|Track)$/i ) {
        return RPS::DB::Item::MediaType::kMediaTypeVideo;
    }

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

sub channel {
    my $self = shift;

    my $channel = $self->_getByFieldName('formatType') || '';
    if ( $channel =~ /^(?:Regular Trade|NORM5)$/i ) {
        return RPS::File::Sale::CHANNEL_RETAIL;
    }

    return $channel;
}



1;