#---------------------------------------------------------------
# ____                   _ _         ____  _
#|  _ \ ___  _   _  __ _| | |_ _   _/ ___|| |__   __ _ _ __ ___
#| |_) / _ \| | | |/ _` | | __| | | \___ \| '_ \ / _` | '__/ _ \
#|  _ < (_) | |_| | (_| | | |_| |_| |___) | | | | (_| | | |  __/
#|_| \_\___/ \__, |\__,_|_|\__|\__, |____/|_| |_|\__,_|_|  \___|
#            |___/             |___/
#
# Copyright (C) 2010 RoyaltyShare, Inc.   All Rights Reserved
#---------------------------------------------------------------

package RPS::Import::TDCMusik::v1;

use strict;

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

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

sub _fieldMap {
    {
		# Header
		serviceID           => 'L',
        currencyCode        => 'G',
		dateBegin           => 'B',

		# Detail
        countryCode         => 'C',
		productType         => 'K',
		formatType          => 'A',
        artistName          => 'I',
        upc                 => 'H',
		albumName           => 'J',
        trackName           => 'J',
        units               => 'F',
    }
}

sub _noHeader { 1 }

####
#    Process lines needed to be overloaded becase there are multiple header rows
#    in the file that contain persistant data.
####
sub _processLine {
	my $self = shift;

	assert( $self->line );
	my $recordType = $self->line->[$self->_getOffset( 'formatType' )];

	# The first row contains some junk information in the first column.  It looks
	# like it was from a bad charset conversion, but we just strip it out.
	$recordType =~ s/.*(\w$)/$1/;

	# This is a detail record so we process it normally
	if( $recordType && $recordType =~ /^(d|z)$/i ) {
    	return $self->SUPER::_processLine(@_);
	}

	# This must be a header record so time to set/reset persistant data
	elsif( $recordType && lc($recordType) eq 'h' ) {
		$self->_storePeriod();
		$self->_storeCurrencyCode();
		$self->_storeServiceID();
	}

	# If it's not H, Z or D we don't know what it is.
	elsif( $recordType ) {
		$self->fail( "Unknown record type '$recordType'" );
	}

	# Otherwise we skip blank lines.
}

#####
#     Overloaded accessors
#####
sub trackName {
	my $self = shift;
	return $self->productType eq RPS::File::Sale::TYPE_TRACK ?
	           $self->_getByFieldName( 'trackName' ) : undef;
}

sub albumName {
	my $self = shift;
	return $self->productType eq RPS::File::Sale::TYPE_ALBUM ?
	           $self->_getByFieldName( 'albumName' ) : undef;
}

sub mediaType { RPS::DB::Item::MediaType::kMediaTypeAudio };

sub productType {
	my $self = shift;
	my $type = $self->_getByFieldName( 'productType' );

	if( lc($type) eq 'track' ) {
		return RPS::File::Sale::TYPE_TRACK,
	} elsif( lc($type) eq 'album' ) {
		return RPS::File::Sale::TYPE_ALBUM,
	}
	return;
}

sub formatType {
	my $self = shift;
	my $type = $self->_getByFieldName( 'formatType' );

	if( lc($type) eq 'd' ) {
		return RPS::File::Sale::FORMAT_DOWNLOAD,
	} elsif( lc($type) eq 'z' ) {
		return RPS::File::Sale::FORMAT_STREAM,
	}
}

sub saleDates {
	my $self = shift;
	return ($self->{_startDate}, $self->{_endDate});
}

sub currencyCode { shift->{_currencyCode} }



####
#    Helper methods for storing data from the header rows.
####
sub _storePeriod {
	my $self = shift;

	my $startDate = $self->_getByFieldName( 'dateBegin' );

	$self->fail( "Invalid date period format '$startDate', must be YYYYMM" )
	    unless( Common::UTF8::ToAscii($startDate) =~ /(\d{4})(\d{2})/ );

	my $date = sprintf( "%04d-%02d-%02d", $1, $2, 1 );

	($self->{_startDate},$self->{_endDate}) = $self->_getDates( date_begin => $date );
}

sub _storeCurrencyCode {
	my $self = shift;
	$self->{_currencyCode} = $self->_getByFieldName( 'currencyCode' );

	$self->fail( "Could not find currency code" ) unless( $self->currencyCode() );
}

sub _storeServiceID {
	my $self = shift;

	my $service = $self->_getByFieldName( 'serviceID' );

	$service = 'YouSee Musik' if( $service =~ /YouSee \(TDC\)/ );
	$self->{serviceID} = $self->getServiceID( $service );

	$self->fail( "Unknown service '$service'" ) unless( $self->{serviceID} );
}


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