<?php
/**
 * unsubscribe.php – Abmelde-Endpoint
 * ------------------------------------------------------------
 * • Validiert Token aus GET-Parameter
 * • Ermittelt zugehörigen Empfänger über send_queue
 * • Setzt status → 'unsubscribed' und unsubscribed_at → NOW()
 * • Umfassendes Erfolgs-/Fehler-Logging mit ErrorLogger
 * • Optionales Settings-Audit per logSettingChange()
 */

require_once __DIR__ . '/includes/init.php';

$token = $_GET['token'] ?? '';

/** 1) Test-Endpunkt ------------------------------------------------------- */
if ($token === 'test') {
    echo '<h1>Danke für Ihren Test</h1>';
    exit;
}

/** 2) Grundlegende Token-Validierung -------------------------------------- */
if (!$token) {
    echo 'Ungültiger Bestätigungslink.';
    exit;
}

$db = Database::getInstance();

try {
    /* ------------------------------------------------------
     * 3) Token in send_queue auflösen → recipient_id
     * ---------------------------------------------------- */
    $sqlQueue = "
        SELECT recipient_id
        FROM send_queue
        WHERE view_token = :token
        LIMIT 1
    ";
    $stmtQueue = $db->prepare($sqlQueue);
    $stmtQueue->execute([':token' => $token]);

    ErrorLogger::logSqlSuccess('unsubscribe: load recipient by token | SQL: ' . $sqlQueue . ' | params: ' . json_encode(['token' => $token], JSON_UNESCAPED_UNICODE));

    $queueRow = $stmtQueue->fetch(PDO::FETCH_ASSOC);

    if (!$queueRow) {
        echo 'Ungültiger Bestätigungslink.';
        exit;
    }

    $recipientId = (int)$queueRow['recipient_id'];

    /* ------------------------------------------------------
     * 4) Empfänger prüfen
     * ---------------------------------------------------- */
    $sqlRec = "
        SELECT id, status, unsubscribed_at
        FROM recipients
        WHERE id = :id
        LIMIT 1
    ";
    $stmtRec = $db->prepare($sqlRec);
    $stmtRec->execute([':id' => $recipientId]);

    ErrorLogger::logSqlSuccess('unsubscribe: load recipient | SQL: ' . $sqlRec . ' | params: ' . json_encode(['id' => $recipientId], JSON_UNESCAPED_UNICODE));

    $recipient = $stmtRec->fetch(PDO::FETCH_ASSOC);

    if (!$recipient) {
        echo 'Empfänger nicht gefunden.';
        exit;
    }

    /* ------------------------------------------------------
     * 5) Status & Timestamp aktualisieren
     *    (nur, wenn noch nicht abgemeldet)
     * ---------------------------------------------------- */
    if ($recipient['status'] !== 'unsubscribed') {
        $sqlUpd = "
            UPDATE recipients
            SET
                status          = 'unsubscribed',
                unsubscribed_at = NOW()
            WHERE id = :id
        ";
        $stmtUpd = $db->prepare($sqlUpd);
        $stmtUpd->execute([':id' => $recipientId]);

        ErrorLogger::logSqlSuccess('unsubscribe: update status | SQL: ' . $sqlUpd . ' | params: ' . json_encode(['id' => $recipientId], JSON_UNESCAPED_UNICODE));

        // Optional: Änderung für Audit-Trail dokumentieren
        if (function_exists('logSettingChange')) {
            logSettingChange(
                $recipientId,
                'UNSUBSCRIBE',
                'recipients.status',
                json_encode([
                    'old' => $recipient['status'],
                    'new' => 'unsubscribed',
                ])
            );
        }
    }

} catch (PDOException $e) {
    ErrorLogger::logSqlError('unsubscribe: workflow failed | error: ' . $e->getMessage());
    echo 'Interner Fehler. Bitte versuchen Sie es später erneut.';
    exit;
}
?>
<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="UTF-8">
    <title>Abmeldung erfolgreich</title>
    <link rel="stylesheet" href="/assets/bootstrap/dist/css/bootstrap.min.css">
</head>
<body class="bg-light">
    <div class="container pt-5">
         <h1>Sie wurden erfolgreich vom Newsletter abgemeldet. 📭</h1>
    </div>
</body>
</html>