<?php
/**
 * Nutzer‑Erstellung (admin/nutzer_create.php)
 * --------------------------------------------------
 * - Zeigt ein Formular zum Anlegen eines neuen Admin‑/Listen‑Nutzers.
 * - Holt vorhandene Mailing‑Listen (für Listen‑Manager‑Rollen).
 * - Validiert und speichert das neue Benutzer‑Objekt in der Tabelle
 *   admin_users.
 * - Entspricht den Mailresponder v9‑Richtlinien:
 *     • Ausführliche Kommentare in allen kritischen Blöcken
 *     • try/catch‑Fehlerbehandlung inkl. SQL‑Logging über
 *       ErrorLogger::logSqlSuccess / logSqlError
 *     • User‑ und Setting‑Logging per logUserAction / logSettingChange
 *     • Auto‑Dismiss‑Hinweise, Bootstrap‑Styles & TML‑Icons
 *
 *  Abhängigkeiten & Globale Funktionen
 *  ----------------------------------
 *  ▸ includes/init.php     – Zentrale Initialisierung (DB, Config, Autoload)
 *  ▸ includes/functions.php – Global helper (enthält logUserAction / logSettingChange)
 *  ▸ auth/AuthController.php – Sitzungs‑/Rechte‑Prüfung
 */

// --------------------------------------------------
// 1) Session & Abhängigkeiten
// --------------------------------------------------
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

require_once __DIR__ . '/../includes/init.php';          // lädt u. a. Database & functions
require_once __DIR__ . '/../auth/AuthController.php';

// --------------------------------------------------
// 2) Berechtigung prüfen
// --------------------------------------------------
$auth = new AuthController();
if (!$auth->isLoggedIn()) {
    header('Location: ' . $adminLoginPath);
    exit;
}

// --------------------------------------------------
// 3) Variablen vorbereiten
// --------------------------------------------------
$title = '👤 Neuen Nutzer anlegen';
$db    = Database::getInstance();
$error = '';
$info  = '';
$listen = [];

// --------------------------------------------------
// 4) Mailing‑Listen für Listen‑Manager Dropdown laden
// --------------------------------------------------
try {
    $sql = 'SELECT id, name FROM lists ORDER BY name ASC';
    $listen = $db->query($sql)->fetchAll();
    ErrorLogger::logSqlSuccess('nutzer_create load lists | SQL: ' . $sql . ' | params: []'); // keine Bind-Parameter
} catch (PDOException $e) {
    ErrorLogger::logSqlError('nutzer_create load lists | SQL: SELECT lists | params: [] | error: ' . $e->getMessage());
    $error = 'Fehler beim Abrufen der Listen.';
}

// --------------------------------------------------
// 5) Formular‑POST verarbeiten
// --------------------------------------------------
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 5.1) Eingaben bereinigen
    $name     = trim($_POST['name']     ?? '');
    $email    = trim($_POST['email']    ?? '');
    $rolle    = trim($_POST['role']     ?? '');
    $aktiv    = isset($_POST['is_active']) ? 1 : 0;
    $passwort = $_POST['password']       ?? '';
    $list_id  = $rolle === 'list_manager' ? (int)($_POST['list_id'] ?? 0) : null;

    // 5.2) Grundvalidierung
    if (!$name || !$email || !$rolle || !$passwort) {
        $error = 'Alle Pflichtfelder müssen ausgefüllt sein.';
    } else {
        // 5.3) Neuer Benutzer anlegen
        try {
            $hash = password_hash($passwort, PASSWORD_DEFAULT);
            $sql  = 'INSERT INTO admin_users (name, email, role, is_active, password_hash, list_id)
                     VALUES (?, ?, ?, ?, ?, ?)';
            $stmt = $db->prepare($sql);
            $stmt->execute([$name, $email, $rolle, $aktiv, $hash, $list_id]);
            ErrorLogger::logSqlSuccess('nutzer_create insert admin_users | SQL: ' . $sql . ' | params: ' . json_encode([$name, $email, $rolle, $aktiv, '***', $list_id], JSON_UNESCAPED_UNICODE));

            // 5.3.1) Benutzer‑Aktion loggen (erstellt von aktuell eingeloggtem Admin)
            logUserAction($_SESSION['admin_id'] ?? 0, 'Nutzer erstellt', "E‑Mail: $email | Rolle: $rolle");

            // 5.3.2) Setting‑Änderungen protokollieren (z. B. Aktiv‑Status & Liste)
            logSettingChange($_SESSION['admin_id'] ?? 0, 'create_user', 'is_active', (string)$aktiv);
            if ($list_id) {
                logSettingChange($_SESSION['admin_id'] ?? 0, 'create_user', 'list_id', (string)$list_id);
            }

            // 5.3.3) Erfolgsmeldung & Redirect
            $_SESSION['success_message'] = '✅ Nutzer wurde erfolgreich angelegt.';
            header('Location: nutzer.php');
            exit;
        } catch (PDOException $e) {
            // 5.4) Fehler beim Insert
            ErrorLogger::logSqlError('nutzer_create insert admin_users | SQL: INSERT admin_users | params: ' . json_encode([$email], JSON_UNESCAPED_UNICODE) . ' | error: ' . $e->getMessage());
            $error = 'Fehler beim Speichern: ' . $e->getMessage();
        }
    }
}

// --------------------------------------------------
// 6) HTML‑Ausgabe puffern
// --------------------------------------------------
ob_start();
?>
<div class="page-header">
  👤 Nutzerverwaltung &raquo; Neuen Nutzer anlegen
</div>

<?php if ($error): ?>
  <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" 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" class="form-control" required>
  </div>

  <div class="mb-3">
    <label for="password" class="form-label">Passwort</label>
    <input type="password" name="password" id="password" 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">Admin</option>
      <option value="list_manager">Listen‑Manager</option>
    </select>
  </div>

  <div class="mb-3" id="list-select" style="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'] ?>"><?= 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" checked>
    <label class="form-check-label" for="is_active">
      Aktiviert
    </label>
  </div>

  <button type="submit" class="btn btn-success">
    <i class="bi bi-save me-1"></i> Speichern
  </button>
  <a href="nutzer.php" class="btn btn-secondary">
    <i class="bi bi-chevron-left me-1"></i> Zurück
  </a>
</form>

<script>
/**
 * Blendet das Listen‑Dropdown nur ein, wenn Rolle = list_manager.
 */
function toggleListField(role) {
  const listField = document.getElementById('list-select');
  listField.style.display = role === 'list_manager' ? '' : 'none';
}

/**
 * Bootstrap‑Alert nach 5 Sekunden automatisch ausblenden.
 */
document.addEventListener('DOMContentLoaded', () => {
  setTimeout(() => {
    document.querySelectorAll('.auto-dismiss').forEach(el => {
      el.classList.add('fade');
      setTimeout(() => el.remove(), 1000);
    });
  }, 5000);
});
</script>

<?php
// --------------------------------------------------
// 7) Template einbinden
// --------------------------------------------------
$pageContent = ob_get_clean();
include __DIR__ . '/template.php';
?>
