#!/usr/bin/perl

use strict;
use warnings;
use Data::Validate::Sanctions;
use LWP::UserAgent;
use Text::CSV;

my $sanction_file = shift // Data::Validate::Sanctions::get_sanction_file();
open my $fh, '+>', undef or die "Could not open anonymous temp file - $!";
my $ua = LWP::UserAgent->new;
my $csv = Text::CSV->new({binary => 1}) or die "Cannot use CSV: " . Text::CSV->error_diag();

sub _download {
    my $url = shift;
    sleep 1;
    my $res = $ua->get($url);
    die "Download $url failed: " . $res->status_line . ", Please check your network or retry.\n"
        unless $res->is_success;
    return $res;
}

## download CSV
my @urls = ('https://www.treasury.gov/ofac/downloads/sdn.csv', 'https://www.treasury.gov/ofac/downloads/consolidated/cons_prim.csv');
foreach my $url (@urls) {
    my $res = _download($url);
    print $fh $res->decoded_content;
}

# parse CSV
my @names;
seek($fh, 0, 0);    # for read
while (my $row = $csv->getline($fh)) {
    ($row->[2] and $row->[2] eq "individual") or next;
    my $name = $row->[1];
    $name = uc($name);
    $name =~ s/[[:^alpha:]]//g;
    push @names, $name;
}
seek($fh, 0, 0);

# now add aliases to our list
my $res = _download('https://www.treasury.gov/ofac/downloads/alt.csv');
print $fh $res->decoded_content;
seek($fh, 0, 0);
while (my $row = $csv->getline($fh)) {
    my $name = $row->[3];
    $name = uc($name);
    $name =~ s/[[:^alpha:]]//g;
    push @names, $name;
}
seek($fh, 0, 0);

# now add UK to our list
# this list produces Text::CSV errors, be prepared
$res = _download('http://hmt-sanctions.s3.amazonaws.com/sanctionsconlist.csv');
print $fh $res->decoded_content;
seek($fh, 0, 0);
while (my $row = $csv->getline($fh) or not $csv->eof) {
    ($row->[23] and $row->[23] eq "Individual") or next;
    my $name;
    map { $name .= $row->[$_] } (0 .. 5);
    $name = uc($name);
    $name =~ s/[[:^alpha:]]//g;
    push @names, $name;
}
seek($fh, 0, 0);

# write
my %names = map { $_ => 1 } @names;
@names = sort(keys %names);    # usort

my $new_sanction_file = $sanction_file . ".tmp";
open(my $out_fh, '>:encoding(UTF8)', $new_sanction_file) or die "Can't write to $new_sanction_file: $!\n";
print $out_fh join("\n", @names);
close($out_fh);

rename $new_sanction_file, $sanction_file or die "Can't rename $new_sanction_file to $sanction_file, please check it\n";
print "Updated.\n";

1;
