package RPS::Import::ADAUK;

use strict;

use Date::Calc qw(Days_in_Month Add_Delta_Days Decode_Month);

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

use lib '/app/tools/data_classes/lib';
use Client::Service;

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

my %fieldMap = (
    10 => {
        'UK Digital Sales' => {
            album          => 0,
            artist         => 1,
            track          => 2,
            service_id     => 3,
            isrc           => 4,
            upc            => 5,
            date_begin     => 6,
            service        => 7,
            format_type    => 9,
            media_type     => 10,
            product_type   => 11,
            format_subtype => 12,
            units          => 13,
            price          => 14,
        },
        'International Digital Sales' => {
            album          => 0,
            artist         => 1,
            track          => 2,
            service_id     => 3,
            isrc           => 4,
            upc            => 5,
            date_begin     => 6,
            country        => 7,
            service        => 8,
            format_type    => 10,
            media_type     => 11,
            product_type   => 12,
            format_subtype => 13,
            units          => 14,
            price          => 15,
        },
    },
);

my %format_map = (
    'ALBUM'              => RPS::File::Sale::FORMAT_DOWNLOAD,
    'INTERACTIVE ALBUM'  => RPS::File::Sale::FORMAT_DOWNLOAD,
    'FULL LENGTH'        => RPS::File::Sale::FORMAT_DOWNLOAD,
    'MASTERTONE'         => RPS::File::Sale::FORMAT_RINGTONE,
    'RINGBACKTONE'       => RPS::File::Sale::FORMAT_RINGTONE,
    'MUSIC VIDEO RINGER' => RPS::File::Sale::FORMAT_DOWNLOAD,
    'SINGLE'             => RPS::File::Sale::FORMAT_DOWNLOAD,
    'SINGLE TRACK'       => RPS::File::Sale::FORMAT_DOWNLOAD,
    'TRACK (STEP)'       => RPS::File::Sale::FORMAT_DOWNLOAD,
    'WALLPAPER'          => 'SKIP',
);

my %product_map = (
    'ALBUM'                         => RPS::File::Sale::TYPE_ALBUM,
    'FULL LENGTH'                   => RPS::File::Sale::TYPE_ALBUM,
    'SINGLE'                        => RPS::File::Sale::TYPE_ALBUM,
    'FULL LENGTH RECORDING (TRACK)' => RPS::File::Sale::TYPE_TRACK,
    'SINGLE TRACK'                  => RPS::File::Sale::TYPE_TRACK,
    'AUDIO CLIP'                    => RPS::File::Sale::TYPE_TRACK,
    'VIDEO CLIP'                    => RPS::File::Sale::TYPE_TRACK,
    'WALLPAPER'                     => 'SKIP',
);

my %media_map = (
    'AUDIO' => '1',
    'VIDEO' => '2',
    'IMAGE' => 'SKIP',
);

#public methods

sub _importLines {
    my $self = shift;
    my %args = @_;

    my $fileObj     = $args{file};
    my $version     = $args{file}->VersionNum();
    my $fileName    = $args{file}->OrigFileName();
    my $serviceID   = $args{file}->ServiceID;
    my $sheet_count = 0;

    return undef unless ( defined $args{sheets} && defined $version );

    my $offsets     = $fieldMap{$version};
    my $sheet_names = $args{sheet_names};

    my $linenum = 1;
    foreach my $sheet ( @{ $args{sheets} } ) {

        my $sheetName = $sheet_names->[$sheet_count];
        my $data      = $offsets->{$sheetName};

        if ( !$data ) {
            $sheet_count++;
            next;
        }

        $linenum = 1;
        my $lines = $sheet;
        foreach my $line (@$sheet) {

            my $prodType  = $product_map{ uc( $line->[ $data->{product_type} ] ) };
            my $mediaType = $media_map{ uc( $line->[ $data->{media_type} ] ) };
            my $format;

            if ( uc( $line->[ $data->{format_type} ] ) eq 'DOWNLOAD' ) {
                $format = $format_map{ uc( $line->[ $data->{format_subtype} ] ) };
            } elsif ( uc( $line->[ $data->{format_type} ] ) eq 'STREAM' ) {
                $format = RPS::File::Sale::FORMAT_STREAM;
            }

            my $artist      = $line->[ $data->{artist} ];
            my $date        = $line->[ $data->{date_begin} ];
            my $track       = $line->[ $data->{track} ];
            my $album       = $line->[ $data->{album} ];
            my $units       = $line->[ $data->{units} ];
            my $price       = $line->[ $data->{price} ];
            my $isrc        = $line->[ $data->{isrc} ];
            my $upc         = $line->[ $data->{upc} ];
            my $serviceName = $line->[ $data->{service} ];
            my $country     = "UK";
            my $currency    = "GBP";
            $price /= $units if ( $units != 0 );

            if (   $artist
                && $units
                && ( $track && $track !~ /TITLE/ || $album && $album !~ /PROJECT/ )
                && $prodType ne 'SKIP'
                && $mediaType ne 'SKIP'
                && $format ne 'SKIP' ) {

                if ( defined $data->{country} ) {
                    my $f_country = $line->[ $data->{country} ];
                    my $c         = Common::Country->Get($f_country);

                    $self->fail("Unable to determine country code from '$f_country'") unless ( $c && $c->alpha2 );

                    $country = $c->alpha2;
                }

                if ( $units > 0 && $price < 0 ) {
                    $units *= -1;
                    $price *= -1;
                }

                my ( $dateBegin, $dateEnd ) = _getDates($date);
                my $serviceID = $self->getServiceID( lc($serviceName) ) || $RPS::Import::ServiceMap::SERVICE_ALIASES{ lc $serviceName };

                # If we don't have an entry in either the service list or service mapping
                # AND there's a wide character, let's just set it to the unknown service.
                # There seems to be an unending number of service names that we can't decipher...
                if ( !$serviceID && $serviceName =~ /â/ ) {
                    $serviceID = Client::Service::DSP_UNKNOWN;
                    print STDERR "Mapped service " . $line->[ $data->{service} ] . " to Unknown service - line $linenum\n";
                }

                unless ( defined $dateBegin && defined $dateEnd ) {
                    print STDERR "Couldn't get dates from: " . $lines->[ $data->{date_begin} ] . " line $linenum\n";
                    $self->errstr( "couldn't get dates from: " . $lines->[ $offsets->{data_begin} ] );
                    return undef;
                }
                unless ( $format ne "" ) {
                    print STDERR "Unknown format: " . $line->[ $data->{format_type} ] . " line $linenum\n";
                    $self->errstr( "Unknown format: " . $line->[ $data->{format_type} ] );
                }
                unless ( $prodType ne "" ) {
                    print STDERR "Unknown product type: " . $line->[ $data->{product} ] . " line $linenum\n";
                    $self->errstr( "Unknown product type: " . $line->[ $data->{product} ] );
                }
                unless ( $serviceID ne "" ) {
                    print STDERR "Unknown service: " . $line->[ $data->{service} ] . " line $linenum\n";
                    $self->errstr( "Unknown service: " . $line->[ $data->{service} ] );
                }
                unless ( $country ne "" ) {
                    print STDERR "Unknown country: " . $line->[ $data->{country} ] . " line $linenum\n";
                    $self->errstr( "Unknown country: " . $line->[ $data->{country} ] );
                }

                my $sale = RPS::Import::SaleRec->new();

                $sale->mediaType($mediaType);
                $sale->productType($prodType);
                $sale->dateBegin($dateBegin);
                $sale->dateEnd($dateEnd);
                $sale->artistName($artist);
                $sale->albumName($album) if ( $album ne "" );
                $sale->trackName($track) if ( $track ne "" && $prodType eq RPS::File::Sale::TYPE_TRACK );
                $sale->isrc( ($isrc) ) if ( $isrc ne "" );
                $sale->upc(  ($upc) )  if ( $upc ne "" );
                $sale->formatType($format);
                $sale->units($units);
                $sale->price($price);
                $sale->countryCode($country);
                $sale->currencyCode($currency);
                $sale->serviceID($serviceID);
                $sale->lineNum($linenum);

                $self->_insertSale( sale => $sale );
            }

#else { print STDERR "skip sh: ".$sheet_names->[$sheet_count] . ": l: " . $linenum . " - u:".$units." p:".$price." a:".$artist." t:".$track." a:".$album." f:".$format."\n"; }
            $linenum++;
        }
        $sheet_count++;
    }
    return $linenum;
}

#
# Private methods
#

sub _getDates {
    my $passed_date = shift;
    $passed_date =~ m/(\d{4}) (\d{2}) \((\D{3})\)/;
    my $year        = $1;
    my $fiscalMonth = $2;
    my $saleMonth   = $3;

    # Translate month abbreviation to a number
    my %months = (
        jan => 1,
        feb => 2,
        mar => 3,
        apr => 4,
        may => 5,
        jun => 6,
        jul => 7,
        aug => 8,
        sep => 9,
        oct => 10,
        nov => 11,
        dec => 12,
    );

    if ($saleMonth) {
        $saleMonth = $months{ lc($saleMonth) };

        if ( $saleMonth > $fiscalMonth ) {
            $year--;
        }

        my $dateBegin = sprintf( "%04d-%02d-%02d", $year, $saleMonth, 1 );
        my $dateEnd = sprintf( "%04d-%02d-%02d", $year, $saleMonth, Days_in_Month( $year, $saleMonth ) );
        return ( $dateBegin, $dateEnd );
    }

    return undef;
}

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