#!/usr/bin/perl
#by IV ' lost
use MIME::Base64;
use File::Slurp;
use List::Util qw(shuffle);
use POSIX qw(strftime);
use strict;
use warnings;

my ($destinatario_file, $html_folder, $assuntos_file, $links_file, $nomes_file, $remetentes_file) = @ARGV;

if (not defined $destinatario_file || not defined $html_folder || not defined $assuntos_file || not defined $links_file || not defined $nomes_file || not defined $remetentes_file) {
    die "Usage: $0 <destinatario_file> <html_folder> <assuntos_file> <links_file> <nomes_file> <remetentes_file>\n";
}

my $sendmail = '/usr/sbin/sendmail';

sub read_random_file {
    my ($folder_path) = @_;
    my @files = grep { -f "$folder_path/$_" } shuffle(read_dir($folder_path));
    my $file = $files[0];
    my $content = read_file("$folder_path/$file");
    return $content;
}

sub read_random_line {
    my ($file_path) = @_;
    my @lines = shuffle(read_file($file_path));
    my $line = $lines[0];
    chomp($line);
    return $line;
}

# Substitui variáveis em um texto usando as chaves do hashref $vars
sub substituir_variaveis {
    my ($texto, $vars) = @_;
    return $texto unless defined $texto && defined $vars;

    # links e nomes
    $texto =~ s/%LINK%/ $vars->{link} /g if defined $vars->{link};
    $texto =~ s/#NOME#/ $vars->{nome} /g if defined $vars->{nome};
    $texto =~ s/#DESTINATARIO#/ $vars->{ID} /g if defined $vars->{ID};

    # números aleatórios %rand1%..%rand9% e %rand%
    for my $i (1..9) {
        my $k = "r$i";
        if (defined $vars->{$k}) {
            $texto =~ s/%rand$i%/$vars->{$k}/g;
        }
    }
    # %rand% gera 4 dígitos como no PHP
    $texto =~ s/%rand%/"" . (int(rand(9000)) + 1000)/ge;

    # #RAND8# (8 dígitos) e %rand8%
    if (defined $vars->{rand8}) {
        $texto =~ s/#RAND8#/$vars->{rand8}/g;
        $texto =~ s/%rand8%/$vars->{rand8}/g;
    }

    # Substituições antigas compatíveis
    $texto =~ s/%email%/$vars->{ID}/g if defined $vars->{ID};
    $texto =~ s/%data%/$vars->{data_completa}/g if defined $vars->{data_completa};
    $texto =~ s/%hora%/$vars->{hora_completa}/g if defined $vars->{hora_completa};

    # Datas e horas com #VAR#
    $texto =~ s/#DIA#/$vars->{dia}/g if defined $vars->{dia};
    $texto =~ s/#MES#/$vars->{mes}/g if defined $vars->{mes};
    $texto =~ s/#ANO#/$vars->{ano}/g if defined $vars->{ano};
    $texto =~ s/#ANO2#/$vars->{ano_curto}/g if defined $vars->{ano_curto};
    $texto =~ s/#HORA#/$vars->{hora}/g if defined $vars->{hora};
    $texto =~ s/#MINUTO#/$vars->{minuto}/g if defined $vars->{minuto};
    $texto =~ s/#SEGUNDO#/$vars->{segundo}/g if defined $vars->{segundo};
    $texto =~ s/#DATA#/$vars->{data_completa}/g if defined $vars->{data_completa};
    $texto =~ s/#HORA_COMPLETA#/$vars->{hora_completa}/g if defined $vars->{hora_completa};
    $texto =~ s/#DATAHORA#/$vars->{data_hora}/g if defined $vars->{data_hora};
    $texto =~ s/#DATA_BR#/$vars->{data_br}/g if defined $vars->{data_br};
    $texto =~ s/#DATA_US#/$vars->{data_us}/g if defined $vars->{data_us};
    $texto =~ s/#MES_NOME#/$vars->{mes_nome}/g if defined $vars->{mes_nome};
    $texto =~ s/#DIA_SEMANA#/$vars->{dia_semana}/g if defined $vars->{dia_semana};

    return $texto;
}

my $count = 0;

open(my $dest_fh, '<', $destinatario_file) or die "Can't open $destinatario_file: $!";
while (my $ID = <$dest_fh>) {
    chomp($ID);

    my $html_content = read_random_file($html_folder);
    my $subject = read_random_line($assuntos_file);
    my $sender = read_random_line($remetentes_file);

    # Variáveis de data e hora
    my $dia = strftime("%d", localtime);
    my $mes = strftime("%m", localtime);
    my $ano = strftime("%Y", localtime);
    my $ano_curto = strftime("%y", localtime);
    my $hora = strftime("%H", localtime);
    my $minuto = strftime("%M", localtime);
    my $segundo = strftime("%S", localtime);
    my $data_completa = strftime("%d/%m/%Y", localtime);
    my $hora_completa = strftime("%H:%M:%S", localtime);
    my $data_hora = strftime("%d/%m/%Y %H:%M:%S", localtime);
    my $data_br = strftime("%d/%m/%Y", localtime);
    my $data_us = strftime("%Y-%m-%d", localtime);
    
    # Nomes dos meses em português
    my @meses = ('', 'Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 
                 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro');
    my $mes_nome = $meses[int($mes)];
    
    # Dias da semana em português
    my @dias_semana = ('Domingo', 'Segunda-feira', 'Terça-feira', 'Quarta-feira', 
                       'Quinta-feira', 'Sexta-feira', 'Sábado');
    my $dia_semana = $dias_semana[strftime("%w", localtime)];

    # Geração de números aleatórios (ajustada para manter compatibilidade com a função PHP fornecida)
    # %rand1%..%rand7% e %rand9% -> 1000..9999 (4 dígitos)
    # %rand8% (e #RAND8#) -> 8 dígitos
    my $r1 = int(rand(9000)) + 1000; # 1000-9999
    my $r2 = int(rand(9000)) + 1000;
    my $r3 = int(rand(9000)) + 1000;
    my $r4 = int(rand(9000)) + 1000;
    my $r5 = int(rand(9000)) + 1000;
    my $r6 = int(rand(9000)) + 1000;
    my $r7 = int(rand(9000)) + 1000;
    my $r9 = int(rand(9000)) + 1000;

    # rand8 com exatamente 8 dígitos (string)
    my $r8 = sprintf("%08d", int(rand(90000000)) + 10000000);
    my $rand8 = $r8; # manter o nome $rand8 já usado no script

    my $link = read_random_line($links_file);
    my $nome = read_random_line($nomes_file);

    # Substituições no conteúdo HTML (centralizadas)
    $html_content = substituir_variaveis($html_content, {
        link => $link,
        nome => $nome,
        ID => $ID,
        r1 => $r1, r2 => $r2, r3 => $r3, r4 => $r4, r5 => $r5, r6 => $r6, r7 => $r7, r8 => $r8, r9 => $r9,
        rand8 => $rand8,
        data_completa => $data_completa,
        hora_completa => $hora_completa,
        data_hora => $data_hora,
        data_br => $data_br,
        data_us => $data_us,
        dia => $dia, mes => $mes, ano => $ano, ano_curto => $ano_curto,
        hora => $hora, minuto => $minuto, segundo => $segundo,
        mes_nome => $mes_nome, dia_semana => $dia_semana,
    });

    my $corpo = encode_base64($html_content);
    my $recipient = $ID;
    
    # Substituições no assunto (centralizadas)
    $subject = substituir_variaveis($subject, {
        ID => $ID,
        r1 => $r1, r2 => $r2, r3 => $r3, r4 => $r4, r5 => $r5, r6 => $r6, r7 => $r7, r8 => $r8, r9 => $r9,
        rand8 => $rand8,
        data_completa => $data_completa,
        hora_completa => $hora_completa,
        data_hora => $data_hora,
        data_br => $data_br,
        data_us => $data_us,
        dia => $dia, mes => $mes, ano => $ano, ano_curto => $ano_curto,
        hora => $hora, minuto => $minuto, segundo => $segundo,
        mes_nome => $mes_nome, dia_semana => $dia_semana,
    });

    # Substituições no remetente (centralizadas)
    $sender = substituir_variaveis($sender, {
        ID => $ID,
        r1 => $r1, r2 => $r2, r3 => $r3, r4 => $r4, r5 => $r5, r6 => $r6, r7 => $r7, r8 => $r8, r9 => $r9,
        rand8 => $rand8,
        data_completa => $data_completa,
        hora_completa => $hora_completa,
        data_hora => $data_hora,
        data_br => $data_br,
        data_us => $data_us,
        dia => $dia, mes => $mes, ano => $ano, ano_curto => $ano_curto,
        hora => $hora, minuto => $minuto, segundo => $segundo,
        mes_nome => $mes_nome, dia_semana => $dia_semana,
    });

    open(my $sendmail_fh, "| $sendmail -t") or die "Failed to open pipe to sendmail: $!";
    print $sendmail_fh "MIME-Version: 1.0\n";
    print $sendmail_fh "Content-type: text/html; charset=UTF-8\n";
    print $sendmail_fh "Content-Transfer-Encoding: base64\n";
    print $sendmail_fh "Subject: $subject\n";
    print $sendmail_fh "From: $sender\n";
    print $sendmail_fh "To: $recipient\n";
    print $sendmail_fh "$corpo\n\n";
    close($sendmail_fh);

    printf "E-mail enviado para: $recipient\n";

    $count++;
    if ($count % 5000 == 0) {
        print "Pausa de 60 segundos antes do próximo envio...\n";
        sleep(10);
    }
}

close($dest_fh);
