<?php
/**
 * admin/campaigns/campaign_edit.php
 * ----------------------------------------------------------------------
 * ✏️ Kampagne bearbeiten + 📊 Statistik
 * ----------------------------------------------------------------------
 * Anpassung für Tag-Segmentierung (3 Optionen):
 *  • Kein Tagfilter
 *  • Tag vorhanden => senden (include)
 *  • Tag vorhanden => NICHT senden (exclude)
 *
 * Neue DB-Felder in campaigns:
 *  • list_id (nullable)
 *  • tag_id (nullable)
 *  • tag_mode ENUM('include','exclude') (nullable)
 *
 * Legacy-Kompatibilität:
 *  • filter_type / filter_value werden weiterhin befüllt (für Altcode)
 *
 * Sicherheit/Logging:
 *  • Alle SQL-Operationen in try/catch
 *  • Logging mit ErrorLogger::logSqlSuccess / ErrorLogger::logSqlError
 *
 * Erweiterung (UX):
 *  • Template-Auswahl mit Live-Suche (Name + Betreff), ohne externe Library
 * ----------------------------------------------------------------------
 */

session_start();
require_once __DIR__ . '/../../includes/init.php';
require_once __DIR__ . '/../../auth/AuthController.php';

/* =========================================================================
 * Auth prüfen (nur eingeloggte Admins)
 * ========================================================================= */
$auth = new AuthController();
if (!$auth->isLoggedIn()) {
    header('Location: ' . $adminLoginPath);
    exit;
}

/* =========================================================================
 * DB + Grundwerte
 * ========================================================================= */
$db    = Database::getInstance();
$title = 'Kampagne bearbeiten';
$error = '';
$success = '';

/* =========================================================================
 * Kampagnen-ID prüfen
 * ========================================================================= */
$id = $_GET['id'] ?? null;
if (!$id || !is_numeric($id)) {
    header('Location: campaigns.php');
    exit;
}
$id = (int)$id;

/* =========================================================================
 * Kampagne laden
 * ========================================================================= */
$campaign = null;
$sqlCampaign = "SELECT * FROM campaigns WHERE id = ? LIMIT 1";
$paramsCampaign = [$id];

try {
    $stmt = $db->prepare($sqlCampaign);
    $stmt->execute($paramsCampaign);
    $campaign = $stmt->fetch(PDO::FETCH_ASSOC);
    ErrorLogger::logSqlSuccess('campaign_edit: load campaign | SQL: ' . $sqlCampaign . ' | params: ' . json_encode($paramsCampaign, JSON_UNESCAPED_UNICODE));
} catch (Throwable $e) {
    ErrorLogger::logSqlError('campaign_edit: load campaign failed | SQL: ' . $sqlCampaign . ' | params: ' . json_encode($paramsCampaign, JSON_UNESCAPED_UNICODE) . ' | error: ' . $e->getMessage());
    echo 'Kampagne konnte nicht geladen werden.';
    exit;
}

if (!$campaign) {
    echo 'Kampagne nicht gefunden.';
    exit;
}

/* =========================================================================
 * Legacy-Fallback -> neue Felder (falls Alt-Kampagne noch nicht migriert)
 * ========================================================================= */
if (empty($campaign['list_id']) && ($campaign['filter_type'] ?? '') === 'list' && is_numeric($campaign['filter_value'] ?? null)) {
    $campaign['list_id'] = (int)$campaign['filter_value'];
}

if (empty($campaign['tag_id']) && ($campaign['filter_type'] ?? '') === 'tag') {
    $fv = (string)($campaign['filter_value'] ?? '');
    // Altformat: "tag:123"
    if (strpos($fv, 'tag:') === 0) {
        $campaign['tag_id'] = (int)substr($fv, 4);
        // Alt-Kampagnen waren immer "include"
        $campaign['tag_mode'] = $campaign['tag_mode'] ?: 'include';
    }
}

/* =========================================================================
 * Dropdown-Daten laden (Vorlagen, Listen, Tags)
 * ========================================================================= */
$templates = [];
$lists     = [];
$tags      = [];

/**
 * Templates laden
 * ✅ Erweiterung: subject mitladen, damit wir im Dropdown Name + Betreff anzeigen + suchen können
 */
try {
    $sql = "SELECT id, name, subject FROM email_templates ORDER BY name ASC";
    $templates = $db->query($sql)->fetchAll(PDO::FETCH_ASSOC);
    ErrorLogger::logSqlSuccess('campaign_edit: load templates | SQL: ' . $sql . ' | params: []');
} catch (Throwable $e) {
    ErrorLogger::logSqlError('campaign_edit: load templates failed | SQL: ' . ($sql ?? 'SELECT email_templates') . ' | params: [] | error: ' . $e->getMessage());
}

try {
    $sql = "SELECT id, name FROM lists ORDER BY name ASC";
    $lists = $db->query($sql)->fetchAll(PDO::FETCH_ASSOC);
    ErrorLogger::logSqlSuccess('campaign_edit: load lists | SQL: ' . $sql . ' | params: []');
} catch (Throwable $e) {
    ErrorLogger::logSqlError('campaign_edit: load lists failed | SQL: ' . ($sql ?? 'SELECT lists') . ' | params: [] | error: ' . $e->getMessage());
}

try {
    $sql = "SELECT id, name FROM tags ORDER BY name ASC";
    $tags = $db->query($sql)->fetchAll(PDO::FETCH_ASSOC);
    ErrorLogger::logSqlSuccess('campaign_edit: load tags | SQL: ' . $sql . ' | params: []');
} catch (Throwable $e) {
    ErrorLogger::logSqlError('campaign_edit: load tags failed | SQL: ' . ($sql ?? 'SELECT tags') . ' | params: [] | error: ' . $e->getMessage());
}

/* =========================================================================
 * Kampagnentypen (UI)
 * ========================================================================= */
$campaignTypes = [
    'date'        => '🗓️ Nach Datum',
    'followup'    => '⏱️ Follow-Up',
    'transaction' => '⚡ Transaktionsmail'
];

/* =========================================================================
 * Statistik (KPIs)
 * ========================================================================= */
$sentCount   = 0;
$openCount   = 0;
$clickCount  = 0;
$bounceCount = 0;
$statsError  = '';

$statQueries = [
    'sent'    => [
        'sql' => 'SELECT COUNT(*) FROM send_queue WHERE campaign_id = ? AND status = "sent"',
        'params' => [$id]
    ],
    'opens'   => [
        'sql' => 'SELECT COUNT(DISTINCT eo.queue_id)
                  FROM email_opens eo
                  JOIN send_queue sq ON eo.queue_id = sq.id
                  WHERE sq.campaign_id = ?',
        'params' => [$id]
    ],
    'clicks'  => [
        'sql' => 'SELECT COUNT(DISTINCT el.queue_id)
                  FROM email_link_tracking el
                  JOIN send_queue sq ON el.queue_id = sq.id
                  WHERE sq.campaign_id = ? AND el.clicked_at IS NOT NULL',
        'params' => [$id]
    ],
    'bounces' => [
        'sql' => 'SELECT COUNT(DISTINCT eb.queue_id)
                  FROM email_bounces eb
                  JOIN send_queue sq ON eb.queue_id = sq.id
                  WHERE sq.campaign_id = ?',
        'params' => [$id]
    ],
];

foreach ($statQueries as $label => $q) {
    try {
        $stmt = $db->prepare($q['sql']);
        $stmt->execute($q['params']);
        $count = (int)$stmt->fetchColumn();

        ErrorLogger::logSqlSuccess('campaign_edit: stats ' . $label . ' | SQL: ' . $q['sql'] . ' | params: ' . json_encode($q['params'], JSON_UNESCAPED_UNICODE));

        if ($label === 'sent')    $sentCount   = $count;
        if ($label === 'opens')   $openCount   = $count;
        if ($label === 'clicks')  $clickCount  = $count;
        if ($label === 'bounces') $bounceCount = $count;
    } catch (Throwable $e) {
        ErrorLogger::logSqlError('campaign_edit: stats ' . $label . ' failed | SQL: ' . $q['sql'] . ' | params: ' . json_encode($q['params'], JSON_UNESCAPED_UNICODE) . ' | error: ' . $e->getMessage());
        $statsError = 'Statistik konnte nicht geladen werden.';
    }
}

/* =========================================================================
 * Formularverarbeitung (Update)
 * ========================================================================= */
if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    // -------------------------
    // Basisfelder
    // -------------------------
    $name       = trim($_POST['name'] ?? '');
    $templateId = (int)($_POST['template_id'] ?? 0);

    // Kampagnentyp + Zeitfelder
    $campaignType  = $_POST['campaign_type'] ?? 'date';
    $scheduleAtRaw = $_POST['schedule_at'] ?? '';
    $followupDays  = $_POST['followup_days'] ?? null;

    // Priorität + DOI
    $priority   = (int)($_POST['priority'] ?? 3);
    $priority   = in_array($priority, [2,3,4], true) ? $priority : 3;
    $useDoiOnly = isset($_POST['use_doi_only']) ? 1 : 0;

    // -------------------------
    // Segmentierung: Liste + Tag
    // -------------------------
    $listId = $_POST['list_id'] ?? '';
    $listId = (is_numeric($listId) && (int)$listId > 0) ? (int)$listId : null;

    $tagMode = $_POST['tag_mode'] ?? 'none'; // none|include|exclude
    $tagMode = in_array($tagMode, ['none','include','exclude'], true) ? $tagMode : 'none';

    $tagId = $_POST['tag_id'] ?? '';
    $tagId = (is_numeric($tagId) && (int)$tagId > 0) ? (int)$tagId : null;

    // -------------------------
    // Datum/Uhrzeit normalisieren
    // -------------------------
    $scheduleAt = null;
    if (!empty($scheduleAtRaw)) {
        // datetime-local kommt als "YYYY-MM-DDTHH:MM"
        $scheduleAt = str_replace('T', ' ', $scheduleAtRaw);
        if (strlen($scheduleAt) === 16) {
            $scheduleAt .= ':00';
        }
    }

    // -------------------------
    // Validierung (MR9-konform)
    // -------------------------
    if ($name === '' || $templateId <= 0) {
        $error = 'Bitte Name und Vorlage auswählen.';
    }

    // Typ-spezifisch
    if (!$error && $campaignType === 'date' && empty($scheduleAt)) {
        $error = 'Bitte ein Versanddatum angeben (Kampagnentyp: Nach Datum).';
    }
    if (!$error && $campaignType === 'followup') {
        $fd = (int)$followupDays;
        if ($fd <= 0) {
            $error = 'Bitte Follow-Up Tage angeben (mind. 1).';
        } else {
            $followupDays = $fd;
        }
    }
    if ($campaignType !== 'followup') {
        $followupDays = null;
    }

    // DOI ist listenbezogen -> ohne Liste nicht eindeutig
    if (!$error && $useDoiOnly === 1 && empty($listId)) {
        $error = '„Nur bestätigte (DOI) Empfänger“ ist nur möglich, wenn eine Liste ausgewählt ist (DOI ist listenabhängig).';
    }

    // Tag-Mode erfordert Tag
    if (!$error && $tagMode !== 'none' && empty($tagId)) {
        $error = 'Bitte einen Tag auswählen oder Tag-Filter deaktivieren.';
    }

    // Wenn kein Tagfilter -> tagId/tagMode nullen
    if ($tagMode === 'none') {
        $tagId = null;
        $tagModeDb = null;
    } else {
        $tagModeDb = $tagMode; // include|exclude
    }

    // -------------------------
    // Legacy-Felder befüllen (Kompatibilität)
    // -------------------------
    $legacyFilterType  = 'all';
    $legacyFilterValue = null;

    if (!empty($listId) && empty($tagId)) {
        $legacyFilterType  = 'list';
        $legacyFilterValue = (string)$listId;
    } elseif (!empty($tagId)) {
        $legacyFilterType  = 'tag';
        $legacyFilterValue = 'tag:' . (string)$tagId;
    }

    // -------------------------
    // Update in DB
    // -------------------------
    if (!$error) {
        $sqlUpdate = "UPDATE campaigns
                      SET name = ?,
                          template_id = ?,
                          type = ?,
                          schedule_at = ?,
                          followup_days = ?,
                          use_doi_only = ?,
                          priority = ?,
                          list_id = ?,
                          tag_id = ?,
                          tag_mode = ?,
                          filter_type = ?,
                          filter_value = ?
                      WHERE id = ?";

        $paramsUpdate = [
            $name,
            $templateId,
            $campaignType,
            $scheduleAt,
            $followupDays,
            $useDoiOnly,
            $priority,
            $listId,
            $tagId,
            $tagModeDb,
            $legacyFilterType,
            $legacyFilterValue,
            $id
        ];

        try {
            $stmt = $db->prepare($sqlUpdate);
            $stmt->execute($paramsUpdate);
            ErrorLogger::logSqlSuccess('campaign_edit: update campaign | SQL: ' . $sqlUpdate . ' | params: ' . json_encode($paramsUpdate, JSON_UNESCAPED_UNICODE));

            header('Location: campaigns.php?success=updated');
            exit;
        } catch (Throwable $e) {
            ErrorLogger::logSqlError('campaign_edit: update campaign failed | SQL: ' . $sqlUpdate . ' | params: ' . json_encode($paramsUpdate, JSON_UNESCAPED_UNICODE) . ' | error: ' . $e->getMessage());
            $error = 'Fehler beim Speichern: ' . $e->getMessage();
        }
    }
}

/* =========================================================================
 * VIEW via Template
 * ========================================================================= */
$pageHelp = renderPageHelp([
    'sections' => [
        [
            'heading' => 'Was macht diese Seite?',
            'items' => [
                'Hier bearbeitest du eine bestehende Kampagne.',
                'Du änderst damit Vorlage, Zielgruppe und Versandlogik für kommende Ausführungen.',
            ],
        ],
        [
            'heading' => 'Was muss ich eingeben oder auswählen?',
            'items' => [
                'Passe Name, Vorlage, Segmentierung und Zeitsteuerung nur dort an, wo wirklich Bedarf besteht.',
                'Kontrolliere besonders die Angaben zu Listen, Tags und Versandzeit.',
            ],
        ],
        [
            'heading' => 'Worauf sollte ich achten?',
            'items' => [
                'Änderungen wirken sich auf zukünftige Kampagnenläufe aus.',
                'Prüfe vor dem Speichern, ob bereits laufende oder geplante Abläufe von der Änderung betroffen sind.',
            ],
        ],
    ],
    'warning' => 'Falsche Änderungen an Zielgruppe oder Timing können den weiteren Versandverlauf verändern.',
]);

$fieldTooltips = [
    '[name="name"]' => 'Interner Name der Kampagne zur späteren Zuordnung.',
    '[name="template_id"]' => 'Vorlage, die für Betreff und Inhalt verwendet wird.',
    '[name="campaign_type"]' => 'Bestimmt, ob die Kampagne nach Datum, Follow-up oder transaktional arbeitet.',
    '[name="schedule_at"]' => 'Versandzeitpunkt für datumsbasierte Kampagnen.',
    '[name="followup_days"]' => 'Anzahl Tage bis zum Versand innerhalb eines Follow-up-Ablaufs.',
    '[name="priority"]' => 'Priorität dieser Kampagne in der Versandwarteschlange.',
    '[name="list_id"]' => 'Optional auf eine bestimmte Liste eingrenzen.',
    '[name="tag_mode"]' => 'Legt fest, ob ein Tag für Ein- oder Ausschluss der Zielgruppe genutzt wird.',
    '[name="tag_id"]' => 'Tag, der für die Segmentierung der Zielgruppe verwendet wird.',
    '[name="use_doi_only"]' => 'Versendet nur an bestätigte Empfänger der ausgewählten Liste.',
];
ob_start();

/**
 * Datumswert für datetime-local sauber vorbereiten
 * "YYYY-MM-DD HH:MM:SS" -> "YYYY-MM-DDTHH:MM"
 */
$scheduleAtValue = '';
if (!empty($campaign['schedule_at'])) {
    $scheduleAtValue = str_replace(' ', 'T', substr((string)$campaign['schedule_at'], 0, 16));
}

// Aktuelle Werte für neue Felder (inkl. fallback)
$currentListId = !empty($campaign['list_id']) ? (int)$campaign['list_id'] : null;
$currentTagId  = !empty($campaign['tag_id']) ? (int)$campaign['tag_id'] : null;

// Tagmode UI: none/include/exclude
$currentTagMode = 'none';
if (!empty($currentTagId)) {
    $currentTagMode = (($campaign['tag_mode'] ?? '') === 'exclude') ? 'exclude' : 'include';
}
?>
<div class="page-header h2">✏️ Kampagne bearbeiten</div>

<?= $pageHelp ?>

<?php if (!empty($error)): ?>
  <div class="alert alert-danger alert-dismissible fade show" role="alert" data-autodismiss="9000">
    ❌ <?= htmlspecialchars($error) ?>
    <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Schließen"></button>
  </div>
<?php endif; ?>

<?php if (!empty($statsError)): ?>
  <div class="alert alert-warning alert-dismissible fade show" role="alert" data-autodismiss="9000">
    ⚠️ <?= htmlspecialchars($statsError) ?>
    <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Schließen"></button>
  </div>
<?php endif; ?>

<!-- 📊 Statistik -->
<div class="card mb-4 border-primary shadow-sm">
  <div class="card-header bg-primary text-white">📊 Statistik</div>
  <div class="card-body border-bottom">
    <div class="alert alert-info mb-0" role="alert">
      Hinweis: Diese Auswertung basiert auf aktuell im System vorhandenen Daten. Durch das L&ouml;schen von Empf&auml;ngern, Kampagnen oder Trackingdaten k&ouml;nnen sich historische Werte r&uuml;ckwirkend &auml;ndern.
    </div>
  </div>
  <ul class="list-group list-group-flush">
    <li class="list-group-item d-flex justify-content-between align-items-center">
      📤 Gesendet
      <span class="badge bg-secondary rounded-pill"><?= (int)$sentCount ?></span>
    </li>
    <li class="list-group-item d-flex justify-content-between align-items-center">
      👁️‍🗨️ Öffnungen
      <span class="badge bg-primary rounded-pill"><?= (int)$openCount ?></span>
    </li>
    <li class="list-group-item d-flex justify-content-between align-items-center">
      🔗 Klicks
      <span class="badge bg-info rounded-pill"><?= (int)$clickCount ?></span>
    </li>
  </ul>
</div>

<form method="post">

  <!-- Kampagnenname -->
  <div class="mb-3">
    <label for="name" class="form-label">Name der Kampagne</label>
    <input type="text" name="name" id="name" class="form-control" required value="<?= htmlspecialchars((string)$campaign['name']) ?>">
  </div>

  <!-- Vorlage (mit Suche, Name + Betreff) -->
  <div class="mb-3">
    <label for="template_id" class="form-label">E-Mail-Vorlage</label>

    <!-- Suchfeld: filtert live die Templates (Name oder Betreff) -->
    <input
      type="text"
      id="template_search"
      class="form-control mb-2"
      placeholder="Vorlage suchen (Name oder Betreff)…"
      autocomplete="off"
    >

    <select name="template_id" id="template_id" class="form-select" required>
      <option value="">-- Vorlage wählen --</option>
      <?php foreach ($templates as $tpl): ?>
        <?php
          $tplName    = (string)($tpl['name'] ?? '');
          $tplSubject = (string)($tpl['subject'] ?? '');

          // Betreff optisch kürzen, damit das Dropdown kompakt bleibt
          $tplSubjectShort = (mb_strlen($tplSubject) > 80) ? (mb_substr($tplSubject, 0, 80) . '…') : $tplSubject;

          // Label: "Name — Betreff"
          $label = trim($tplName . ' — ' . $tplSubjectShort, " \t\n\r\0\x0B—");
        ?>
        <option
          value="<?= (int)$tpl['id'] ?>"
          <?= ((int)$tpl['id'] === (int)$campaign['template_id']) ? 'selected' : '' ?>
          data-name="<?= htmlspecialchars(mb_strtolower($tplName)) ?>"
          data-subject="<?= htmlspecialchars(mb_strtolower($tplSubject)) ?>"
        >
          <?= htmlspecialchars($label) ?>
        </option>
      <?php endforeach; ?>
    </select>

    <div class="form-text">Tipp: Tippe im Suchfeld, um nach Name oder Betreff zu filtern.</div>
  </div>

  <!-- Kampagnentyp -->
  <div class="mb-3">
    <label for="campaign_type" class="form-label">Kampagnentyp</label>
    <select name="campaign_type" id="campaign_type" class="form-select" required onchange="toggleScheduleFields()">
      <?php foreach ($campaignTypes as $value => $label): ?>
        <option value="<?= htmlspecialchars($value) ?>" <?= ($value === ($campaign['type'] ?? 'date')) ? 'selected' : '' ?>>
          <?= htmlspecialchars($label) ?>
        </option>
      <?php endforeach; ?>
    </select>
  </div>

  <!-- Versanddatum -->
  <div class="mb-3" id="scheduleAtGroup">
    <label for="schedule_at" class="form-label">Geplantes Versanddatum</label>
    <input type="datetime-local" name="schedule_at" id="schedule_at" class="form-control" value="<?= htmlspecialchars($scheduleAtValue) ?>">
    <div class="form-text">Nur relevant bei Kampagnentyp „Nach Datum“.</div>
  </div>

  <!-- Follow-Up -->
  <div class="mb-3" id="followupGroup" style="display:none;">
    <label for="followup_days" class="form-label">Versand an Tag X nach Anmeldung</label>
    <input type="number" name="followup_days" id="followup_days" class="form-control" min="1" value="<?= htmlspecialchars((string)($campaign['followup_days'] ?? '')) ?>">
    <div class="form-text">Nur relevant bei Kampagnentyp „Follow-Up“.</div>
  </div>

  <hr>

  <h5 class="mb-3">👥 Zielgruppe</h5>

  <!-- Liste -->
  <div class="mb-3">
    <label for="list_id" class="form-label">Liste</label>
    <select name="list_id" id="list_id" class="form-select" onchange="syncDoiRule(); updateTagScopeHint();">
      <option value="">-- Liste auswählen --</option>
      <?php foreach ($lists as $list): ?>
        <option value="<?= (int)$list['id'] ?>" <?= ((int)$list['id'] === (int)$currentListId) ? 'selected' : '' ?>>
          <?= htmlspecialchars((string)$list['name']) ?>
        </option>
      <?php endforeach; ?>
    </select>
    <div class="form-text">
      DOI ist listenabhängig. Wenn „Nur bestätigte (DOI)“ aktiv ist, muss eine Liste gewählt sein.
    </div>
  </div>

  <!-- Tag-Mode -->
  <div class="mb-3">
    <label for="tag_mode" class="form-label">Tag-Filter</label>
    <select name="tag_mode" id="tag_mode" class="form-select" onchange="toggleTagSelect(); updateTagScopeHint();">
      <option value="none" <?= ($currentTagMode === 'none') ? 'selected' : '' ?>>Kein Tagfilter</option>
      <option value="include" <?= ($currentTagMode === 'include') ? 'selected' : '' ?>>Tag vorhanden → senden</option>
      <option value="exclude" <?= ($currentTagMode === 'exclude') ? 'selected' : '' ?>>Tag vorhanden → NICHT senden</option>
    </select>
  </div>

  <!-- Tag-Auswahl -->
  <div class="mb-3" id="tagSelectGroup">
    <label for="tag_id" class="form-label">Tag</label>
    <select name="tag_id" id="tag_id" class="form-select" onchange="updateTagScopeHint();">
      <option value="">-- Tag wählen --</option>
      <?php foreach ($tags as $tag): ?>
        <option value="<?= (int)$tag['id'] ?>" <?= ((int)$tag['id'] === (int)$currentTagId) ? 'selected' : '' ?>>
          <?= htmlspecialchars((string)$tag['name']) ?>
        </option>
      <?php endforeach; ?>
    </select>

    <div class="form-text">
      Der System-Tag <code>inaktiv</code> ist ein Segment-Tag (kein Status) und kann für Reaktivierungskampagnen genutzt werden.
      <span id="tagScopeHint" class="d-block mt-1 text-muted"></span>
    </div>
  </div>

  <hr>

  <!-- Priorität -->
  <div class="mb-3">
    <label for="priority" class="form-label">Versand-Priorität</label>
    <select name="priority" id="priority" class="form-select">
      <option value="2" <?= ((int)$campaign['priority'] === 2) ? 'selected' : '' ?>>2 – Hoch</option>
      <option value="3" <?= ((int)$campaign['priority'] === 3) ? 'selected' : '' ?>>3 – Normal</option>
      <option value="4" <?= ((int)$campaign['priority'] === 4) ? 'selected' : '' ?>>4 – Niedrig</option>
    </select>
    <div class="form-text">Priorität 1 ist reserviert für Systemmails (z. B. Double-Opt-In).</div>
  </div>

  <!-- DOI -->
  <div class="form-check mb-3">
    <input class="form-check-input" type="checkbox" value="1" id="use_doi_only" name="use_doi_only" <?= !empty($campaign['use_doi_only']) ? 'checked' : '' ?> onchange="syncDoiRule()">
    <label class="form-check-label" for="use_doi_only">
      Nur bestätigte (Double Opt-In) Empfänger
    </label>
  </div>

  <!-- Submit -->
  <button type="submit" class="btn btn-primary">💾 Aktualisieren</button>
  <a href="campaigns.php" class="btn btn-secondary">Abbrechen</a>
</form>

<script>
/**
 * UI-Logik: Datum/FU-Inputs je nach Kampagnentyp ein-/ausblenden
 */
function toggleScheduleFields() {
  var type = document.getElementById('campaign_type').value;
  document.getElementById('scheduleAtGroup').style.display = (type === 'date') ? 'block' : 'none';
  document.getElementById('followupGroup').style.display  = (type === 'followup') ? 'block' : 'none';
}

/**
 * UI-Logik: Tag-Auswahl nur zeigen, wenn Tagfilter aktiv ist
 */
function toggleTagSelect() {
  var mode  = document.getElementById('tag_mode').value;
  var group = document.getElementById('tagSelectGroup');
  group.style.display = (mode === 'none') ? 'none' : 'block';
}

/**
 * Hinweis: Tagfilter ohne Liste wirkt global (über alle Listen).
 * Mit Liste wirkt Tagfilter innerhalb der gewählten Liste.
 */
function updateTagScopeHint() {
  var listVal = document.getElementById('list_id').value;
  var mode    = document.getElementById('tag_mode').value;
  var tagVal  = document.getElementById('tag_id').value;
  var hintEl  = document.getElementById('tagScopeHint');
  if (!hintEl) return;

  if (mode === 'none' || !tagVal) {
    hintEl.textContent = '';
    return;
  }

  if (!listVal) {
    hintEl.textContent = 'Hinweis: Ohne Liste wirkt der Tag-Filter global über alle Listen.';
  } else {
    hintEl.textContent = 'Hinweis: Mit Liste wirkt der Tag-Filter innerhalb der gewählten Liste.';
  }
}

/**
 * UX/Regel-Hinweis: DOI ist listenabhängig
 * (Validierung passiert serverseitig – hier nur UX)
 */
function syncDoiRule() {
  // Kein hartes UI-Blocken – Server validiert.
}

/**
 * Auto-Dismiss für Alerts (progressive enhancement).
 */
(function () {
  try {
    document.querySelectorAll('.alert[data-autodismiss]').forEach(function (el) {
      var ms = parseInt(el.getAttribute('data-autodismiss'), 10);
      if (!ms || ms < 1000) return;
      window.setTimeout(function () {
        if (window.bootstrap && bootstrap.Alert) {
          bootstrap.Alert.getOrCreateInstance(el).close();
        } else {
          el.remove();
        }
      }, ms);
    });
  } catch (e) {}
})();

/**
 * Live-Suche für Template-Select (Name/Betreff)
 * - Keine externe Library
 * - Funktioniert auch mit 100+ Templates flüssig
 */
function initTemplateSearch() {
  const searchEl = document.getElementById('template_search');
  const selectEl = document.getElementById('template_id');
  if (!searchEl || !selectEl) return;

  // Original-Optionen merken, damit wir nach dem Filtern sauber rebuilden können
  const originalOptions = Array.from(selectEl.options).map(opt => ({
    value: opt.value,
    text: opt.text,
    disabled: opt.disabled,
    selected: opt.selected,
    name: (opt.getAttribute('data-name') || ''),
    subject: (opt.getAttribute('data-subject') || '')
  }));

  function render(filter) {
    const f = (filter || '').toLowerCase().trim();

    // aktuellen Wert merken, damit Auswahl nicht „verschwindet“
    const currentValue = selectEl.value;

    selectEl.innerHTML = '';

    originalOptions.forEach(opt => {
      const isPlaceholder = opt.value === '';
      const haystack = (opt.name + ' ' + opt.subject + ' ' + opt.text).toLowerCase();
      const match = isPlaceholder || f === '' || haystack.includes(f);

      if (match) {
        const o = document.createElement('option');
        o.value = opt.value;
        o.textContent = opt.text;
        o.disabled = opt.disabled;

        if (opt.value === currentValue) o.selected = true;

        if (opt.name) o.setAttribute('data-name', opt.name);
        if (opt.subject) o.setAttribute('data-subject', opt.subject);

        selectEl.appendChild(o);
      }
    });
  }

  searchEl.addEventListener('input', function () {
    render(searchEl.value);
  });

  render('');
}

document.addEventListener('DOMContentLoaded', function () {
  toggleScheduleFields();
  toggleTagSelect();
  updateTagScopeHint();
  initTemplateSearch(); // <-- neu
});
</script>

<?php
$pageContent = ob_get_clean();
include __DIR__ . '/../template.php';
