package RPS::Import::PIASDigital;

use strict;

use Date::Calc qw(Days_in_Month Decode_Month);

use lib '/app/tools/common/lib';

#use Common::Util;
use Common::Util qw(normalize_date normalize_isrc);
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 %field_map = (
    1 => {
        date           => 0,
        artist         => 1,
        title          => 2,
        upc            => 3,
        client_prod_id => 4,
        isrc           => 5,
        format         => 6,
        country        => 7,
        service        => 8,
        units          => 9,
        revenue        => 15,
        currency_code  => 16,
    },
    2 => {
        date   => 5,
        artist => 0,
        title  => 1,
        upc    => 3,

        #client_prod_id => ,
        isrc          => 2,
        format        => 5,
        country       => 4,
        service       => 6,
        units         => 7,
        revenue       => 13,
        currency_code => 1,
    },
);

my %formats = (
    'album' => [ RPS::File::Sale::FORMAT_DOWNLOAD, RPS::DB::Item::MediaType::kMediaTypeAudio, RPS::File::Sale::TYPE_ALBUM ],

    'digital album' => [ RPS::File::Sale::FORMAT_DOWNLOAD, RPS::DB::Item::MediaType::kMediaTypeAudio, RPS::File::Sale::TYPE_ALBUM ],

    'digital track' => [ RPS::File::Sale::FORMAT_STREAM, RPS::DB::Item::MediaType::kMediaTypeAudio, RPS::File::Sale::TYPE_TRACK ],

    'digital ep' => [ RPS::File::Sale::FORMAT_DOWNLOAD, RPS::DB::Item::MediaType::kMediaTypeAudio, RPS::File::Sale::TYPE_ALBUM ],

    'full album download' => [ RPS::File::Sale::FORMAT_DOWNLOAD, RPS::DB::Item::MediaType::kMediaTypeAudio, RPS::File::Sale::TYPE_ALBUM ],

    'playcounts' => [ RPS::File::Sale::FORMAT_TETHERED, RPS::DB::Item::MediaType::kMediaTypeAudio, RPS::File::Sale::TYPE_TRACK ],

    'real_audio_tone' => [ RPS::File::Sale::FORMAT_RINGTONE, RPS::DB::Item::MediaType::kMediaTypeAudio, RPS::File::Sale::TYPE_TRACK ],

    'single' => [ RPS::File::Sale::FORMAT_DOWNLOAD, RPS::DB::Item::MediaType::kMediaTypeAudio, RPS::File::Sale::TYPE_ALBUM ],

    'digital single' => [ RPS::File::Sale::FORMAT_DOWNLOAD, RPS::DB::Item::MediaType::kMediaTypeAudio, RPS::File::Sale::TYPE_ALBUM ],

    'stream' => [ RPS::File::Sale::FORMAT_STREAM, RPS::DB::Item::MediaType::kMediaTypeAudio, RPS::File::Sale::TYPE_TRACK ],

    'track' => [ RPS::File::Sale::FORMAT_DOWNLOAD, RPS::DB::Item::MediaType::kMediaTypeAudio, RPS::File::Sale::TYPE_TRACK ],

    'video_long_form' => [
        RPS::File::Sale::FORMAT_DOWNLOAD,    # was FORMAT_VIDEO (FB1324)
        RPS::DB::Item::MediaType::kMediaTypeVideo,
        RPS::File::Sale::TYPE_TRACK
    ],

    'video_short_form' => [
        RPS::File::Sale::FORMAT_DOWNLOAD,    # was FORMAT_VIDEO (FB1324)
        RPS::DB::Item::MediaType::kMediaTypeVideo,
        RPS::File::Sale::TYPE_TRACK
    ],

    'video shortform' => [
        RPS::File::Sale::FORMAT_DOWNLOAD,    # was FORMAT_VIDEO (FB1324)
        RPS::DB::Item::MediaType::kMediaTypeVideo,
        RPS::File::Sale::TYPE_TRACK
    ],

    # digital download can be album or track
    'digital download' => [ RPS::File::Sale::FORMAT_DOWNLOAD, RPS::DB::Item::MediaType::kMediaTypeAudio, RPS::File::Sale::TYPE_ALBUM ],

    'mobile audio/video stream' =>
      [ RPS::File::Sale::FORMAT_STREAM, RPS::DB::Item::MediaType::kMediaTypeAudio, RPS::File::Sale::TYPE_TRACK ],    # FB13054
    'full audio track download' =>
      [ RPS::File::Sale::FORMAT_DOWNLOAD, RPS::DB::Item::MediaType::kMediaTypeAudio, RPS::File::Sale::TYPE_TRACK ],    # FB13054
    'real audio tones' => [ RPS::File::Sale::FORMAT_RINGTONE, RPS::DB::Item::MediaType::kMediaTypeAudio, RPS::File::Sale::TYPE_TRACK ]
    ,                                                                                                                  # FB13054
    'ring back tone music' => [ RPS::File::Sale::FORMAT_RINGTONE, RPS::DB::Item::MediaType::kMediaTypeAudio, RPS::File::Sale::TYPE_TRACK ]
    ,                                                                                                                  # FB13054
    'full video download' => [ RPS::File::Sale::FORMAT_DOWNLOAD, RPS::DB::Item::MediaType::kMediaTypeVideo, RPS::File::Sale::TYPE_TRACK ]
    ,                                                                                                                  # FB13054

);

my %service_hash = (
    "24/7 musicshop"      => Client::Service::DSP_24_7_MUSICSHOP,
    "7 digital"           => Client::Service::DSP_7DIGITAL,
    "at&t"                => Client::Service::DSP_ATT,
    "audiojelly"          => Client::Service::DSP_AUDIOJELLY,
    "tune tribe"          => Client::Service::DSP_TUNETRIBE,
    "virginmega"          => Client::Service::DSP_VIRGINMEGA,
    "last.fm(settlement)" => Client::Service::DSP_LASTFM
);

#public methods

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

    my $lines    = $args{lines};
    my $version  = $args{file}->VersionNum();
    my $fileName = $args{file}->OrigFileName();
    my @sheets   = @{ $args{sheets} };

    return undef unless ($lines);

    my $linenum = 1;

    my $offsets = $field_map{$version};
    my %errors  = ();

    my $currencyCode;

    my ( $gDateBegin, $gDateEnd );

    foreach my $line (@$lines) {
        my $f_currency = $line->[ $offsets->{currency_code} ];
        my $f_artist   = $line->[ $offsets->{artist} ];

        my $f_date = $line->[ $offsets->{date} ];

        if ( $f_date =~ m/FOR PERIOD (september|october|november|december|january|february|march|april|may|june|july|august) (\d{4})/i ) {
            my $month = Decode_Month($1);
            my $year  = $2;
            $gDateBegin = sprintf( "%04d-%02d-%02d", $year, $month, 1 );
            $gDateEnd = sprintf( "%04d-%02d-%02d", $year, $month, Days_in_Month( $year, $month ) );
        }

        if (   !$currencyCode
            && ( ( $f_artist && $f_artist =~ m/Currency:/i ) || ( $f_date && $f_date =~ m/Grand-totals/i ) )
            && $f_currency =~ /([A-Z]{3})/ ) {
            $currencyCode = $1;
        }
    }

    if ( !$currencyCode ) {
        $self->errstr("couldn't get currency code from grand total");
        print STDERR "couldn't get currency code from grand total";
        return undef;
    }

    foreach my $lines (@sheets) {

        $linenum = 1;

        foreach my $line (@$lines) {
            my $date      = $line->[ $offsets->{date} ];
            my $artist    = $line->[ $offsets->{artist} ];
            my $title     = $line->[ $offsets->{title} ];
            my $upc       = $line->[ $offsets->{upc} ];
            my $isrc      = $line->[ $offsets->{isrc} ];
            my $f_format  = lc $line->[ $offsets->{format} ];
            my $f_country = lc $line->[ $offsets->{country} ];
            my $f_service = lc $line->[ $offsets->{service} ];
            my $units     = $line->[ $offsets->{units} ];
            my $revenue   = $line->[ $offsets->{revenue} ];

            my $clientProductID = ( exists $offsets->{client_prod_id} ) ? $line->[ $offsets->{client_prod_id} ] : undef;

            my $productType;
            my $mediaType;
            my $format;

            $f_service =~ s/\s+-.*//;

            my $service =
              $self->getServiceID($f_service) || $service_hash{$f_service} || $RPS::Import::ServiceMap::SERVICE_ALIASES{ lc $f_service };

            $upc =~ s/[^0-9]//g;

            my ( $dateBegin, $dateEnd );
            if ( !$gDateBegin && !$gDateBegin ) {
                $date = _normalizeDate($date);
                ( $dateBegin, $dateEnd ) = $self->_getDates( date_begin => $date, type => "iso" );
            } else {
                $dateBegin = $gDateBegin;
                $dateEnd   = $gDateEnd;
            }

            if ( $units && $units =~ m/\(/ ) {
                $units =~ s/\(//;
                $units =~ s/\)//;
                $units *= -1 if ( $units > 0 );
            }

            if ( $artist && $title && $units =~ /\d+/ && $revenue =~ /\d+/ ) {
                my $country;
                if ( $f_country && '' ne $f_country && $f_country !~ m/territory/i ) {
                    my $obj = Common::Country->Get($f_country);
                    if ( !$obj ) {
                        $self->errstr("Unknown country '$f_country' in line number: $linenum");
                        return undef;
                    } else {
                        $country = $obj->alpha2();
                    }
                }

                unless ( $dateBegin && $dateEnd ) {
                    $self->errstr("couldn't get dates, line number: $linenum");
                    return undef;
                }

                unless ( $formats{$f_format} ) {
                    $self->errstr("Unknown format '$f_format' at line number: $linenum");
                    return undef;
                }

                unless ($service) {
                    $self->errstr("Unknown service '$f_service' at line number: $linenum");
                    return undef;
                }

                ( $format, $mediaType, $productType ) =
                  @{ $formats{$f_format} };

                my $price = $revenue / $units if ( $units != 0 );
                $price *= -1 if ( $price < 0 );

                my $sale = RPS::Import::SaleRec->new();
                $sale->productType($productType);
                $sale->formatType($format);
                $sale->mediaType($mediaType);
                $sale->artistName($artist);
                $sale->albumName($title) if ( $productType eq RPS::File::Sale::TYPE_ALBUM );
                $sale->trackName($title) if ( $productType eq RPS::File::Sale::TYPE_TRACK );
                $sale->upc($upc)         if ( $upc && $upc =~ /^[0-9]+$/ );
                $sale->isrc($isrc)       if ( $isrc && $isrc =~ /^[A-Z][A-Z]/ );
                $sale->units($units);
                $sale->price($price);
                $sale->currencyCode($currencyCode);
                $sale->countryCode($country);
                $sale->clientProductID($clientProductID) if ( $clientProductID && $clientProductID !~ /N\/A/ );
                $sale->serviceID($service);
                $sale->dateBegin($dateBegin);
                $sale->dateEnd($dateEnd);
                $sale->lineNum($linenum);

                #$args{dumper}($sale);  ## for cmd-line testing
                $self->_insertSale( sale => $sale );
            }

            $linenum++;
        }
    }

    return $linenum;
}

sub _normalizeDate {
    my ($dt) = @_;
    my $date = $dt;
    if ( $dt =~ m/^\d{5}$/ ) {
        $date = Spreadsheet::ParseExcel::Utility::ExcelFmt( "yyyy-mm-dd", $dt );
    }
    return $date;
}

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