#!/usr/bin/perl

use strict;
use warnings;
use File::Temp qw/tempfile/;
use Data::Validate::Sanctions;
use LWP::UserAgent;
use Text::CSV;

my $sanction_file = shift // Data::Validate::Sanctions::get_sanction_file();
my ($fh, $tmp) = tempfile();

## download CSV
my $ua = LWP::UserAgent->new;
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 = $ua->get($url);
    die "Download $url failed: " . $res->status_line . ", Please check your network or retry.\n"
        unless $res->is_success;
    print $fh $res->decoded_content;
    sleep 1;
}

# parse CSV
my @names;
seek($fh, 0, 0);    # for read
my $csv = Text::CSV->new({binary => 1}) or die "Cannot use CSV: " . Text::CSV->error_diag();
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;
}

# 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;
