<?php
/**
 * Nutzer bearbeiten (admin/nutzer_edit.php)
 * --------------------------------------------------
 * Zeigt ein Formular zum Bearbeiten eines vorhandenen Admin‑ / Listen‑Nutzers
 * und speichert Änderungen in der Tabelle admin_users.
 *
 * Mailresponder v9‑Vorgaben, die hier umgesetzt werden:
 *   • Ausführliche, verständliche Kommentare in allen kritischen Blöcken
 *   • Robust es Error‑Handling via try/catch für jede SQL‑Operation
 *   • SQL‑Erfolgs‑ und Fehler‑Logging (ErrorLogger::logSqlSuccess / logSqlError)
 *   • User‑Aktions‑Logging über logUserAction()
 *   • Settings‑Änderungs‑Logging über logSettingChange() (z. B. Rolle, Liste, Aktiv‑Status)
 *   • Bootstrap‑Alerts mit Auto‑Dismiss
 *
 * Benötigt:  includes/functions.php (liefert logUserAction & logSettingChange)
 */

// --------------------------------------------------
// 1) Sitzungsstart
// --------------------------------------------------
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

// --------------------------------------------------
// 2) Abhängigkeiten laden
// --------------------------------------------------
require_once __DIR__ . '/../includes/init.php';           // u. a. DB‑Singleton & Helper
require_once __DIR__ . '/../auth/AuthController.php';     // Auth‑Check

$auth = new AuthController();
if (!$auth->isLoggedIn()) {
    header('Location: ' . $adminLoginPath);
    exit;
}

// --------------------------------------------------
// 3) Grundvariablen
// --------------------------------------------------
$title  = '👤 Nutzer bearbeiten';
$db     = Database::getInstance();
$error  = '';

// ID aus Query‑Param validieren
$id = (int)($_GET['id'] ?? 0);
if ($id <= 0) {
    die('Ungültige Nutzer‑ID.');
}

// --------------------------------------------------
// 4) Nutzer‑Datensatz laden
// --------------------------------------------------
try {
    $stmt = $db->prepare('SELECT * FROM admin_users WHERE id = ?');
    $stmt->execute([$id]);
    ErrorLogger::logSqlSuccess('nutzer_edit: load user | SQL: SELECT admin_users by id | params: ' . json_encode([$id], JSON_UNESCAPED_UNICODE));
    $nutzer = $stmt->fetch();

    if (!$nutzer) {
        die('Nutzer nicht gefunden.');
    }
} catch (PDOException $e) {
    ErrorLogger::logSqlError('nutzer_edit: load user failed | SQL: SELECT admin_users by id | params: ' . json_encode([$id], JSON_UNESCAPED_UNICODE) . ' | error: ' . $e->getMessage());
    die('Fehler beim Laden des Nutzers.');
}

// --------------------------------------------------
// 5) Listen für Listen‑Manager laden
// --------------------------------------------------
try {
    $listenStmt = $db->query('SELECT id, name FROM lists ORDER BY name ASC');
    $listen     = $listenStmt->fetchAll();
    ErrorLogger::logSqlSuccess('nutzer_edit: load lists | SQL: SELECT id,name FROM lists | params: []');
} catch (PDOException $e) {
    ErrorLogger::logSqlError('nutzer_edit: load lists failed | SQL: SELECT id,name FROM lists | params: [] | error: ' . $e->getMessage());
    $listen = [];
}

// --------------------------------------------------
// 6) Formular wurde abgeschickt → Update ausführen
// --------------------------------------------------
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Eingaben holen & bereinigen
    $name     = trim($_POST['name']  ?? '');
    $email    = trim($_POST['email'] ?? '');
    $rolle    = trim($_POST['role']  ?? '');
    $aktiv    = isset($_POST['is_active']) ? 1 : 0;
    $list_id  = $rolle === 'list_manager' ? (int)($_POST['list_id'] ?? 0) : null;

    if (!$name || !$email || !$rolle) {
        $error = 'Alle Pflichtfelder müssen ausgefüllt sein.';
    } else {
        // Änderungen gegenüber Original ermitteln (für Settings‑Logging)
        $changes = [];
        if ($nutzer['role']      !== $rolle   ) $changes['role']      = [$nutzer['role'],   $rolle];
        if ($nutzer['list_id']   !=  $list_id ) $changes['list_id']   = [$nutzer['list_id'], $list_id];
        if ($nutzer['is_active'] !=  $aktiv   ) $changes['is_active'] = [$nutzer['is_active'], $aktiv];

        // Daten speichern
        try {
            $update = $db->prepare('UPDATE admin_users SET name = ?, email = ?, role = ?, is_active = ?, list_id = ? WHERE id = ?');
            $update->execute([$name, $email, $rolle, $aktiv, $list_id, $id]);
            ErrorLogger::logSqlSuccess('nutzer_edit: update user | SQL: UPDATE admin_users by id | params: ' . json_encode([$id], JSON_UNESCAPED_UNICODE));

            // --------------------------------------------------
            // User‑ & Settings‑Logging
            // --------------------------------------------------
            $adminId = $_SESSION['admin_id'] ?? 0; // aktueller Admin
            logUserAction($adminId, 'Nutzer bearbeitet', "Bearbeitet ID: $id, E‑Mail: $email");

            foreach ($changes as $key => [$old, $new]) {
                logSettingChange($adminId, 'update_user', $key, "UserID:$id | alt:$old → neu:$new");
            }

            // Erfolg → Weiterleitung
            $_SESSION['success_message'] = '✅ Änderungen gespeichert.';
            header('Location: nutzer.php');
            exit;
        } catch (PDOException $e) {
            ErrorLogger::logSqlError('nutzer_edit: update failed | SQL: UPDATE admin_users by id | params: ' . json_encode([$id], JSON_UNESCAPED_UNICODE) . ' | error: ' . $e->getMessage());
            $error = 'Fehler beim Speichern: ' . $e->getMessage();
        }
    }
}

// --------------------------------------------------
// 7) HTML ausgeben
// --------------------------------------------------
ob_start();
?>
<div class="page-header">
  👤 Nutzerverwaltung &raquo; Nutzer bearbeiten
</div>

<?php if ($error): ?>
  <!-- Fehlermeldung mit Auto‑Dismiss -->
  <div class="alert alert-danger auto-dismiss">❌ <?= htmlspecialchars($error) ?></div>
<?php endif; ?>

<form method="post" class="w-50">
  <div class="mb-3">
    <label for="name" class="form-label">Name</label>
    <input type="text" name="name" id="name" value="<?= htmlspecialchars($nutzer['name']) ?>" class="form-control" required>
  </div>

  <div class="mb-3">
    <label for="email" class="form-label">E‑Mail</label>
    <input type="email" name="email" id="email" value="<?= htmlspecialchars($nutzer['email']) ?>" class="form-control" required>
  </div>

  <div class="mb-3">
    <label for="role" class="form-label">Rolle</label>
    <select name="role" id="role" class="form-select" required onchange="toggleListField(this.value)">
      <option value="admin"        <?= $nutzer['role'] === 'admin'        ? 'selected' : '' ?>>Admin</option>
      <option value="list_manager" <?= $nutzer['role'] === 'list_manager' ? 'selected' : '' ?>>Listen‑Manager</option>
    </select>
  </div>

  <div class="mb-3" id="list-select" style="<?= $nutzer['role'] === 'list_manager' ? '' : 'display:none;' ?>">
    <label for="list_id" class="form-label">Zugeordnete Liste</label>
    <select name="list_id" id="list_id" class="form-select">
      <option value="">-- keine --</option>
      <?php foreach ($listen as $liste): ?>
        <option value="<?= $liste['id'] ?>" <?= $nutzer['list_id'] == $liste['id'] ? 'selected' : '' ?>>
          <?= htmlspecialchars($liste['name']) ?>
        </option>
      <?php endforeach; ?>
    </select>
  </div>

  <div class="form-check mb-3">
    <input class="form-check-input" type="checkbox" name="is_active" id="is_active" value="1" <?= $nutzer['is_active'] ? 'checked' : '' ?>>
    <label class="form-check-label" for="is_active">Aktiviert</label>
  </div>

  <button type="submit" class="btn btn-primary">
    💾 Speichern
  </button>
  <a href="nutzer_delete.php?id=<?= $nutzer['id'] ?>" class="btn btn-danger ms-2" onclick="return confirm('Diesen Nutzer wirklich löschen?')">
    🗑️ Löschen
  </a>
  <a href="nutzer.php" class="btn btn-secondary ms-2">↩ Zurück</a>
</form>

<script>
// Zeigt/verbirgt Liste‑Dropdown abhängig von Rolle
function toggleListField(role) {
  const listField = document.getElementById('list-select');
  listField.style.display = (role === 'list_manager') ? '' : 'none';
}

// Bootstrap‑Alert automatisch ausblenden
document.addEventListener('DOMContentLoaded', () => {
  setTimeout(() => {
    document.querySelectorAll('.auto-dismiss').forEach(el => {
      el.classList.add('fade');
      setTimeout(() => el.remove(), 1000);
    });
  }, 5000);
});
</script>
<?php
$pageContent = ob_get_clean();
include __DIR__ . '/template.php';


