<?php
/**
 * Função de envio de email via SMTP
 * Mais confiável que mail() do PHP
 */

require_once 'config.php';

/**
 * Envia email usando SMTP (se configurado) ou mail() padrão
 */
function sendEmailSMTP($to, $subject, $message_html, $message_text = '') {
    // Verificar se SMTP está configurado
    if (defined('SMTP_HOST') && defined('SMTP_USER') && defined('SMTP_PASS')) {
        return sendEmailViaSMTP($to, $subject, $message_html, $message_text);
    } else {
        // Usar mail() padrão como fallback
        return sendEmailViaMail($to, $subject, $message_html, $message_text);
    }
}

/**
 * Envia email via SMTP usando sockets (melhorado)
 */
function sendEmailViaSMTP($to, $subject, $message_html, $message_text = '') {
    $host = SMTP_HOST;
    $port = defined('SMTP_PORT') ? SMTP_PORT : 587;
    $user = SMTP_USER;
    $pass = SMTP_PASS;
    $secure = defined('SMTP_SECURE') ? SMTP_SECURE : 'tls';
    $from_email = defined('EMAIL_FROM') ? EMAIL_FROM : $user;
    $from_name = defined('EMAIL_FROM_NAME') ? EMAIL_FROM_NAME : 'GIMAK';
    
    // Usar stream_socket_client para melhor controle
    $context = stream_context_create([
        'ssl' => [
            'verify_peer' => false,
            'verify_peer_name' => false,
            'allow_self_signed' => true
        ]
    ]);
    
    try {
        // Criar conexão
        $socket = @stream_socket_client("tcp://{$host}:{$port}", $errno, $errstr, 10, STREAM_CLIENT_CONNECT, $context);
        if (!$socket) {
            error_log("SMTP Erro: Não foi possível conectar ao servidor ($errno) $errstr");
            return false;
        }
        
        // Ler resposta inicial
        $response = fgets($socket, 515);
        if (substr($response, 0, 3) !== '220') {
            error_log("SMTP Erro: Resposta inicial inválida: $response");
            fclose($socket);
            return false;
        }
        
        // EHLO
        fputs($socket, "EHLO " . $host . "\r\n");
        $response = '';
        while ($line = fgets($socket, 515)) {
            $response .= $line;
            if (substr($line, 3, 1) === ' ') break;
        }
        
        // TLS se necessário
        if ($secure === 'tls') {
            fputs($socket, "STARTTLS\r\n");
            $response = fgets($socket, 515);
            if (substr($response, 0, 3) !== '220') {
                error_log("SMTP Erro: STARTTLS falhou: $response");
                fclose($socket);
                return false;
            }
            
            if (!stream_socket_enable_crypto($socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) {
                error_log("SMTP Erro: Falha ao habilitar TLS");
                fclose($socket);
                return false;
            }
            
            fputs($socket, "EHLO " . $host . "\r\n");
            $response = '';
            while ($line = fgets($socket, 515)) {
                $response .= $line;
                if (substr($line, 3, 1) === ' ') break;
            }
        }
        
        // Autenticação
        fputs($socket, "AUTH LOGIN\r\n");
        $response = fgets($socket, 515);
        if (substr($response, 0, 3) !== '334') {
            error_log("SMTP Erro: AUTH LOGIN não aceito: $response");
            fclose($socket);
            return false;
        }
        
        fputs($socket, base64_encode($user) . "\r\n");
        $response = fgets($socket, 515);
        if (substr($response, 0, 3) !== '334') {
            error_log("SMTP Erro: Usuário rejeitado: $response");
            fclose($socket);
            return false;
        }
        
        fputs($socket, base64_encode($pass) . "\r\n");
        $response = fgets($socket, 515);
        if (substr($response, 0, 3) !== '235') {
            error_log("SMTP Erro: Autenticação falhou: $response");
            fclose($socket);
            return false;
        }
        
        // From
        fputs($socket, "MAIL FROM: <" . $from_email . ">\r\n");
        $response = fgets($socket, 515);
        if (substr($response, 0, 3) !== '250') {
            error_log("SMTP Erro: MAIL FROM falhou: $response");
            fclose($socket);
            return false;
        }
        
        // To
        fputs($socket, "RCPT TO: <" . $to . ">\r\n");
        $response = fgets($socket, 515);
        if (substr($response, 0, 3) !== '250') {
            error_log("SMTP Erro: RCPT TO falhou: $response");
            fclose($socket);
            return false;
        }
        
        // Data
        fputs($socket, "DATA\r\n");
        $response = fgets($socket, 515);
        if (substr($response, 0, 3) !== '354') {
            error_log("SMTP Erro: DATA não aceito: $response");
            fclose($socket);
            return false;
        }
        
        // Headers e mensagem
        $headers = "From: " . $from_name . " <" . $from_email . ">\r\n";
        $headers .= "To: <" . $to . ">\r\n";
        $headers .= "Subject: " . $subject . "\r\n";
        $headers .= "MIME-Version: 1.0\r\n";
        $headers .= "Content-Type: text/html; charset=UTF-8\r\n";
        $headers .= "Reply-To: " . $from_email . "\r\n";
        $headers .= "X-Mailer: PHP/" . phpversion() . "\r\n";
        
        // Enviar mensagem
        fputs($socket, $headers . "\r\n" . $message_html . "\r\n.\r\n");
        $response = fgets($socket, 515);
        
        // Quit
        fputs($socket, "QUIT\r\n");
        fclose($socket);
        
        if (substr($response, 0, 3) === '250') {
            error_log("SMTP: Email enviado com sucesso para $to");
            return true;
        }
        
        error_log("SMTP Erro: Falha ao enviar mensagem: $response");
        return false;
        
    } catch (Exception $e) {
        error_log("SMTP Exception: " . $e->getMessage());
        return false;
    }
}

/**
 * Envia email usando mail() padrão (fallback)
 */
function sendEmailViaMail($to, $subject, $message_html, $message_text = '') {
    $from_email = defined('EMAIL_FROM') ? EMAIL_FROM : 'noreply@gimak.com.br';
    $from_name = defined('EMAIL_FROM_NAME') ? EMAIL_FROM_NAME : 'GIMAK';
    
    $headers = "MIME-Version: 1.0\r\n";
    $headers .= "Content-Type: text/html; charset=UTF-8\r\n";
    $headers .= "From: " . $from_name . " <" . $from_email . ">\r\n";
    $headers .= "Reply-To: " . $from_email . "\r\n";
    $headers .= "Return-Path: " . $from_email . "\r\n";
    $headers .= "X-Mailer: PHP/" . phpversion() . "\r\n";
    
    return @mail($to, $subject, $message_html, $headers, "-f" . $from_email);
}

