#!/usr/bin/perl

use strict;
use warnings;
use open ':std', ':encoding(UTF-8)';

use JSON::XS;
use FileHandle;
use Text::CSV;
use Text::CSV::Easy(qw/csv_build csv_parse/);
use Getopt::Long::Descriptive(qw/describe_options/);

use lib '/var/app/orchard/collab/jgetter/perllib';
use Orchard::NameCase;
use Orchard::ETL::Extract::CSV;

my ( $opt, $usage ) = describe_options(
    '%c %o <some-arg>',
    [ 'salesFile|s=s'    => 'Sales file to calculate details',      { 'required' => 1 } ],
    [ 'contractFile|c=s' => 'Contract file for Orchard pub splits', { 'required' => 1 } ],
    [ 'excludedFile|e=s' => 'Transactions to exclude' ],
    [ 'noheader|n'       => 'Don\'t print header to stdout' ],
    [ 'transaction|t=i'  => 'Check a transaction' ],
    [ 'vendor|v=i'       => 'Check a vendor' ],
    [ 'help|?|h'         => "print usage message and exit" ]
);

## get excluded transactions
my $xtrans;
if ( $opt->excludedfile ) {
    my $fh = FileHandle->new( $opt->excludedfile, 'r' );
    while (<$fh>) {
        chomp;
        $xtrans->{$_}++;
    }
    $fh->close;
}

## get all contracts
my $contract;
my $csv = Orchard::ETL::Extract::CSV->new( $opt->contractfile, 1, undef, "\t" );
while ( my $c_row = $csv->getrow() ) {
    my $vendor_id = $csv->getcol( $c_row, 'A' );
    my $basefee   = $csv->getcol( $c_row, 'C' );
    if ( $basefee !~ m/\d+/ ) {
        $basefee = 0;
    }
    $basefee =~ s/(.*?)%/$1/;
    $contract->{$vendor_id}->{'basefee'} = $basefee;
}
$csv->fh->close;

my @outputHeader =
  qw/song_no song writer src_nm src_ctry src2_nm src2_ctry src3_nm src3_ctry src4_nm src4_ctry inc_typ sh_id rptg_pd sales_pd prod_no art_prd_no units sng_shr_pct cntrl_pct amount roy_pct roy_amt df src_prod iswc_cd ext_song artist src_song isrc transaction_id vendor_id has_multiple_owners vendor_controlled_share adjusted_share adjusted_gross fee_pct orchard_fee net_revenue/;

my $headerOutput = join "\t", map { $_ } @outputHeader;
if ( not $opt->noheader ) {
    print "$headerOutput\n";
}

my $transSum;
my $ttlGross    = 0;
my $ttlAdjGross = 0;

my $venSum;

my $sales_csv = Orchard::ETL::Extract::CSV->new( $opt->salesfile, 1, undef, "\t" );
$sales_csv->csv->quote_char(undef);
$sales_csv->csv->escape_char(undef);
while ( my $row = $sales_csv->getrow() ) {
    my $songno = $sales_csv->getkey( $row, 'song_no' );
    my $venid  = $sales_csv->getkey( $row, 'vendor_id' );
    my $txid   = $sales_csv->getkey( $row, 'transaction_id' );

    ## exclude transactions
    next if ( defined $xtrans and exists $xtrans->{$txid} );

    next if defined $opt->vendor      and $venid != $opt->vendor;
    next if defined $opt->transaction and $txid != $opt->transaction;

    ## allocate License Lounge (75156) to Next Records, LLC (24483)
    if ( $venid == 75156 ) {
        $row->{'vendor_id'} = 24483;
        $venid = 24483;
    }

    my $adjshare = $sales_csv->getkey( $row, 'adjusted_share' ) ne "\\N" ? $sales_csv->getkey( $row, 'adjusted_share' ) : 0;

    my $base;
    if ( exists $contract->{$venid} ) {
        $base = $contract->{$venid}->{'basefee'};
    } else {
        print STDERR "vendor $venid not in the contracts sheet - line " . $row->{'lineno'} . "\n";
        next;
    }

    ## allocate Dance Planet #2 (16476) to Dance Plant #1 (16475)
    if ( $venid == 16476 ) {
        $row->{'vendor_id'} = 16475;
        $venid = 16475;
    }

    ## Orchard's fee percentage
    my $feepct = $base ? $base / 100 : 0;

    ## correct amount
    my $gross    = $sales_csv->getkey( $row, 'amount' );
    my $adjgross = $adjshare ? $gross * ( $adjshare / 100 ) : $gross;
    my $orchfee  = $feepct   ? $adjgross * $feepct          : 0;
    my $netrev   = $adjgross - $orchfee;

    my $line = $sales_csv->getstr($row);
    chomp($line);
    $line = $line . "\t$adjgross\t$feepct\t$orchfee\t$netrev";
    print "$line\n";

    $transSum->{$txid} = $gross;
    $ttlAdjGross += $adjgross;

    $venSum->{$venid} += $adjgross;

}
map { $ttlGross += $transSum->{$_} } keys %{$transSum};

print STDERR "Total Gross: $ttlGross\n";
print STDERR "Total AdjGross: $ttlAdjGross\n";

foreach my $id ( sort { $a <=> $b } keys %{$venSum} ) {
    my $sum = $venSum->{$id};
    print STDERR "$id: $sum\n";
}
