#---------------------------------------------------------------
# ____                   _ _         ____  _
#|  _ \ ___  _   _  __ _| | |_ _   _/ ___|| |__   __ _ _ __ ___
#| |_) / _ \| | | |/ _` | | __| | | \___ \| '_ \ / _` | '__/ _ \
#|  _ < (_) | |_| | (_| | | |_| |_| |___) | | | | (_| | | |  __/
#|_| \_\___/ \__, |\__,_|_|\__|\__, |____/|_| |_|\__,_|_|  \___|
#            |___/             |___/
#
# Copyright (C) 2018 RoyaltyShare, Inc.   All Rights Reserved
#---------------------------------------------------------------
package RPS::Import::FontanaDigital::v12;

use strict;

use Date::Calc qw(Days_in_Month Decode_Month);
use Data::Dumper;

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

use RPS::Import::ServiceMap;

sub _fieldMap {
    {
        dateBegin      => 'U2',           # header row
        albumName      => 'L',
        productType    => 'J',
        isrc           => 'Q',
        trackName      => 'P',
        units          => 'V',
        price          => 'U',
        upc            => 'N',
    }
}

my %gFormatMediaMap = (
    'INTERNET BROADCAST RADIO' => {
        'EBOOK' => {
            format => RPS::File::Sale::FORMAT_DOWNLOAD,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'PROGRAMMED STREAMING (NON-ROYALTY BEARIN' => {
            format => RPS::File::Sale::FORMAT_PERFORMANCE,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'SUBSCRIPTION LIMITED CATALOG' => {
        'PORTABLE SUBSCRIPTIONS' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'THE ZZ TOP SALES CHANNEL' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'PERMANENT DOWNLOADS' => {
        'DIGITAL PERMANENT DOWNLOAD' => {
            format => RPS::File::Sale::FORMAT_DOWNLOAD,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'DIGITAL PROMO' => {    # Note: will be considered free if revenue = 0 (see below)
            format => RPS::File::Sale::FORMAT_DOWNLOAD,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'KIOSK' => {
        'DIGITAL PERMANENT DOWNLOAD' => {
            format => RPS::File::Sale::FORMAT_DOWNLOAD,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'OTA PERMANENT DOWNLOADS' => {
        'DIGITAL PERMANENT DOWNLOAD' => {
            format => RPS::File::Sale::FORMAT_DOWNLOAD,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'MOBILE OTA DOWNLOADS' => {
            format => RPS::File::Sale::FORMAT_DOWNLOAD,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'AD SUPPORTED STREAMS' => {
        'AD SUPPORTED STREAMS' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'DIGITAL STREAM' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'BROADCAST LINEAR PROGRAMMING' => {
        'VIDEO STREAMING' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
        'SUB USER GENERATED STREAMS (UMG VIDEO)' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeVideo,
        }
    },
    'BROADCAST VOD' => {
        'VIDEO STREAMING' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
        'SUB USER GENERATED STREAMS (UMG VIDEO)' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeVideo,
        }
    },
    'CONDITIONAL MASTERTONE' => {
        'CONDITIONAL MASTERTONES' => {
            format => RPS::File::Sale::FORMAT_TETHERED,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'EPHEMERAL PLAYS' => {
        'FIXED PLAYS' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'FIXED PLAYS' => {
        'FIXED PLAYS' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'JUKEBOX' => {
        'SUB USER GENERATED STREAMS (UMG VIDEO)' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
    },
    'MASTERTONE REDELIVERY' => {
        'DIGITAL RINGSOUNDS' => {
            format => RPS::File::Sale::FORMAT_RINGTONE,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'MOBILE AUDIO STREAMS' => {
        'DIGITAL STREAM' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'MOBILE IMAGES' => {
        'MOBILE IMAGES' => {
            format => 'SKIP',
            media  => 'SKIP'
        }
    },
    'MOBILE VIDEO STREAMING' => {
        'VIDEO STREAMING' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeVideo,
        }
    },
    'PERMANENT DOWNLOADS PROMO' => {
        'DIGITAL PROMO' => {    # Note: will be considered free if revenue = 0 (see below)
            format => RPS::File::Sale::FORMAT_DOWNLOAD,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'PERM DL FROM OTA - W/O WHOLESALE' => {
        'UNKNOWN SALES TYPE 88' => {
            format => RPS::File::Sale::FORMAT_DOWNLOAD,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'PORTABLE SUB CLIENT PLAYS' => {
        'PORTABLE SUBSCRIPTIONS' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'PORTABLE SUB DEVICE PLAYS' => {
        'PORTABLE SUBSCRIPTIONS' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'PORTABLE SUB PROGRAMMED PLAYS' => {
        'DIGITAL STREAM' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'PORTABLE SUBSCRIPTIONS' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'PORTABLE SUB STREAMS' => {
        'PORTABLE SUBSCRIPTIONS' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'PORTABLE SUB VIDEO DVC PLAYS' => {
        'SUB USER GENERATED STREAMS (UMG VIDEO)' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
        'VIDEO PORTABLE SUBSCRIPTIONS' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
        'VIDEO STREAMING' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeVideo,
        }
    },
    'PROGRAMMED STREAMING' => {
        'DIGITAL STREAM' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'PROGRAMMED STREAMING (NON-ROYALTY BEARING)' => {
        'PROGRAMMED STREAMING (NON-ROYALTY BEARIN' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'PROGRAMMED STREAMING-CAPPED (NON-ROYALTY BEARING)' => {
        'PROGRAMMED STREAMING (NON-ROYALTY BEARIN' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'PROGRAMMED STREAMING (SOUNDEXCHANGE ADMINISTERED)' => {
        'PROGRAMMED STREAMING (SOUNDEXCHANGE ADMI' => {
            format => RPS::File::Sale::FORMAT_PERFORMANCE,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'RINGBACKS' => {
        'RINGBACKS' => {
            format => RPS::File::Sale::FORMAT_RINGTONE,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'RINGBACKS (NO CPRT LIABILITY)' => {
        'CONDITIONAL RINGBACKS' => {
            format => RPS::File::Sale::FORMAT_TETHERED,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'STANDARD MOBILE RINGSOUNDS' => {
        'DIGITAL RINGSOUNDS' => {
            format => RPS::File::Sale::FORMAT_RINGTONE,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'STREAMS' => {
        'DIGITAL STREAM' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'PORTABLE SUBSCRIPTIONS' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'SUBSCRIPTION MASTERTONES' => {
        'DIGITAL RINGSOUNDS' => {
            format => RPS::File::Sale::FORMAT_RINGTONE,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'SUBSCRIPTION MOBILE IMAGES' => {
        'MOBILE IMAGES' => {
            format => 'SKIP',
            media  => 'SKIP'
        }
    },
    'SUBSCRIPTION OTA PERMANENT DOWNLOADS (AUDIO)' => {
        'SUBSCRIPTION OTA VIDEO DOWNLOADS' => {
            format => RPS::File::Sale::FORMAT_DOWNLOAD,
            media  => RPS::DB::Item::MediaType::kMediaTypeVideo,
        }
    },
    'SUBSCRIPTION PROGRAMMED STREAMING' => {
        'DIGITAL STREAM' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'PORTABLE SUBSCRIPTIONS' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'SUBSCRIPTION RINGBACK' => {
        'SUBSCRIPTION RINGBACK' => {
            format => RPS::File::Sale::FORMAT_RINGTONE,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'SUB USER GENERATED STREAMS (UMG AUDIO)' => {
        'USER GENERATED STREAMS' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'SUB USER GENERATED STREAMS (UMG VIDEO)' => {
        'SUB USER GENERATED STREAMS (UMG VIDEO)' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
    },
    'TETHERED/CONDITIONAL DOWNLOADS' => {
        'DIGITAL STREAM' => {
            format => RPS::File::Sale::FORMAT_TETHERED,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'PORTABLE SUBSCRIPTIONS' => {
            format => RPS::File::Sale::FORMAT_TETHERED,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'VIDEO DOWNLOADS' => {
        'DIGITAL PERMANENT DOWNLOAD' => {
            format => RPS::File::Sale::FORMAT_DOWNLOAD,
            media  => RPS::DB::Item::MediaType::kMediaTypeVideo,
        }
    },
    'VIDEO FIXED PLAY' => {
        'VIDEO FIXED PLAY' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeVideo,
        }
    },
    'VIDEO STREAMS' => {
        'VIDEO STREAMING' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeVideo,
        }
    },
    'USER GENERATED STREAMS (UMG AUDIO / USER VIDEO)' => {
        'USER GENERATED STREAMS' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'PROGRAMMED STREAMING (SOUNDEXCHANGE ADMINISTERED)' => {
        'PROGRAMMED STREAMING (SOUNDEXCHANGE ADMI' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'VIDEO STREAMS (SPONSORSHIP)' => {
        'VIDEO STREAMS (SPONSORSHIP)' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeVideo,
        }
    },
    'PERMANENT DOWNLOADS (D2C)' => {
        'D2C DOWNLOADS' => {
            format => RPS::File::Sale::FORMAT_DOWNLOAD,
            media  => RPS::DB::Item::MediaType::kMediaTypeAudio,
        }
    },
    'PROGRAMMED VIDEO STREAMING' => {
        'VIDEO STREAMING' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeVideo,
        }
    },
    'AD SUPPORTED VIDEO STREAMING (NO CPRT)' => {
        'AD SUPPORTED VIDEO STREAMING (NO CPRT)' => {
            format => RPS::File::Sale::FORMAT_STREAM,
            media  => RPS::DB::Item::MediaType::kMediaTypeVideo,
        }
    },
);
sub _unverifiedFieldMap {
    return {
        salesChannel   => 'E',
        salesType      => 'H',
        albumArtist    => 'M',
        trackArtist    => 'O',
        service        => 'G'
    }
}

sub _headerIdentifier { ( upc => qr/UPC( ID)?/ ) }

sub currencyCode { 'USD' }

sub countryCode { 'US' }

sub digital { 1 }

sub productType {
    my $self = shift;
    my $type = $self->_getByFieldName('productType');

    return RPS::File::Sale::TYPE_TRACK         if ( $type =~ /^(track|bundles)$/i );
    return RPS::File::Sale::TYPE_ALBUM      if ( $type =~ /^complete album$/i );

    $self->fail("Could not parse product type from '$type'");
}

sub saleDates {
    my $self      = shift;
    my $startDate = $self->_getByFieldName('dateBegin');
    my $dateBegin;
    my $dateEnd;
    if ( $startDate =~ /(\d{4})(\d{2})/ ) {
        $dateBegin = sprintf( "%04d-%02d-%02d", $1, $2, 1 );
        $dateEnd = sprintf( "%04d-%02d-%02d", $1, $2, Days_in_Month( $1, $2 ) );
    }
    return ( $dateBegin, $dateEnd );
}

sub upc {
    my $self = shift;
    my $upc  = $self->_getByFieldName('upc');
    return Common::Util::normalize_upc($upc);
}

sub artistName {
    my $self = shift;
    if ($self->productType() eq RPS::File::Sale::TYPE_TRACK) {
        return $self->_getByFieldName('trackArtist');
    }
    return $self->_getByFieldName('albumArtist');
}

sub mediaType {
    my $self   = shift;
    my $salesChannel = uc($self->_getByFieldName('salesChannel'));
    my $salesType = uc($self->_getByFieldName('salesType'));
    my $h = $gFormatMediaMap{$salesChannel}{$salesType};
    $h->{media} ? return $h->{media} : $self->fail("Unable to determine media type from config($salesChannel, $salesType)");
}

sub formatType {
    my $self   = shift;
    my $salesChannel = uc($self->_getByFieldName('salesChannel'));
    my $salesType = uc($self->_getByFieldName('salesType'));
    my $h = $gFormatMediaMap{$salesChannel}{$salesType};
    $h->{format} ? return $h->{format} : $self->fail("Unable to determine media type from config($salesChannel, $salesType)");
}

sub _isValidSaleRecord {
    my $self = shift;

    my $salesChannel = uc($self->_getByFieldName('salesChannel'));
    my $salesType = uc($self->_getByFieldName('salesType'));
    my $units = $self->_getByFieldName("units");
    my $price = $self->_getByFieldName("price");

    # sale record is valid if service_id exists and product format is not SKIP
    return (
             ($gFormatMediaMap{$salesChannel}{$salesType}->{format} ne "SKIP")
             && $self->_getByFieldName('service')
             && (($units != 0) || ($price != 0))
             );
}

sub serviceID {
    my $self = shift;
    my $service = $self->_getByFieldName('service');
    my $id = $self->getServiceID($service) || $RPS::Import::ServiceMap::SERVICE_ALIASES{ lc $service };
    $self->fail("Unknown service: $service") if ( !$id );

    return $id;
}

sub free {
    my $self = shift;
    my $salesChannel = $self->_getByFieldName('salesChannel');
    my $salesType = $self->_getByFieldName('salesType');
    my $price = $self->_getByFieldName('price');
    return 1 if (($salesChannel =~  /promo/i || $salesType =~ /promo/i) && $price == 0);
}

sub isrc {
    my $self = shift;
    my $isrc = $self->_getByFieldName('isrc');
    if ($isrc) {
        $isrc = Common::Util::normalize_isrc($isrc);
    }
    return $isrc;
}

sub units {
    my $self  = shift;
    my $units = $self->_getByFieldName("units");
    my $price = $self->_getByFieldName("price");

    if ( defined($price) ) {
        if ($units == 0){ return ($price < 0 ? -1 : 1); }
        else { return ($price < 0 ? abs($units) * -1 : $units); }
    }
    else { return $units; }
}

sub price {
    return abs(shift->SUPER::price());
}

sub unitPrice {
    return abs(shift->SUPER::unitPrice());
}

1;
