<?php
session_start();

// Ativar exibição de erros (para desenvolvimento)
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

// Configurações de segurança
define('ENCRYPTION_KEY', 'sua_chave_secreta_32_caracteres_aqui!');
define('MIN_PASSWORD_LENGTH', 8);

// Verificar extensões necessárias
$required_extensions = ['imap', 'openssl', 'mysqli'];
foreach ($required_extensions as $ext) {
    if (!extension_loaded($ext)) {
        die("A extensão {$ext} não está habilitada no PHP. Por favor, ative-a no php.ini");
    }
}

// Verificar autenticação do usuário
if (!isset($_SESSION['logado']) || $_SESSION['logado'] !== true) {
    header('Location: login.php');
    exit;
}

// Verificar tenant_id
$tenant_id = $_SESSION['tenant_id'] ?? null;
if (!$tenant_id) {
    die("Tenant não identificado.");
}

// Conexão com o banco de dados
require 'conexao.php';

/**
 * Testa a conexão IMAP
 */
function testImapConnection($email, $senha, $host, $port, $encryption) {
    $encryption = strtolower($encryption);
    $ssl_flags = [
        'ssl' => '/ssl/novalidate-cert',
        'tls' => '/tls/novalidate-cert',
        ''    => '/novalidate-cert'
    ];

    $ssl_flag = $ssl_flags[$encryption] ?? '/ssl/novalidate-cert';
    $mailbox = "{{$host}:{$port}/imap{$ssl_flag}}INBOX";

    imap_timeout(IMAP_OPENTIMEOUT, 10);
    imap_timeout(IMAP_READTIMEOUT, 10);
    imap_timeout(IMAP_WRITETIMEOUT, 10);
    imap_timeout(IMAP_CLOSETIMEOUT, 10);

    $original_error_level = error_reporting();
    error_reporting(E_ALL & ~E_WARNING);

    $imap = @imap_open($mailbox, $email, $senha, OP_HALFOPEN, 1);

    if ($imap === false) {
        $error = imap_last_error() ?: "Erro desconhecido ao conectar ao servidor IMAP";
        error_reporting($original_error_level);
        return $error;
    }

    imap_close($imap);
    error_reporting($original_error_level);
    return true;
}

/**
 * Criptografa a senha
 */
function encryptPassword($password) {
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
    $encrypted = openssl_encrypt($password, 'aes-256-cbc', ENCRYPTION_KEY, 0, $iv);
    return $encrypted . '::' . bin2hex($iv);
}

/**
 * Descriptografa a senha
 */
function decryptPassword($encrypted) {
    if (strpos($encrypted, '::') === false) return false;

    list($senha_cripto, $iv) = explode('::', $encrypted);
    $iv = hex2bin($iv);
    return openssl_decrypt($senha_cripto, 'aes-256-cbc', ENCRYPTION_KEY, 0, $iv);
}

// Processar formulário
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    try {
        if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
            throw new Exception("Token CSRF inválido!");
        }

        $email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
        $senha = $_POST['senha'];
        $imap_host = trim(filter_input(INPUT_POST, 'imap_host'));
        $imap_port = filter_input(INPUT_POST, 'imap_port', FILTER_VALIDATE_INT);
        $imap_secure = $_POST['imap_secure'] ?? 'ssl';
        $smtp_host = trim(filter_input(INPUT_POST, 'smtp_host'));
        $smtp_port = filter_input(INPUT_POST, 'smtp_port', FILTER_VALIDATE_INT) ?? '';
        $smtp_secure = $_POST['smtp_secure'] ?? 'ssl';

        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            throw new Exception("E-mail inválido!");
        }

        if (empty($imap_host)) {
            throw new Exception("Servidor IMAP é obrigatório!");
        }

        if (empty($imap_port) || $imap_port < 1 || $imap_port > 65535) {
            throw new Exception("Porta IMAP inválida!");
        }

        $stmt = $conn->prepare("SELECT * FROM configuracoes_email WHERE tenant_id = ?");
        $stmt->bind_param("s", $tenant_id);
        $stmt->execute();
        $result = $stmt->get_result();
        $config_existente = $result->fetch_assoc();
        $stmt->close();

        if (empty($senha) && !$config_existente) {
            throw new Exception("Senha é obrigatória para nova configuração!");
        }

        if (!empty($senha)) {
            if (strlen($senha) < MIN_PASSWORD_LENGTH) {
                throw new Exception("A senha deve ter no mínimo " . MIN_PASSWORD_LENGTH . " caracteres!");
            }

            $teste_conexao = testImapConnection($email, $senha, $imap_host, $imap_port, $imap_secure);
            if ($teste_conexao !== true) {
                throw new Exception("Falha na conexão IMAP: " . $teste_conexao);
            }
        }

        $senha_cripto = $config_existente['senha'] ?? '';
        if (!empty($senha)) {
            $senha_cripto = encryptPassword($senha);
            if ($senha_cripto === false) {
                throw new Exception("Erro ao criptografar senha!");
            }
        }

        if ($config_existente) {
            $query = "UPDATE configuracoes_email SET 
                        email = ?, 
                        senha = ?, 
                        imap_host = ?, 
                        imap_port = ?, 
                        imap_secure = ?,
                        smtp_host = ?, 
                        smtp_port = ?, 
                        smtp_secure = ?,
                        atualizado_em = NOW()
                      WHERE tenant_id = ?";
            $stmt = $conn->prepare($query);
            $stmt->bind_param(
                "sssssssss", 
                $email, $senha_cripto, $imap_host, $imap_port, $imap_secure,
                $smtp_host, $smtp_port, $smtp_secure, $tenant_id
            );
        } else {
            $query = "INSERT INTO configuracoes_email 
                        (tenant_id, email, senha, imap_host, imap_port, imap_secure, 
                         smtp_host, smtp_port, smtp_secure, protocolo, criado_em, atualizado_em) 
                      VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'imap', NOW(), NOW())";
            $stmt = $conn->prepare($query);
            $stmt->bind_param(
                "sssssssss",
                $tenant_id, $email, $senha_cripto, $imap_host, $imap_port, $imap_secure,
                $smtp_host, $smtp_port, $smtp_secure
            );
        }

        if (!$stmt->execute()) {
            throw new Exception("Erro ao salvar configuração: " . $stmt->error);
        }

        $_SESSION['mensagem'] = "Configuração salva com sucesso!";
        header("Location: email_app.php");
        exit;

    } catch (Exception $e) {
        $erro = $e->getMessage();
    }
}

// Obter configurações existentes
try {
    $stmt = $conn->prepare("SELECT * FROM configuracoes_email WHERE tenant_id = ?");
    $stmt->bind_param("s", $tenant_id);
    $stmt->execute();
    $result = $stmt->get_result();
    $config_existente = $result->fetch_assoc();
    $stmt->close();

    if ($config_existente && !empty($config_existente['senha'])) {
        $config_existente['senha_decrypted'] = decryptPassword($config_existente['senha']);
    }
} catch (Exception $e) {
    $erro = "Erro ao obter configurações: " . $e->getMessage();
}
?>

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Configuração de E-mail</title>
    <style>
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            line-height: 1.6;
            margin: 0;
            padding: 20px;
            background-color: #f5f5f5;
            color: #333;
        }
        .container {
            max-width: 800px;
            margin: 0 auto;
            background: white;
            padding: 30px;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
        }
        h1 {
            color: #2c3e50;
            margin-top: 0;
            padding-bottom: 10px;
            border-bottom: 1px solid #eee;
        }
        .form-group {
            margin-bottom: 20px;
        }
        label {
            display: block;
            margin-bottom: 8px;
            font-weight: 600;
            color: #2c3e50;
        }
        input[type="text"],
        input[type="email"],
        input[type="password"],
        input[type="number"],
        select {
            width: 100%;
            padding: 10px 15px;
            border: 1px solid #ddd;
            border-radius: 4px;
            font-size: 16px;
            box-sizing: border-box;
            transition: border-color 0.3s;
        }
        input:focus, select:focus {
            border-color: #3498db;
            outline: none;
            box-shadow: 0 0 0 2px rgba(52,152,219,0.2);
        }
        .btn {
            background-color: #3498db;
            color: white;
            border: none;
            padding: 12px 20px;
            font-size: 16px;
            border-radius: 4px;
            cursor: pointer;
            transition: background-color 0.3s;
            font-weight: 600;
        }
        .btn:hover {
            background-color: #2980b9;
        }
        .btn-test {
            background-color: #2ecc71;
            margin-right: 10px;
        }
        .btn-test:hover {
            background-color: #27ae60;
        }
        .error {
            color: #e74c3c;
            background-color: #fadbd8;
            padding: 15px;
            border-radius: 4px;
            margin-bottom: 20px;
            border-left: 4px solid #e74c3c;
        }
        .success {
            color: #27ae60;
            background-color: #d5f5e3;
            padding: 15px;
            border-radius: 4px;
            margin-bottom: 20px;
            border-left: 4px solid #27ae60;
        }
        .form-section {
            margin-bottom: 30px;
            padding-bottom: 20px;
            border-bottom: 1px solid #eee;
        }
        .form-section h3 {
            color: #3498db;
            margin-top: 0;
        }
        .form-row {
            display: flex;
            gap: 15px;
        }
        .form-row .form-group {
            flex: 1;
        }
        .password-note {
            font-size: 13px;
            color: #7f8c8d;
            margin-top: 5px;
        }
        #testConnectionResult {
            margin-top: 15px;
            padding: 10px 15px;
            border-radius: 4px;
            display: none;
        }
        .test-success {
            background-color: #d5f5e3;
            color: #27ae60;
        }
        .test-error {
            background-color: #fadbd8;
            color: #e74c3c;
        }
    </style>
</head>
<body>
<div class="container">
    <h1>Configuração de E-mail</h1>
    
    <?php if (isset($erro)): ?>
        <div class="error"><?= htmlspecialchars($erro) ?></div>
    <?php endif; ?>
    
    <?php if (isset($_SESSION['mensagem'])): ?>
        <div class="success"><?= htmlspecialchars($_SESSION['mensagem']) ?></div>
        <?php unset($_SESSION['mensagem']); ?>
    <?php endif; ?>
    
    <form method="post" id="emailConfigForm">
        <input type="hidden" name="csrf_token" value="<?= htmlspecialchars($_SESSION['csrf_token']) ?>">
        
        <div class="form-section">
            <h3>Credenciais de E-mail</h3>
            
            <div class="form-group">
                <label for="email">Endereço de E-mail:</label>
                <input type="email" id="email" name="email" required 
                       value="<?= htmlspecialchars($config_existente['email'] ?? '') ?>">
            </div>
            
            <div class="form-group">
                <label for="senha">Senha:</label>
                <input type="password" id="senha" name="senha" 
                       placeholder="<?= isset($config_existente['senha']) ? 'Deixe em branco para não alterar' : '' ?>">
                <?php if (isset($config_existente['senha_decrypted'])): ?>
                    <div class="password-note">Senha atualmente armazenada no sistema</div>
                <?php endif; ?>
            </div>
        </div>
        
        <div class="form-section">
            <h3>Configurações IMAP (Recebimento)</h3>
            
            <div class="form-row">
                <div class="form-group">
                    <label for="imap_host">Servidor IMAP:</label>
                    <input type="text" id="imap_host" name="imap_host" required 
                           value="<?= htmlspecialchars($config_existente['imap_host'] ?? 'imap.example.com') ?>">
                </div>
                
                <div class="form-group">
                    <label for="imap_port">Porta IMAP:</label>
                    <input type="number" id="imap_port" name="imap_port" required 
                           value="<?= htmlspecialchars($config_existente['imap_port'] ?? '993') ?>">
                </div>
                
                <div class="form-group">
                    <label for="imap_secure">Segurança:</label>
                    <select id="imap_secure" name="imap_secure">
                        <option value="ssl" <?= ($config_existente['imap_secure'] ?? 'ssl') === 'ssl' ? 'selected' : '' ?>>SSL</option>
                        <option value="tls" <?= ($config_existente['imap_secure'] ?? '') === 'tls' ? 'selected' : '' ?>>TLS</option>
                        <option value="" <?= ($config_existente['imap_secure'] ?? '') === '' ? 'selected' : '' ?>>Nenhuma</option>
                    </select>
                </div>
            </div>
            
            <button type="button" class="btn btn-test" onclick="testImapConnection()">Testar Conexão IMAP</button>
            <div id="testConnectionResult"></div>
        </div>
        
        <div class="form-section">
            <h3>Configurações SMTP (Envio - Opcional)</h3>
            
            <div class="form-row">
                <div class="form-group">
                    <label for="smtp_host">Servidor SMTP:</label>
                    <input type="text" id="smtp_host" name="smtp_host" 
                           value="<?= htmlspecialchars($config_existente['smtp_host'] ?? '') ?>">
                </div>
                
                <div class="form-group">
                    <label for="smtp_port">Porta SMTP:</label>
                    <input type="number" id="smtp_port" name="smtp_port" 
                           value="<?= htmlspecialchars($config_existente['smtp_port'] ?? '465') ?>">
                </div>
                
                <div class="form-group">
                    <label for="smtp_secure">Segurança:</label>
                    <select id="smtp_secure" name="smtp_secure">
                        <option value="ssl" <?= ($config_existente['smtp_secure'] ?? 'ssl') === 'ssl' ? 'selected' : '' ?>>SSL</option>
                        <option value="tls" <?= ($config_existente['smtp_secure'] ?? '') === 'tls' ? 'selected' : '' ?>>TLS</option>
                        <option value="" <?= ($config_existente['smtp_secure'] ?? '') === '' ? 'selected' : '' ?>>Nenhuma</option>
                    </select>
                </div>
            </div>
        </div>
        
        <button type="submit" class="btn">Salvar Configuração</button>
    </form>
</div>

<script>
function testImapConnection() {
    const email = document.getElementById('email').value;
    const senha = document.getElementById('senha').value;
    const imap_host = document.getElementById('imap_host').value;
    const imap_port = document.getElementById('imap_port').value;
    const imap_secure = document.getElementById('imap_secure').value;
    
    const resultDiv = document.getElementById('testConnectionResult');
    resultDiv.style.display = 'none';
    
    if (!email || !imap_host || !imap_port) {
        alert('Por favor, preencha todos os campos obrigatórios para testar a conexão');
        return;
    }
    
    if (!senha && !<?= isset($config_existente['senha']) ? 'true' : 'false' ?>) {
        alert('Por favor, informe a senha para testar a conexão');
        return;
    }
    
    const btn = document.querySelector('.btn-test');
    btn.disabled = true;
    btn.textContent = 'Testando...';
    
    // Enviar requisição AJAX
    fetch('test_imap_connection.php', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content
        },
        body: JSON.stringify({
            email: email,
            senha: senha,
            imap_host: imap_host,
            imap_port: imap_port,
            imap_secure: imap_secure
        })
    })
    .then(response => {
        if (!response.ok) {
            throw new Error('Erro na requisição');
        }
        return response.json();
    })
    .then(data => {
        resultDiv.style.display = 'block';
        if (data.success) {
            resultDiv.className = 'test-success';
            resultDiv.innerHTML = '✅ Conexão IMAP bem-sucedida!';
        } else {
            resultDiv.className = 'test-error';
            resultDiv.innerHTML = '❌ Falha na conexão: ' + (data.message || 'Erro desconhecido');
        }
    })
    .catch(error => {
        resultDiv.style.display = 'block';
        resultDiv.className = 'test-error';
        resultDiv.innerHTML = '❌ Erro ao testar conexão: ' + error.message;
    })
    .finally(() => {
        btn.disabled = false;
        btn.textContent = 'Testar Conexão IMAP';
    });
}
</script>
</body>
</html>