<?php
require_once 'vendor/autoload.php'; // Para PHPMailer
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

class EnviadorEmails {
    private $conn;
    
    public function __construct($conn) {
        $this->conn = $conn;
    }
    
    public function enviarEmailPorTemplate($tenant_id, $cliente_id, $template_id, $usuario_id = null) {
        try {
            error_log("🔄 EnviadorEmails: Iniciando envio para cliente $cliente_id, template $template_id, usuario $usuario_id");
            
            // 1. Buscar dados do cliente
            $sql_cliente = "SELECT Nome_Cliente, Email FROM clientes WHERE id = ? AND tenant_id = ?";
            $stmt = $this->conn->prepare($sql_cliente);
            $stmt->bind_param("ii", $cliente_id, $tenant_id);
            $stmt->execute();
            $cliente = $stmt->get_result()->fetch_assoc();
            $stmt->close();
            
            if (!$cliente || empty($cliente['Email'])) {
                error_log("❌ Cliente não encontrado ou sem email: $cliente_id");
                return false;
            }
            
            // 2. Buscar template
            $sql_template = "SELECT assunto, conteudo FROM templates_email WHERE id = ? AND tenant_id = ?";
            $stmt = $this->conn->prepare($sql_template);
            $stmt->bind_param("ii", $template_id, $tenant_id);
            $stmt->execute();
            $template = $stmt->get_result()->fetch_assoc();
            $stmt->close();
            
            if (!$template) {
                error_log("❌ Template não encontrado: $template_id");
                return false;
            }
            
            // 3. Buscar configurações SMTP do USUÁRIO específico
            $config = $this->buscarConfiguracoesEmail($tenant_id, $usuario_id);
            
            if (!$config) {
                error_log("❌ Configurações de email não encontradas para tenant: $tenant_id, usuario: $usuario_id");
                return false;
            }
            
            // 4. Processar variáveis no template
            $assunto = $this->processarVariaveis($template['assunto'], $cliente);
            $conteudo = $this->processarVariaveis($template['conteudo'], $cliente);
            
            // 5. Tentar enviar email
            $enviado = $this->enviarEmailSMTP($config, $cliente['Email'], $assunto, $conteudo);
            
            if ($enviado) {
                error_log("✅ Email enviado com sucesso para: " . $cliente['Email']);
                $this->registrarEnvio($tenant_id, $cliente_id, $template_id, $usuario_id);
                return true;
            } else {
                error_log("❌ Falha no envio do email para: " . $cliente['Email']);
                return false;
            }
            
        } catch (Exception $e) {
            error_log("❌ EXCEÇÃO em enviarEmailPorTemplate: " . $e->getMessage());
            return false;
        }
    }
    
    private function buscarConfiguracoesEmail($tenant_id, $usuario_id = null) {
        // Se não especificou usuário, tenta buscar qualquer configuração do tenant
        if ($usuario_id) {
            $sql = "SELECT * FROM configuracoes_email WHERE tenant_id = ? AND usuario_id = ?";
            $stmt = $this->conn->prepare($sql);
            $stmt->bind_param("ii", $tenant_id, $usuario_id);
        } else {
            $sql = "SELECT * FROM configuracoes_email WHERE tenant_id = ? LIMIT 1";
            $stmt = $this->conn->prepare($sql);
            $stmt->bind_param("i", $tenant_id);
        }
        
        $stmt->execute();
        $config = $stmt->get_result()->fetch_assoc();
        $stmt->close();
        
        // Se não encontrou com usuário específico, busca qualquer configuração do tenant
        if (!$config && $usuario_id) {
            $sql = "SELECT * FROM configuracoes_email WHERE tenant_id = ? LIMIT 1";
            $stmt = $this->conn->prepare($sql);
            $stmt->bind_param("i", $tenant_id);
            $stmt->execute();
            $config = $stmt->get_result()->fetch_assoc();
            $stmt->close();
        }
        
        return $config;
    }
    
    private function processarVariaveis($texto, $cliente) {
        $variaveis = [
            '{nome_cliente}' => $cliente['Nome_Cliente'] ?? '',
            '{email_cliente}' => $cliente['Email'] ?? '',
            '{data_atual}' => date('d/m/Y'),
            '{empresa}' => 'Sistema SON'
        ];
        
        return str_replace(array_keys($variaveis), array_values($variaveis), $texto);
    }
    
    private function enviarEmailSMTP($config, $para, $assunto, $conteudo) {
        try {
            $mail = new PHPMailer(true);
            
            // Configurações do servidor
            $mail->isSMTP();
            $mail->Host = $config['servidor_smtp'];
            $mail->SMTPAuth = true;
            $mail->Username = $config['usuario_smtp'];
            $mail->Password = $config['senha_smtp'];
            $mail->SMTPSecure = $config['criptografia'] === 'none' ? '' : $config['criptografia'];
            $mail->Port = $config['porta_smtp'];
            $mail->CharSet = 'UTF-8';
            
            // Remetente e destinatário
            $mail->setFrom($config['email_remetente'], $config['nome_remetente']);
            $mail->addAddress($para);
            
            // Conteúdo
            $mail->isHTML(true);
            $mail->Subject = $assunto;
            $mail->Body = $conteudo;
            $mail->AltBody = strip_tags($conteudo);
            
            // Enviar email
            $enviado = $mail->send();
            
            if ($enviado) {
                error_log("✅ Email enviado com sucesso via SMTP");
                return true;
            } else {
                error_log("❌ Falha no envio SMTP: " . $mail->ErrorInfo);
                return false;
            }
            
        } catch (Exception $e) {
            error_log("❌ Erro PHPMailer: " . $e->getMessage());
            return false;
        }
    }
    
    private function registrarEnvio($tenant_id, $cliente_id, $template_id, $usuario_id) {
        try {
            $sql = "INSERT INTO agendamentos_email (
                cliente_id, usuario_id, tenant_id, email_destinatario, 
                assunto, mensagem, status, data_agendamento, data_envio
            ) VALUES (?, ?, ?, ?, ?, ?, 'enviado', NOW(), NOW())";
            
            // Buscar dados para registro
            $sql_cliente = "SELECT Email FROM clientes WHERE id = ?";
            $stmt = $this->conn->prepare($sql_cliente);
            $stmt->bind_param("i", $cliente_id);
            $stmt->execute();
            $cliente = $stmt->get_result()->fetch_assoc();
            $stmt->close();
            
            $sql_template = "SELECT assunto, conteudo FROM templates_email WHERE id = ?";
            $stmt = $this->conn->prepare($sql_template);
            $stmt->bind_param("i", $template_id);
            $stmt->execute();
            $template = $stmt->get_result()->fetch_assoc();
            $stmt->close();
            
            $stmt = $this->conn->prepare($sql);
            $stmt->bind_param("iiisss", 
                $cliente_id, $usuario_id, $tenant_id, 
                $cliente['Email'], $template['assunto'], $template['conteudo']
            );
            $stmt->execute();
            $stmt->close();
            
        } catch (Exception $e) {
            error_log("❌ Erro ao registrar envio: " . $e->getMessage());
        }
    }
}
?>