package RPS::Import::FNAC;

use strict;

#use warnings;

use Date::Calc qw(Days_in_Month Decode_Month);

use lib '/app/tools/common/lib';
use Common::Consts qw(%FRENCH_MONTH_MAP);
use Common::Util;

use lib '/app/tools/data_classes/lib';

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

my %field_map = (
    summary => {
        sheet        => 0,
        period       => [ 11, 1 ],
        album_unit   => [ 21, 4 ],
        track_unit_c => [ 27, 4 ],
        track_unit_p => [ 28, 4 ],
    },
    album => {
        product => RPS::File::Sale::TYPE_ALBUM,
        sheet   => 1,
        album   => 0,
        artist  => 1,

        #sale        => 2,
        cli_prod_id => 3,
        upc         => 4,
        svc_prod_id => 5,
        label       => 6,
        units       => 7,
    },
    track => {
        product     => RPS::File::Sale::TYPE_TRACK,
        sheet       => 2,
        track       => 0,
        album       => 1,
        artist      => 2,
        sale        => 3,
        isrc        => 4,
        cli_prod_id => 7,
        svc_prod_id => 8,
        label       => 9,
        units       => 10,
    },
);

#public methods

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

    my ( $dateBegin, $dateEnd, $unit_price ) = $self->_getDatesAndUnitPrices( $sheets, $field_map{summary} );
    unless ( $dateBegin and $dateEnd ) {
        $self->errstr("couldn't get dates");
        return undef;
    }

    unless ( $unit_price->{album} && $unit_price->{track_carte} && $unit_price->{track_pack} ) {
        $self->errstr('failed to get unit prices');
        return undef;
    }

    my $linenum;
    foreach my $type (qw(album track)) {
        $linenum = 1;
        my $offsets  = $field_map{$type};
        my $prodType = $offsets->{product};

        foreach my $line ( @{ $sheets->[ $offsets->{sheet} ] } ) {
            my $album       = $line->[ $offsets->{album} ];
            my $artist      = $line->[ $offsets->{artist} ];
            my $cli_prod_id = $line->[ $offsets->{cli_prod_id} ];
            my $svc_prod_id = $line->[ $offsets->{svc_prod_id} ];
            my $label       = $line->[ $offsets->{label} ];
            my ($units)     = $line->[ $offsets->{units} ] =~ m/^(\d+)$/;

            my $upc       = exists $offsets->{upc}  ? Common::Util::normalize_upc( $line->[ $offsets->{upc} ] )   : undef;
            my $isrc      = exists $offsets->{isrc} ? Common::Util::normalize_isrc( $line->[ $offsets->{isrc} ] ) : undef;
            my $track     = exists $offsets->{isrc} ? $line->[ $offsets->{track} ]                                : undef;
            my $sale_type = exists $offsets->{sale} ? lc $line->[ $offsets->{sale} ]                              : undef;

            if ( $units && $album && ( $upc || $isrc ) ) {

                my $price =
                    $type eq 'album'      ? $unit_price->{album}
                  : $sale_type =~ /carte/ ? $unit_price->{track_carte}
                  : $sale_type =~ /pack/  ? $unit_price->{track_pack}
                  :                         0;

                unless ($price) {
                    $self->errstr('unknown price type');
                    print STDERR "sale type: $sale_type\n";
                    return undef;
                }
                my $sale = RPS::Import::SaleRec->new();

                $sale->albumName($album);
                $sale->artistName($artist);
                $sale->clientProductID($cli_prod_id);
                $sale->countryCode('FR');
                $sale->currencyCode('EUR');
                $sale->dateBegin($dateBegin);
                $sale->dateEnd($dateEnd);
                $sale->formatType(RPS::File::Sale::FORMAT_DOWNLOAD);
                $sale->isrc($isrc);
                $sale->labelName($label);
                $sale->lineNum($linenum);
                $sale->price($price);
                $sale->productType($prodType);
                $sale->serviceProductID($svc_prod_id);
                $sale->trackName($track);
                $sale->units($units);
                $sale->upc($upc);

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

            $linenum++;
        }
    }

    return $linenum;
}

#
# Private methods
#

sub _getDatesAndUnitPrices {
    my $self    = shift;
    my $sheets  = shift;
    my $offsets = shift;

    my $sheet  = $sheets->[ $offsets->{sheet} ];
    my $period = $sheet->[ $offsets->{period}[0] ][ $offsets->{period}[1] ];
    return unless ( $period =~ m/^(.+)\D(\d\d\d\d)/ );

    my ( $french_month, $year ) = ( lc $1, $2 );
    $french_month =~ s/\s+//g;

    my $month = $FRENCH_MONTH_MAP{$french_month};
    unless ($month) {
        $self->errstr('invalid month');
        print STDERR "cannot map $french_month\n";
        return undef;
    }

    return (
        Common::Util::normalize_date( join( '-', $year, $month, 1 ) ),
        Common::Util::normalize_date( join( '-', $year, $month, Days_in_Month( $year, $month ) ) ),
        {
            album       => $sheet->[ $offsets->{album_unit}[0] ][ $offsets->{album_unit}[1] ],
            track_carte => $sheet->[ $offsets->{track_unit_c}[0] ][ $offsets->{track_unit_c}[1] ],
            track_pack  => $sheet->[ $offsets->{track_unit_p}[0] ][ $offsets->{track_unit_p}[1] ],
        }
    );
}

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