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.
###
