<?php
/**
 * admin/campaigns/campaign_create.php
 * ----------------------------------------------------------------------
 * ➕ Kampagne erstellen
 * ----------------------------------------------------------------------
 * Neue Segment-Logik (MR9):
 *  • Liste optional (campaigns.list_id)
 *  • Tag-Filter optional:
 *      - none    => kein Tagfilter
 *      - include => Tag vorhanden → senden
 *      - exclude => Tag vorhanden → NICHT senden
 *    (campaigns.tag_id + campaigns.tag_mode)
 *
 * DOI:
 *  • use_doi_only ist listenabhängig → ohne Liste nicht zulässig
 *
 * Legacy-Kompatibilität:
 *  • filter_type / filter_value werden weiterhin befüllt (für Altcode)
 *
 * Sicherheit/Logging:
 *  • Alle SQL-Operationen try/catch
 *  • ErrorLogger::logSqlSuccess / logSqlError
 * ----------------------------------------------------------------------
 */

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 erstellen';
$error = '';

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

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

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

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

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

    // Kampagnentyp + Zeitfelder
    $campaignType  = $_POST['campaign_type'] ?? 'date';
    $campaignType  = array_key_exists($campaignType, $campaignTypes) ? $campaignType : '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';
        }
    }

    // Followup normalisieren
    if ($campaignType === 'followup') {
        $fd = (int)$followupDays;
        $followupDays = ($fd > 0) ? $fd : null;
    } else {
        $followupDays = null;
    }

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

    if (!$error && $campaignType === 'date' && empty($scheduleAt)) {
        $error = 'Bitte ein Versanddatum angeben (Kampagnentyp: Nach Datum).';
    }

    if (!$error && $campaignType === 'followup' && empty($followupDays)) {
        $error = 'Bitte Follow-Up Tage angeben (mind. 1).';
    }

    // 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 (DB)
    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;
    }

    // -------------------------
    // Insert
    // -------------------------
    if (!$error) {
        $sqlInsert = "INSERT INTO campaigns
            (name, template_id, filter_type, filter_value,
             schedule_at, followup_days, type, use_doi_only, priority,
             list_id, tag_id, tag_mode)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

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

        try {
            $stmt = $db->prepare($sqlInsert);
            $stmt->execute($paramsInsert);
            ErrorLogger::logSqlSuccess('campaign_create: insert campaign | SQL: ' . $sqlInsert . ' | params: ' . json_encode($paramsInsert, JSON_UNESCAPED_UNICODE));

            header('Location: campaigns.php?success=created');
            exit;
        } catch (Throwable $e) {
            ErrorLogger::logSqlError('campaign_create: insert campaign failed | SQL: ' . $sqlInsert . ' | params: ' . json_encode($paramsInsert, JSON_UNESCAPED_UNICODE) . ' | error: ' . $e->getMessage());
            $error = 'Fehler beim Speichern: ' . $e->getMessage();
        }
    }
}

/* =========================================================================
 * VIEW
 * ========================================================================= */
$pageHelp = renderPageHelp([
    'sections' => [
        [
            'heading' => 'Was macht diese Seite?',
            'items' => [
                'Hier erstellst du eine neue Kampagne für einen geplanten oder automatischen Versand.',
                'Die Kampagne verbindet Vorlage, Zielgruppe und Versandlogik.',
            ],
        ],
        [
            'heading' => 'Was muss ich eingeben oder auswählen?',
            'items' => [
                'Vergib einen Namen, wähle eine Vorlage und lege den Kampagnentyp fest.',
                'Bestimme die Zielgruppe über Liste oder Tag und ergänze nur die für den Typ nötigen Zeitangaben.',
            ],
        ],
        [
            'heading' => 'Worauf sollte ich achten?',
            'items' => [
                'Follow-up- und Datums-Kampagnen haben unterschiedliche Zeitlogiken.',
                'Prüfe vor dem Speichern, ob Vorlage, Segmentierung und Versandzeit fachlich zusammenpassen.',
            ],
        ],
    ],
    'warning' => 'Fehlerhafte Segmentierung oder Zeitangaben können zu unerwünschten Versänden führen.',
]);

$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();
?>
<div class="page-header h2">📣 Kampagne erstellen</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; ?>

<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($_POST['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)($_POST['template_id'] ?? 0)) ? '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
      $currentType = $_POST['campaign_type'] ?? 'date';
      foreach ($campaignTypes as $value => $label): ?>
        <option value="<?= htmlspecialchars($value) ?>" <?= ($value === $currentType) ? '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($_POST['schedule_at'] ?? '') ?>">
    <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($_POST['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
      $currentListId = $_POST['list_id'] ?? '';
      foreach ($lists as $list): ?>
        <option value="<?= (int)$list['id'] ?>" <?= ((string)$list['id'] === (string)$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>
    <?php $currentTagMode = $_POST['tag_mode'] ?? 'none'; ?>
    <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>
    <?php $currentTagId = $_POST['tag_id'] ?? ''; ?>
    <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'] ?>" <?= ((string)$tag['id'] === (string)$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>
    <?php $currentPriority = (int)($_POST['priority'] ?? 3); ?>
    <select name="priority" id="priority" class="form-select">
      <option value="2" <?= ($currentPriority === 2) ? 'selected' : '' ?>>2 – Hoch</option>
      <option value="3" <?= ($currentPriority === 3) ? 'selected' : '' ?>>3 – Normal</option>
      <option value="4" <?= ($currentPriority === 4) ? 'selected' : '' ?>>4 – Niedrig</option>
    </select>
    <div class="form-text">Priorität 1 ist reserviert für Double-Opt-In/Willkommensmails.</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" <?= isset($_POST['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>

  <button type="submit" class="btn btn-primary">📂 Kampagne speichern</button>
  <a href="campaigns.php" class="btn btn-secondary">Abbrechen</a>
</form>

<script>
/**
 * Kampagnentyp-abhängige Anzeige
 */
function toggleScheduleFields() {
  const type = document.getElementById('campaign_type').value;
  document.getElementById('scheduleAtGroup').style.display = (type === 'date') ? 'block' : 'none';
  document.getElementById('followupGroup').style.display  = (type === 'followup') ? 'block' : 'none';
}

/**
 * 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 serverseitig)
 */
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 === '';

      // Match auf Name ODER Betreff ODER sichtbaren Text
      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;

        // data-Attribute wieder setzen (für erneutes Filtern)
        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);
  });

  // Initial render
  render('');
}

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

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