<?php
/**
 * Script para processar e-mails agendados
 * VERSÃO CORRIGIDA - COM VERIFICAÇÃO DE DIA/HORA EXATA
 * Executar via cron job a cada 1 minuto: * * * * * php /caminho/processar_emails_agendados.php
 */

// ============================================================================
// CONFIGURAÇÃO INICIAL
// ============================================================================

// Habilitar todos os erros
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('log_errors', 1);

// Definir caminho absoluto
define('ROOT_PATH', dirname(__FILE__));
chdir(ROOT_PATH);

// Configurar diretório de logs
define('LOG_DIR', ROOT_PATH . '/logs');
if (!file_exists(LOG_DIR)) {
    mkdir(LOG_DIR, 0755, true);
}

// ============================================================================
// FUNÇÃO DE LOGS APRIMORADA
// ============================================================================

/**
 * Função de log aprimorada que grava em arquivo e mostra no console se CLI
 */
function sistema_log($mensagem, $tipo = 'INFO') {
    $timestamp = date('[Y-m-d H:i:s]');
    $log_line = "$timestamp [$tipo] $mensagem\n";
    
    // Arquivo de log diário
    $log_file = LOG_DIR . '/emails_' . date('Y-m-d') . '.log';
    
    // Gravar no arquivo de log
    file_put_contents($log_file, $log_line, FILE_APPEND | LOCK_EX);
    
    // Se executando via linha de comando, mostrar também no console
    if (php_sapi_name() === 'cli') {
        echo $log_line;
    }
    
    // Também enviar para error_log padrão
    error_log("[$tipo] $mensagem");
}

// ============================================================================
// INÍCIO DO PROCESSAMENTO
// ============================================================================

sistema_log("🔄 INICIANDO PROCESSAMENTO DE E-MAILS AGENDADOS", 'INICIO');

// Incluir arquivos necessários
try {
    // Caminhos absolutos para os arquivos necessários
    $base_path = dirname(__FILE__) . '/';
    
    $conexao_file = $base_path . 'conexao.php';
    $verificador_file = $base_path . 'verificador_fluxos_automatizados.php';
    
    if (!file_exists($conexao_file)) {
        throw new Exception("Arquivo conexao.php não encontrado: $conexao_file");
    }
    
    if (!file_exists($verificador_file)) {
        throw new Exception("Arquivo verificador_fluxos_automatizados.php não encontrado: $verificador_file");
    }
    
    require_once $conexao_file;
    sistema_log("✅ conexao.php carregado com sucesso", 'SISTEMA');
    
    require_once $verificador_file;
    sistema_log("✅ verificador_fluxos_automatizados.php carregado", 'SISTEMA');
    
} catch (Exception $e) {
    sistema_log("❌ ERRO ao carregar arquivos: " . $e->getMessage(), 'ERRO');
    die("Erro crítico: Não foi possível carregar arquivos necessários");
}

// ============================================================================
// USAR A MESMA FUNÇÃO DE CONEXÃO DO SISTEMA
// ============================================================================

sistema_log("🔌 Conectando ao banco de dados usando conexao.php...", 'BANCO');

// Verificar se a função conectarBancoDados existe
if (!function_exists('conectarBancoDados')) {
    sistema_log("❌ FUNÇÃO conectarBancoDados NÃO ENCONTRADA", 'ERRO');
    die("Erro: Função de conexão não encontrada");
}

// Criar conexão usando a função do sistema
$conn = conectarBancoDados();

if (!$conn) {
    sistema_log("❌ FALHA NA CONEXÃO COM BANCO DE DADOS", 'ERRO');
    http_response_code(500);
    die("Erro: Não foi possível conectar ao banco de dados");
}

sistema_log("✅ Conexão com banco estabelecida com sucesso", 'BANCO');

// ============================================================================
// VERIFICAR TABELA DE E-MAILS AGENDADOS
// ============================================================================

sistema_log("🔍 Verificando tabela de e-mails agendados...", 'SISTEMA');

// Verificar se a função existe
if (!function_exists('verificarTabelaEmailsAgendados')) {
    sistema_log("❌ FUNÇÃO verificarTabelaEmailsAgendados NÃO ENCONTRADA", 'ERRO');
    die("Erro: Função de verificação de tabela não encontrada");
}

verificarTabelaEmailsAgendados($conn);
sistema_log("✅ Tabela de e-mails agendados verificada", 'SISTEMA');

// ============================================================================
// BUSCAR E-MAILS AGENDADOS
// ============================================================================

sistema_log("🔍 Buscando e-mails agendados para processar...", 'PROCESSO');

// Buscar e-mails que DEVEM SER ENVIADOS AGORA
$sql = "SELECT ea.*, c.Nome_Cliente, c.Email as cliente_email 
        FROM emails_agendados ea
        LEFT JOIN clientes c ON ea.cliente_id = c.id
        WHERE ea.status = 'agendado' 
        AND ea.data_agendamento <= NOW()
        AND (ea.tentativas < 3 OR ea.tentativas IS NULL)
        ORDER BY ea.data_agendamento ASC
        LIMIT 20";

sistema_log("🔍 Executando consulta SQL...", 'DEBUG');

$result = $conn->query($sql);

if (!$result) {
    sistema_log("❌ Erro na consulta SQL: " . $conn->error, 'ERRO');
    $conn->close();
    die("Erro na consulta ao banco de dados");
}

$total_encontrados = $result->num_rows;
$emails_processados = 0;
$emails_com_erro = 0;

sistema_log("📊 E-mails encontrados para processar: $total_encontrados", 'PROCESSO');

if ($total_encontrados == 0) {
    sistema_log("ℹ️  Nenhum e-mail para processar no momento", 'INFO');
    $conn->close();
    sistema_log("✅ PROCESSAMENTO FINALIZADO - Sem e-mails para processar", 'FIM');
    exit;
}

// ============================================================================
// PROCESSAR CADA E-MAIL
// ============================================================================

sistema_log("🚀 Iniciando processamento de $total_encontrados e-mail(s)...", 'PROCESSO');

while ($email = $result->fetch_assoc()) {
    $email_id = $email['id'];
    $destinatario = $email['destinatario_email'];
    $data_agendamento = $email['data_agendamento'];
    $tentativas = $email['tentativas'] ?? 0;
    
    sistema_log("📧 Processando e-mail ID: $email_id | Para: $destinatario | Agendado para: $data_agendamento", 'EMAIL');
    
    try {
        // ========================================
        // 1. VERIFICAÇÃO DE TENTATIVAS
        // ========================================
        if ($tentativas >= 3) {
            sistema_log("   ⚠️  E-mail tem $tentativas tentativas falhas, marcando como erro permanente", 'EMAIL');
            
            $stmt = $conn->prepare("UPDATE emails_agendados SET status = 'erro', erro_mensagem = 'Máximo de tentativas excedido' WHERE id = ?");
            $stmt->bind_param("i", $email_id);
            $stmt->execute();
            $stmt->close();
            
            $emails_com_erro++;
            continue;
        }
        
        // ========================================
        // 2. ATUALIZAR STATUS PARA PROCESSANDO
        // ========================================
        sistema_log("   🔄 Atualizando status para 'processando'...", 'EMAIL');
        
        $stmt = $conn->prepare("UPDATE emails_agendados SET status = 'processando', tentativas = tentativas + 1, ultima_tentativa = NOW() WHERE id = ?");
        if (!$stmt) {
            throw new Exception("Erro ao preparar statement: " . $conn->error);
        }
        
        $stmt->bind_param("i", $email_id);
        if (!$stmt->execute()) {
            throw new Exception("Erro ao executar update: " . $stmt->error);
        }
        $stmt->close();
        
        sistema_log("   ✅ Status atualizado para 'processando'", 'EMAIL');
        
        // ========================================
        // 3. CONFIGURAR CONTEXTO
        // ========================================
        if (session_status() === PHP_SESSION_NONE) {
            session_start();
        }
        
        // Salvar contexto atual para restaurar depois
        $contexto_original = [
            'usuario_id' => $_SESSION['usuario_id'] ?? null,
            'tenant_id' => $_SESSION['tenant_id'] ?? null
        ];
        
        // Configurar contexto para o usuário que criou o agendamento
        $_SESSION['usuario_id'] = $email['usuario_id'];
        $_SESSION['tenant_id'] = $email['tenant_id'];
        
        sistema_log("   👤 Contexto configurado - Usuário: {$email['usuario_id']}, Tenant: {$email['tenant_id']}", 'EMAIL');
        
        // ========================================
        // 4. PREPARAR DADOS DO E-MAIL
        // ========================================
        $config_email = json_decode($email['config_email'], true);
        $assunto = $email['assunto'];
        $mensagem_final = $email['mensagem'];
        
        sistema_log("   📝 Assunto original: $assunto", 'EMAIL');
        
        // Buscar template se existir
        if ($email['template_id'] && function_exists('buscarTemplateEmail')) {
            sistema_log("   🎯 Buscando template ID: {$email['template_id']}", 'EMAIL');
            $template = buscarTemplateEmail($conn, $email['template_id'], $email['tenant_id']);
            
            if ($template) {
                sistema_log("   ✅ Template encontrado: {$template['nome']}", 'EMAIL');
                
                if (empty($assunto) || $assunto === 'Comunicação do Sistema') {
                    $assunto = $template['assunto'];
                    sistema_log("   📝 Assunto atualizado do template: $assunto", 'EMAIL');
                }
                
                if (!empty($template['conteudo'])) {
                    $mensagem_final = $template['conteudo'];
                    sistema_log("   📄 Conteúdo do template carregado (" . strlen($mensagem_final) . " caracteres)", 'EMAIL');
                    
                    if (!empty($email['mensagem'])) {
                        $mensagem_final .= "\n\n---\n" . $email['mensagem'];
                        sistema_log("   📝 Mensagem personalizada adicionada", 'EMAIL');
                    }
                }
            } else {
                sistema_log("   ⚠️  Template não encontrado, usando dados da ação", 'EMAIL');
            }
        }
        
        // ========================================
        // 5. APLICAR SUBSTITUIÇÃO DE VARIÁVEIS
        // ========================================
        if (function_exists('substituirVariaveisEmail')) {
            sistema_log("   🔄 Aplicando substituição de variáveis...", 'EMAIL');
            
            $assunto_final = substituirVariaveisEmail($assunto, $email['cliente_id'], $conn, $email['tenant_id']);
            $mensagem_final = substituirVariaveisEmail($mensagem_final, $email['cliente_id'], $conn, $email['tenant_id']);
            
            sistema_log("   ✅ Variáveis substituídas | Assunto final: $assunto_final", 'EMAIL');
        } else {
            $assunto_final = $assunto;
            sistema_log("   ⚠️ Função substituirVariaveisEmail não encontrada, usando texto original", 'EMAIL');
        }
        
        // ========================================
        // 6. PREPARAR ASSINATURA
        // ========================================
        sistema_log("   🖋️  Carregando dados da assinatura...", 'EMAIL');
        
        $assinatura_html = '';
        if (function_exists('carregarDadosAssinatura') && function_exists('gerarAssinatura')) {
            $dados_assinatura = carregarDadosAssinatura($conn, $email['tenant_id'], $email['usuario_id']);
            $assinatura_html = $dados_assinatura ? gerarAssinatura($dados_assinatura) : '';
            
            if (!empty($assinatura_html)) {
                sistema_log("   ✅ Assinatura carregada (" . strlen($assinatura_html) . " caracteres)", 'EMAIL');
            } else {
                sistema_log("   ⚠️  Assinatura não disponível", 'EMAIL');
            }
        } else {
            sistema_log("   ⚠️ Funções de assinatura não encontradas", 'EMAIL');
        }
        
        // Aplicar assinatura
        $mensagem_html = nl2br(htmlspecialchars($mensagem_final));
        if (!empty($assinatura_html) && function_exists('aplicarAssinatura')) {
            $mensagem_html = aplicarAssinatura($mensagem_html, $assinatura_html);
            sistema_log("   ✅ Assinatura aplicada ao e-mail", 'EMAIL');
        }
        
        // ========================================
        // 7. CONSTRUIR E-MAIL HTML
        // ========================================
        $email_html = "
        <!DOCTYPE html>
        <html lang='pt-BR'>
        <head>
            <meta charset='UTF-8'>
            <meta name='viewport' content='width=device-width, initial-scale=1.0'>
            <title>" . htmlspecialchars($assunto_final) . "</title>
            <style>
                body, html {
                    margin: 0;
                    padding: 20px;
                    font-family: Arial, sans-serif;
                    line-height: 1.6;
                    color: #333;
                    background-color: #f9f9f9;
                    text-align: left !important;
                }
                .email-container {
                    max-width: 100%;
                    margin: 0;
                    background: white;
                    padding: 20px;
                    border-radius: 0;
                    box-shadow: none;
                    text-align: left !important;
                }
                .assinatura {
                    margin-top: 30px;
                    padding-top: 20px;
                    border-top: 2px solid #007bff;
                }
            </style>
        </head>
        <body>
            <div class='email-container'>
                " . $mensagem_html . "
            </div>
        </body>
        </html>";
        
        sistema_log("   📄 E-mail HTML preparado (" . strlen($email_html) . " caracteres)", 'EMAIL');
        
        // ========================================
        // 8. ENVIAR VIA PHPMailer/SMTP
        // ========================================
        sistema_log("   📤 Enviando via sistema de e-mail...", 'EMAIL');
        
        $remetente_nome = $config_email['remetente_nome'] ?? 'Sistema SON';
        $remetente_email = $config_email['remetente_email'] ?? 'sistema@notificacaoson.tvitecnologia.com.br';
        
        sistema_log("   👤 Remetente: $remetente_nome <$remetente_email>", 'EMAIL');
        sistema_log("   👥 Destinatário: {$email['destinatario_nome']} <{$email['destinatario_email']}>", 'EMAIL');
        
        // Tentar enviar
        $resultadoEnvio = ['success' => false, 'message' => 'Função de envio não disponível'];
        
        if (function_exists('enviarEmailSistema')) {
            $resultadoEnvio = enviarEmailSistema(
                $email['destinatario_email'],
                $assunto_final,
                $email_html,
                $remetente_nome,
                $remetente_email
            );
        } elseif (function_exists('enviarEmail')) {
            // Fallback para função antiga
            $cliente_dados = [
                'Nome_Cliente' => $email['destinatario_nome'],
                'Email' => $email['destinatario_email']
            ];
            
            $resultadoEnvio = enviarEmail(
                [$email['destinatario_email']],
                $assunto_final,
                $email_html,
                $cliente_dados,
                ['nome' => 'E-mail Agendado'],
                $remetente_nome,
                $remetente_email
            );
        } else {
            sistema_log("   ❌ NENHUMA FUNÇÃO DE ENVIO DISPONÍVEL", 'ERRO');
            throw new Exception("Nenhuma função de envio de e-mail encontrada");
        }
        
        // ========================================
        // 9. RESTAURAR CONTEXTO ORIGINAL
        // ========================================
        if (!empty($contexto_original['usuario_id'])) {
            $_SESSION['usuario_id'] = $contexto_original['usuario_id'];
        }
        if (!empty($contexto_original['tenant_id'])) {
            $_SESSION['tenant_id'] = $contexto_original['tenant_id'];
        }
        
        // ========================================
        // 10. TRATAR RESULTADO DO ENVIO
        // ========================================
        if ($resultadoEnvio['success']) {
            sistema_log("   ✅ E-mail enviado com sucesso", 'EMAIL');
            
            // Atualizar status para enviado
            $stmt = $conn->prepare("UPDATE emails_agendados SET status = 'enviado', data_envio = NOW() WHERE id = ?");
            $stmt->bind_param("i", $email_id);
            $stmt->execute();
            $stmt->close();
            
            $emails_processados++;
            sistema_log("   ✅ Status atualizado para 'enviado'", 'EMAIL');
            
            // Registrar log no sistema
            if (function_exists('registrarLogEmailFluxo')) {
                registrarLogEmailFluxo($conn, $email['cliente_id'], $email['usuario_id'], $assunto_final, $email['destinatario_email'], $mensagem_final, $email['tenant_id']);
                sistema_log("   📝 Log registrado no sistema", 'EMAIL');
            }
            
        } else {
            sistema_log("   ❌ FALHA no envio: " . $resultadoEnvio['message'], 'ERRO');
            $emails_com_erro++;
            
            // Verificar se deve marcar como erro permanente
            $novas_tentativas = $tentativas + 1;
            
            if ($novas_tentativas >= 3) {
                // Máximo de tentativas atingido
                $erro_msg = substr("Falha após 3 tentativas: " . $resultadoEnvio['message'], 0, 500);
                $stmt = $conn->prepare("UPDATE emails_agendados SET status = 'erro', erro_mensagem = ? WHERE id = ?");
                $stmt->bind_param("si", $erro_msg, $email_id);
                $stmt->execute();
                $stmt->close();
                sistema_log("   ⚠️  Status atualizado para 'erro' (máximo de tentativas)", 'EMAIL');
            } else {
                // Voltar para agendado para nova tentativa
                $stmt = $conn->prepare("UPDATE emails_agendados SET status = 'agendado' WHERE id = ?");
                $stmt->bind_param("i", $email_id);
                $stmt->execute();
                $stmt->close();
                sistema_log("   ⏰ Status voltou para 'agendado' para nova tentativa ($novas_tentativas/3)", 'EMAIL');
            }
        }
        
        sistema_log("   ✅ Processamento do e-mail ID $email_id concluído", 'EMAIL');
        
    } catch (Exception $e) {
        sistema_log("   ❌ EXCEÇÃO ao processar e-mail ID $email_id: " . $e->getMessage(), 'ERRO');
        sistema_log("   🔧 Stack trace: " . $e->getTraceAsString(), 'ERRO');
        
        // Restaurar contexto original se necessário
        if (isset($contexto_original)) {
            if (!empty($contexto_original['usuario_id'])) {
                $_SESSION['usuario_id'] = $contexto_original['usuario_id'];
            }
            if (!empty($contexto_original['tenant_id'])) {
                $_SESSION['tenant_id'] = $contexto_original['tenant_id'];
            }
        }
        
        // Marcar como erro ou voltar para agendado
        $erro_msg = substr($e->getMessage(), 0, 500);
        if ($tentativas >= 2) {
            // Máximo de tentativas atingido
            $stmt = $conn->prepare("UPDATE emails_agendados SET status = 'erro', erro_mensagem = ? WHERE id = ?");
            if ($stmt) {
                $stmt->bind_param("si", $erro_msg, $email_id);
                $stmt->execute();
                $stmt->close();
            }
            sistema_log("   ❌ Marcado como erro permanente", 'EMAIL');
        } else {
            // Voltar para agendado
            $stmt = $conn->prepare("UPDATE emails_agendados SET status = 'agendado', erro_mensagem = ? WHERE id = ?");
            if ($stmt) {
                $stmt->bind_param("si", $erro_msg, $email_id);
                $stmt->execute();
                $stmt->close();
            }
            sistema_log("   ⏰ Voltou para agendado para nova tentativa", 'EMAIL');
        }
        
        $emails_com_erro++;
    }
    
    // Pequena pausa entre e-mails para evitar sobrecarga
    if ($total_encontrados > 1) {
        usleep(500000); // 0.5 segundo
    }
}

// ============================================================================
// LIMPAR E-MAILS COM ERRO PERMANENTE (MAIS DE 30 DIAS)
// ============================================================================

sistema_log("🧹 Limpando e-mails com erro permanente (mais de 30 dias)...", 'LIMPEZA');
$sql_limpeza = "DELETE FROM emails_agendados WHERE status = 'erro' AND data_envio IS NULL AND data_agendamento < DATE_SUB(NOW(), INTERVAL 30 DAY)";
$result_limpeza = $conn->query($sql_limpeza);
if ($result_limpeza) {
    $limpos = $conn->affected_rows;
    sistema_log("✅ Limpos $limpos e-mails com erro permanente", 'LIMPEZA');
} else {
    sistema_log("❌ Erro ao limpar e-mails: " . $conn->error, 'ERRO');
}

// ============================================================================
// FINALIZAÇÃO
// ============================================================================

// Fechar conexão
$conn->close();
sistema_log("🔒 Conexão com banco fechada", 'BANCO');

// Resumo final
$resumo = "📊 RESUMO DO PROCESSAMENTO: ";
$resumo .= "Total encontrados: $total_encontrados | ";
$resumo .= "Processados com sucesso: $emails_processados | ";
$resumo .= "Com erro: $emails_com_erro";

sistema_log($resumo, 'RESUMO');
sistema_log("✅ PROCESSAMENTO FINALIZADO", 'FIM');

// Log de performance
if (isset($_SERVER["REQUEST_TIME_FLOAT"])) {
    $tempo_execucao = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];
    sistema_log("⏱️  Tempo de execução: " . round($tempo_execucao, 2) . " segundos", 'PERFORMANCE');
}

?>