#!/usr/bin/perl

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

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

my $allcontracts;
my $contracts;
my $fh = FileHandle->new( "280-contracts.txt", "r" );
while (<$fh>) {
    chomp;
    my ( $id, $owner, $name, $curr, $status, $cid, $start, $end ) = split "\t", $_;
    next if $id =~ m/.*ACCOUNT_ID.*/i;
    my $data = {
        'contract_id'     => $cid,
        'account_id'      => $id,
        'account_name'    => $name,
        'valid_from_date' => $start,
        'valid_to_date'   => $end eq '' ? undef : $end
    };
    $contracts->{$cid} = $data;
    if ( scalar keys %{$contracts} >= 9950 ) {
        push @{$allcontracts}, $contracts;
        undef $contracts;
    }
}
push @{$allcontracts}, $contracts;

my $profitCenters = {
    'USO980' => '2963',
    'USO978' => '2963',
    'USO980' => '2968',
    'UK4912' => '4912',
};

my @pfkeys = keys %{$profitCenters};

my $i = 1;
foreach my $contracts ( @{$allcontracts} ) {

    my $contractData = { 'BusGroup' => 'ORC', 'To_Response_Message' => [] };
    my $accountData  = { 'BusGroup' => 'ORC', 'To_Response_Message' => [] };

    foreach my $id ( sort { $a <=> $b } %{$contracts} ) {
        my $href = $contracts->{$id};
        next unless defined $href->{'contract_id'} and defined $href->{'account_id'};
        my $datefrm = defined $href->{'valid_from_date'} ? $href->{'valid_from_date'} . 'T00:00:00' : '1970-01-01T00:00:00';
        my $dateto  = defined $href->{'valid_to_date'}   ? $href->{'valid_to_date'} . 'T00:00:00'   : '9999-12-31T00:00:00';
        my $pfkey   = $pfkeys[ rand @pfkeys ];
        if ( defined $href ) {
            push @{ $contractData->{'To_Contract'} },
              {
                'ContractId'   => $href->{'contract_id'},
                'ContractName' => $href->{'account_name'} . " (" . $href->{'contract_id'} . ")",
                'AccountId'    => $href->{'account_id'},
                'ContractType' => "Legacy Distribution",
                'Prctr'        => $pfkey,
                'Bukrs'        => $profitCenters->{$pfkey},
                'BusUnit'      => undef,
                'DateFrm'      => $datefrm,
                'DateTo'       => $dateto,
                'Zzfield1'     => undef,
                'Zzfield2'     => undef,
                'Zzfield3'     => undef
              };
            push @{ $accountData->{'To_Clnt_Acct'} },
              {
                'AccountId' => $href->{'account_id'},
                'AcctName'  => $href->{'account_name'},
                'Kunnr'     => undef,
                'Lifnr'     => undef,
                'Zzfield1'  => undef,
                'Zzfield2'  => undef
              };
        }

    }

    my $contractJson = JSON::XS::encode_json($contractData);
    my $accountJson  = JSON::XS::encode_json($accountData);

    my $idx = sprintf( "%s_%02d", DateTime->now->ymd(''), $i++ );
    my $cfh = FileHandle->new( "contracts_${idx}" . '.json', 'w' );
    $cfh->print($contractJson);
    $cfh->close;

    my $afh = FileHandle->new( "accounts_${idx}" . '.json', 'w' );
    $afh->print($accountJson);
    $afh->close;

}
