#------------------------------------------------------------
# Copyright (C) 2009 RoyaltyShare, Inc.   All Rights Reserved
#------------------------------------------------------------

package Metadata::Translator::Version::v5xml;

use strict;

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

use Data::Dumper;

use base 'Common::Translator::VersionFromXML';

sub _supportedVersion { [1.0] }

# xpath => destination-column;

# xpath => [ destination-column, destination-column2 ];

# xpath => { column => destination-column,
#            method => \&function }

# xpath => [ { column => destination-column,
#              keyPath => 'xpath'
#              keyValue => "CD",
#              selectPath => 'xpath',
#              method => \&function }
#
#            { column => destination-column,
#              method => \&function } ]

sub _requiredXML {
    {
        '/album/title'                              => 'album-title',
        '/album/catalogNumber'                      => 'catalog-no',
        '/album/artists/primary/artist/displayName' => 'album-artist',
        '/album/artists/contributors/artist'        => {
            column => 'additional-album-artists',
            method => \&joinArtists
        },
        '/album/products/product'  => 'digital-upc',
        '/album/label/displayName' => 'label-name',
        '/album/clientID'          => 'client-album-id',
        '/album/products/product'  => [ {
                column     => 'digital-product-id',
                keyPath    => 'type',
                keyValue   => 'Digital',
                selectPath => 'productID'
            },
            {
                column     => 'digital-upc',
                keyPath    => 'type',
                keyValue   => 'Digital',
                selectPath => 'upc'
            },
            {
                column     => 'digital-release-date',
                keyPath    => 'type',
                keyValue   => 'Digital',
                selectPath => 'releaseDate'
            },
            {
                column     => 'cd-product-id',
                keyPath    => 'type',
                keyValue   => 'CD',
                selectPath => 'productID'
            },
            {
                column     => 'cd-upc',
                keyPath    => 'type',
                keyValue   => 'CD',
                selectPath => 'upc'
            },
            {
                column     => 'cd-release-date',
                keyPath    => 'type',
                keyValue   => 'CD',
                selectPath => 'releaseDate'
            },
            {
                column     => 'vinyl-product-id',
                keyPath    => 'type',
                keyValue   => 'Vinyl',
                selectPath => 'productID'
            },
            {
                column     => 'vinyl-upc',
                keyPath    => 'type',
                keyValue   => 'Vinyl',
                selectPath => 'upc'
            },
            {
                column     => 'vinyl-release-date',
                keyPath    => 'type',
                keyValue   => 'Vinyl',
                selectPath => 'releaseDate'
            },
            {
                column     => 'dvd-product-id',
                keyPath    => 'type',
                keyValue   => 'DVD',
                selectPath => 'productID'
            },
            {
                column     => 'dvd-upc',
                keyPath    => 'type',
                keyValue   => 'DVD',
                selectPath => 'upc'
            },
            {
                column     => 'dvd-release-date',
                keyPath    => 'type',
                keyValue   => 'DVD',
                selectPath => 'releaseDate'
            },
        ],
        '/album/genres/primary/genre'   => 'primary-genre',
        '/album/genres/secondary/genre' => 'secondary-genre',
        '/album/cline'                  => 'c-line',
        '/album/pline'                  => 'p-line',
        '/album/territoryRestrictions'  => [ {
                column     => 'territories-allowed',
                keyPath    => 'type',
                keyValue   => 'allowed',
                selectPath => 'countryCode',
                method     => \&joinWithSpace
            },
            {
                column     => 'territories-denied',
                keyPath    => 'type',
                keyValue   => 'denied',
                selectPath => 'countryCode',
                method     => \&joinWithSpace
            }
        ],
        '/album/custom1'      => 'album-custom-1',
        '/album/custom2'      => 'album-custom-2',
        '/album/custom3'      => 'album-custom-3',
        '/album/prices/price' => {
            column => 'price-tiers',
            method => \&joinPrices
        },

        '/album/tracks/track/title'                              => 'track-title',
        '/album/tracks/track/artists/primary/artist/displayName' => 'track-artist',
        '/album/tracks/track/artists/contributors/artist'        => {
            column => 'additional-track-artists',
            method => \&joinArtists
        },
        '/album/tracks/track/writers/writer/displayName'       => 'track-composer',
        '/album/tracks/track/productPositions/productPosition' => [ {
                column     => 'digital-track-number',
                keyPath    => 'type',
                keyValue   => 'Digital',
                selectPath => 'trackNumber'
            },
            {
                column     => 'digital-disc-number',
                keyPath    => 'type',
                keyValue   => 'Digital',
                selectPath => 'discNumber'
            },
            {
                column     => 'cd-track-number',
                keyPath    => 'type',
                keyValue   => 'CD',
                selectPath => 'trackNumber'
            },
            {
                column     => 'cd-disc-number',
                keyPath    => 'type',
                keyValue   => 'CD',
                selectPath => 'discNumber'
            },
            {
                column     => 'vinyl-track-number',
                keyPath    => 'type',
                keyValue   => 'Vinyl',
                selectPath => 'trackNumber'
            },
            {
                column     => 'vinyl-disc-number',
                keyPath    => 'type',
                keyValue   => 'Vinyl',
                selectPath => 'discNumber'
            },
            {
                column     => 'dvd-track-number',
                keyPath    => 'type',
                keyValue   => 'DVD',
                selectPath => 'trackNumber'
            },
            {
                column     => 'dvd-disc-number',
                keyPath    => 'type',
                keyValue   => 'DVD',
                selectPath => 'discNumber'
            },
        ],
        '/album/tracks/track/duration' => [ {
                column => 'track_seconds',
                method => \&getSeconds,
            },
            {
                column => 'track_minutes',
                method => \&getMinutes,
            },
        ],
        '/album/tracks/track/parentalAdvisory' => 'explicit',
        '/album/tracks/track/clientID'         => 'client-track-id',
        '/album/tracks/track/isrc'             => 'isrc',
        '/album/tracks/track/mediaType'        => {
            column => 'media-type',
            method => \&mapMediaType
        },
        '/album/tracks/track/custom1' => 'track-custom-1',
        '/album/tracks/track/custom2' => 'track-custom-2',
        '/album/tracks/track/custom3' => 'track-custom-3',
    };
}

sub _optionalXML {
}

sub getAllXpaths {
    my $self = shift;
    my %hash = %{ $self->_requiredXML() };

    my @required = keys( %{ $self->_requiredXML() } );
    my @optional = keys( %{ $self->_optionalXML() } )
      if ( $self->_optionalXML() );

    return [ @required, @optional ];

}

sub joinWithSpace {
    my $listRef = shift;

    return unless ($listRef);
    return $listRef unless ( ref($listRef) );

    return join( ' ', @$listRef );
}

sub joinPrices {
    my $listRef = shift;
    my @items = ref($listRef) eq 'ARRAY' ? @$listRef : ($listRef);
    my $result;

    return unless ($listRef);

    for my $item (@items) {
        $result .= ";" if ($result);
        $result .= $item->{service} . "=" . $item->{wholesaleCode};
    }

    return $result;
}

sub joinArtists {
    my $listRef = shift;
    my @items = ref($listRef) eq 'ARRAY' ? @$listRef : ($listRef);
    my $result;

    return unless ($listRef);

    for my $item (@items) {
        $result .= ";" if ($result);
        $result .= $item->{displayName} . "=" . $item->{role};
    }

    return $result;
}

sub mapMediaType {
    my $item = shift || return;

    if ( $item =~ /^audio$/i ) {
        return 1;
    } elsif ( $item =~ /^video$/i ) {
        return 2;
    } else {
        return;
    }
}

sub getSeconds {
    my $item = shift || return;
    if ( $item =~ /^(\d+):(\d+)$/ ) {
        return $2;
    } else {
        return $item;
    }
}

sub getMinutes {
    my $item = shift || return;
    if ( $item =~ /^(\d+):(\d+)$/ ) {
        return $1;
    } else {
        return $item;
    }
}

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