package RPS::Import::XRinger;

use strict;

use Date::Calc qw(Days_in_Month);

use lib '/app/tools/common/lib';
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 = (
    1 => {
        country  => 0,
        vendorid => 1,
        label    => 2,
        isrc     => 3,
        track    => 4,
        artist   => 5,
        price1   => 6,
        units1   => 7,
        price2   => 9,
        units2   => 10,
        price3   => 12,
        units3   => 13,
    },
    2 => {
        country  => 0,
        vendorid => 1,
        label    => 2,
        track    => 3,
        artist   => 4,
        price1   => 5,
        units1   => 7,
        price2   => 9,
        units2   => 11,
        price3   => 13,
        units3   => 15,
    },
);

#
# public methods
#

sub _importLines {
    my $self     = shift;
    my %args     = @_;
    my $lines    = $args{lines};
    my $fileObj  = $args{file};
    my $fileName = $fileObj->OrigFileName;
    my $version  = $args{file}->VersionNum();

    #my $fileName = $args{OrigFileName}; ## for cmd-line testing
    #my $version = $args{version}; # for cmd-line testing

    my $offsets = $field_map{$version};

    return undef unless ($lines);

    my ( $dateBegin, $dateEnd ) = _get_dates($fileName);

    unless ( $dateBegin && $dateEnd ) {
        $self->errstr("couldn't get dates from $fileName");
        print STDERR "couldn't get dates from $fileName\n";
        return undef;
    }

    my $linenum = 1;

    foreach my $line (@$lines) {
        my $prodtype = RPS::File::Sale::TYPE_TRACK;
        my $format   = RPS::File::Sale::FORMAT_RINGTONE;

        my $vendor_id = $line->[ $offsets->{'vendorid'} ];
        my $country   = $line->[ $offsets->{'country'} ];
        my $artist    = $line->[ $offsets->{'artist'} ];
        my $track     = $line->[ $offsets->{'track'} ];
        my $label     = $line->[ $offsets->{'label'} ];
        my $isrc      = $line->[ $offsets->{'isrc'} ] if ( $version == 1 );
        my ($units1)  = $line->[ $offsets->{'units1'} ] =~ m/^(\d+)$/;
        my ($price1)  = $line->[ $offsets->{'price1'} ] =~ m/^(\d+\.?\d*)$/;
        my ($units2)  = $line->[ $offsets->{'units2'} ] =~ m/^(\d+)$/;
        my ($price2)  = $line->[ $offsets->{'price2'} ] =~ m/^(\d+\.?\d*)$/;
        my ($units3)  = $line->[ $offsets->{'units3'} ] =~ m/^(\d+)$/;
        my ($price3)  = $line->[ $offsets->{'price3'} ] =~ m/^(\d+\.?\d*)$/;

        if ( $country eq "United States" ) {
            $country = "US";
        } elsif ( $country eq "Romania" ) {
            $country = "RO";
        } else {
            $country = "";
        }

        if ( $artist && $track && $country ) {

            ### try to calculate this instead later......
            $price1 /= 5;
            $price2 /= 5;
            $price3 /= 5;

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

            $sale->productType($prodtype);
            $sale->formatType($format);
            $sale->serviceProductID($vendor_id);
            $sale->dateBegin($dateBegin);
            $sale->dateEnd($dateEnd);
            $sale->artistName($artist);
            $sale->trackName($track);
            $sale->labelName($label);
            $sale->isrc($isrc) if ( $version == 1 );
            $sale->countryCode($country);
            $sale->lineNum($linenum);

            if ( $units1 != 0 && $price1 != 0 ) {
                $sale->units($units1);
                $sale->price($price1);

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

            if ( $units2 != 0 && $price2 != 0 ) {
                $sale->units($units2);
                $sale->price($price2);

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

            if ( $units3 != 0 && $price3 != 0 ) {
                $sale->units($units3);
                $sale->price($price3);

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

#
# Private methods
#

sub _get_dates {
    my $date = shift;

    return undef unless ( $date =~ m/^(\d)Q(\d\d)/ );
    my ( $qtr, $year ) = ( $1, $2 );
    $year += 2000;

    my ( $dateBegin, $dateEnd );

    if ( $qtr == 1 ) {
        $dateBegin = $year . "-01-01";
        $dateEnd = $year . "-03-" . Days_in_Month( $year, 3 );
    } elsif ( $qtr == 2 ) {
        $dateBegin = $year . "-04-01";
        $dateEnd = $year . "-06-" . Days_in_Month( $year, 6 );
    } elsif ( $qtr == 3 ) {
        $dateBegin = $year . "-07-01";
        $dateEnd = $year . "-09-" . Days_in_Month( $year, 9 );
    } elsif ( $qtr == 4 ) {
        $dateBegin = $year . "-10-01";
        $dateEnd = $year . "-12-" . Days_in_Month( $year, 12 );
    } else {
        return undef;
    }

    return ( $dateBegin, $dateEnd );
}

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