#!/usr/bin/perl
use warnings ;
use strict ;
#
# Script per il download automatico
# ed il rename coerente delle E-qsl
# dal sito www.eqsl.cc
#
# NOTE:
# - Esportare solo i QSO che hanno una conferma mediante eqsl
# - Verificare che esista il file della CARD prima di scaricare
# - la card è rinominata nel formato CALL_YYYYMMDD_BAND_MODE.jpg
# - Scaricare MAX 1 card ogni 15 secondi, altrimenti il processo
#   viene bloccato dai gestori del server
#
# ------------------------------------------------------------
# ------------------------------------------------------------

my $Quante_qsl = $ARGV[0] ;
if (!$Quante_qsl) {
   $Quante_qsl = 15 ;
}

# Alcuni parametri del programma:
my $File_log = './estratto_qso_confermati_eqsl.csv' ;
my $Path_eqsl = '/home/user/perl_script/eqsl-cards' ;
my $Utente = 'ik7xja' ;
my $Pass = 'password' ;

# ------------------------------------------------------------
# --------- Niente da modificare al di sotto di qua: ---------

undef my @Lista_qso_confermati ;
undef my %QSL_scaricate ;
my ($Err, $Descerrore) = (0, '') ;

# Carico in memoria le E-qsl già salvate:
&Trova_scaricate() ;

($Err, $Descerrore) = &carica_qso($File_log, $Quante_qsl) ;
my $Da_scaricare = @Lista_qso_confermati ;
if ($Da_scaricare) {
   my $Confermati = $Quante_qsl - $Da_scaricare ;

   foreach my $L(@Lista_qso_confermati) {
      $Confermati++ ;
      my ($callsign, $Anno, $Mese, $Giorno, $Ora, $Min, $band, $mode, $Card_name, $dxcc_ref, $cont) = split /;/, $L ;
      print " $Confermati --> QSO $callsign del $Giorno/$Mese/$Anno in $band $mode:\n" ;
      # verifico se esiste il path
      if (-e "$Path_eqsl/$cont/$dxcc_ref") {
         print "     --> Il path $Path_eqsl/$cont/$dxcc_ref ESISTE\n" ;
      } else {
         print "     --> Il path $Path_eqsl/$cont/$dxcc_ref NON ESISTE: lo creo\n" ;
         my $Comando = qq{mkdir -p $Path_eqsl/$cont/$dxcc_ref} ;
         my $r = qx{$Comando} ;
      }
      # Compongo il comando per e-qsl:
      my $Comando = qq{curl -s -d Username='$Utente' -d Password='$Pass' -d CallsignFrom='$callsign' -d QSOBand='$band' -d QSOMode='$mode' -d QSOYear='$Anno' -d QSOMonth='$Mese' -d QSODay='$Giorno' -d QSOHour='$Ora' -d QSOMinute='$Min' https://www.eqsl.cc/qslcard/GeteQSL.cfm} ;
      # print "$Comando\n" ;
      my $Res = qx{$Comando} ;
      my @Righe = split /\n/, $Res ;
      foreach my $R(@Righe) {
         $R =~ s/^ +// ;
         if ($R =~ /^.+img src=\"([a-z0-9\-\_\/\.]+)\".+$/i) {
            my $Image = $1 ;
            my $Url_image = 'https://www.eqsl.cc' . $Image ;
            my $Wget_command = qq{wget -q $Url_image -O $Path_eqsl/$cont/$dxcc_ref/$Card_name} ;
            # print "--> $Wget_command\n" ;
            my $Result = qx{$Wget_command} ;
            if (-e "$Path_eqsl/$cont/$dxcc_ref/$Card_name") {
               print "     Scaricata $Image salvata come $Card_name\n" ;
            } else {
               print "     ERRORE impossibile salvare $Image come $Card_name\n" ;
            }
            last ;
         } elsif ($R =~ /ERROR: (.+)$/i) {
            my $Errore = $1 ;
            if (!(-e "$Path_eqsl/ERROR")) {
               my $Comando = qq{mkdir -p $Path_eqsl/ERROR} ;
               my $r = qx{$Comando} ;
            }
            my $Comando = qq{echo "$Errore" > $Path_eqsl/ERROR/$Card_name} ;
            my $r = qx{$Comando} ;
            last ;
         }
      }
      print "     ...Mi fermo per 15 secondi... Control+C per interrompere ...\n\n" ;
      sleep(15) ;
   }
} else {
   print "Gia` confermati i $Quante_qsl QSO richiesti... mi fermo...\n" ;
}

exit ;

# ------------------------------------------------------------
# ------------------------------------------------------------
sub carica_qso {
   # Carico in LISTA solo i QSO confermati di cui
   # non ho ancora scaricato la cartolina e-qsl.
   my ($File_csv, $Quante) = @_ ;
   my ($Err, $Descerrore) = (0, '') ;
   my $Righe_totali = 0 ;
   if (-e $File_csv) {
      open(IN, "< $File_csv") || ($Err = 1);
      if ($Err) {
         $Descerrore = 'Impossibile leggere il file NOT001GS.CSV' ;
      } else {
         while (<IN>) {
            $Righe_totali++ ;
            $_ =~ s/\r//g ;
            $_ =~ s/\n//g ;
            $_ =~ s/"//g ;
            $_ =~ tr/[\x0D,\x20-\x7E]//dc ;
            # Tracciato:
            # callsign;qso_date;time_on;freq;band;mode;country;dxcc_ref;cont;
            # DL8AWK;20201022;12:16;10.115;30M;CW;"Federal Republic of Germany";DL;EU;
            if ($_ =~ /^callsign/) {
               next ;
            }
            my ($callsign, $qso_date, $time_on, $freq, $band, $mode, $country, $dxcc_ref, $cont) = split /;/, $_ ;
            my $Card_name = join('_', $callsign, $qso_date, $band, "$mode.jpg") ;
            $Card_name =~ s/\//\-/g ;
            if (!defined($QSL_scaricate{$Card_name})) {
               if ($dxcc_ref =~ /\(/) {
                  $dxcc_ref = (split /\(/, $dxcc_ref)[0] ;
               }
               my ($Anno, $Mese, $Giorno) = unpack("A4 A2 A2", $qso_date) ;
               my ($Ora, $Min) = split /\:/, $time_on ;
               my $Rec = join(';', $callsign, $Anno, $Mese, $Giorno, $Ora, $Min, $band, $mode, $Card_name, $dxcc_ref, $cont) ;
               push(@Lista_qso_confermati, $Rec) ;
            }
            last if ($Righe_totali > $Quante) ;
         }
         close(IN) ;
      }
   } else {
      ($Err, $Descerrore) = (1, 'File di log non trovato') ;
   }
   return ($Err, $Descerrore) ;
}
# ------------------------------------------------------------
# ------------------------------------------------------------
sub Trova_scaricate {
   my $Comando = qq{find $Path_eqsl -name "*.jpg" -exec basename \{\} \\\;} ;
   my $Res = qx{$Comando} ;
   my @Righe = split /\n/, $Res ;
   foreach my $R(@Righe) {
      $QSL_scaricate{$R} = 1 ;
   }
}
# ------------------------------------------------------------
# ----------------------------------------------------- Fine -