#!/usr/bin/perl

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

use Git;
use JSON::XS;
use FileHandle;
use Text::CSV::Easy(qw/csv_build csv_parse/);

use lib '/var/app/orchard/collab/jgetter/perllib';
use Orchard::Session;
use Orchard::DB::Connect;

my $vendor   = shift @ARGV;
my $database = shift @ARGV || 'orchprod';

my $dsn = Orchard::DB::Connect->dsn($database);
my $dbh;
if ( defined $dsn->{'ssh'} ) {
    my $ssh = $dsn->{'ssh'};
    $ssh->{'net'}->spawn( $ssh->{'tunnel'} );
}
$dbh = DBI->connect( @{ $dsn->{'conn'} } ) || die "Conn: $DBI::errstr";

my $vatypes = [
    'advance_payment',              'advance_recouped',            'amount_payable',            'balance_forward',
    'carried_over_balance',         'cloud_publishing',            'digital_checkspaid',        'dig_actual_net',
    'dig_adjusted_gross',           'dig_amount_payable',          'dig_balance_forward',       'dig_carried_over_balance',
    'dig_distribution_fees',        'dig_gross',                   'dig_net_receipt',           'dig_outstanding_balance',
    'dig_partner_share',            'dig_recoupe',                 'dpd_publishing',            'fx_spread_fee',
    'label_balance_forward',        'label_checkspaid',            'label_outstanding_balance', 'manual_adjustment',
    'manual_adjustment_checkspaid', 'man_adj_outstanding_balance', 'oms_fees',                  'opening_manual_adjustment',
    'outstanding_balance',          'physical_checkspaid',         'phy_actual_net',            'phy_amount_payable',
    'phy_balance_forward',          'phy_carried_over_balance',    'phy_cost',                  'phy_distribution_fees',
    'phy_gross',                    'phy_liquidation',             'phy_net_receipt',           'phy_outstanding_balance',
    'phy_partner_share',            'phy_recoupe',                 'phy_reserves',              'phy_return',
    'recoupable_advance',           'ringtone_publishing',         'server_fixation_fees',      'total_checkspaid',
    'unrecouped_advance'
];
my $pids;
map { $pids->{$_} = 0 } ( 0 ... 355 );

my $periods;
map { $periods->{$_} = { 'amount' => { %{$pids} } } } @{$vatypes};

my $vatypes_used;

my $rows = $dbh->selectall_hashref( 'select * from vendor_accounting where vendor_id=?', 'id', undef, ($vendor) );
if ( defined $rows ) {
    foreach my $id ( sort keys %{$rows} ) {
        my $href   = $rows->{$id};
        my $type   = $href->{'entry_type'};
        my $amount = $href->{'amount'};
        my $pid    = $href->{'period_id'};
        $periods->{$type}->{'amount'}->{$pid} = $amount;
        $periods->{'sum'}->{$pid} += $amount;
        $vatypes_used->{$type}++;
    }
} else {
    logMessage( 'error', "No rows returned for $vendor" );
}

my $header = 'pid,' . ( join ',', sort keys %{$vatypes_used} );
print "$header\n";

for ( my $p = 1 ; $p <= scalar keys %{$pids} ; $p++ ) {
	next if not $periods->{'sum'}->{$p};
    my @line = ($p);
    foreach my $type ( sort keys %{$vatypes_used} ) {
        push @line, $periods->{$type}->{'amount'}->{$p};
    }
    my $line = csv_build(@line);
    print "$line\n";
}
