#!/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' ],
    [ 'noprint|n'        => 'Don\'t print header to stdout' ],
    [ '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->getkey( $c_row, 'Vendor ID' );
    my $basefee   = $csv->getkey( $c_row, 'Base Fee' );
    if ( $basefee !~ m/\d+/ ) {
        $basefee = 0;
    }
    $basefee =~ s/(.*?)%/$1/;
    $c_row->{'Base Fee'} = $basefee;
    $contract->{$vendor_id} = $c_row;
}
$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->noprint ) {
    print "$headerOutput\n";
}

my $vendorSummary;

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

    ## get the base fee from the contract csv file
    my $base;
    if ( exists $contract->{$venid} ) {
        $base = $contract->{$venid}->{'Base Fee'};
    } else {
        print STDERR "$venid not in the contracts sheet\n";
        next;
    }

    ## exclude transactions
    my $txnid = $sales_csv->getkey( $row, 'transaction_id' );
    next if ( defined $xtrans and exists $xtrans->{$txnid} );

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

    ## get the adjusted share
    my $adjshare = $sales_csv->getkey( $row, 'adjusted_share' ) ne "\\N" ? $sales_csv->getkey( $row, 'adjusted_share' ) : 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;

    ## incorrect amount
    my $royamt     = $sales_csv->getkey( $row, 'roy_amt' );
    my $icAdjGross = $adjshare ? $royamt * ( $adjshare / 100 ) : $royamt;
    my $icOrchfee  = $feepct   ? $icAdjGross * $feepct         : 0;
    my $icNetRev   = $icAdjGross - $icOrchfee;

    ## report Dance Planet under 16475
    if ( $venid == 16476 ) {
        $row->{'vendor_id'} = 16475;
        $venid = 16475;
    }

    if ( not $opt->noprint ) {
        my $line = $sales_csv->getstr($row);
        chomp($line);
        $line = $line . "\t$adjgross\t$feepct\t$orchfee\t$netrev";
        print "$line\n";
    }

    $vendorSummary->{$venid}->{'netrev'}    += $netrev;
    $vendorSummary->{$venid}->{'ic_netrev'} += $icNetRev;

}

print STDERR "Vendor,NetRev,IncorrectNetRev,Delta\n";
foreach my $vid ( sort { $a <=> $b } keys %{$vendorSummary} ) {
    my $href  = $vendorSummary->{$vid};
    my $delta = $href->{'netrev'} - $href->{'ic_netrev'};
    printf STDERR "%d,%.2f,%.2f,%.2f\n", $vid, $href->{'netrev'}, $href->{'ic_netrev'}, $delta;
}
