<?php
/**
 * admin/empfaenger/empfaenger.php
 * ----------------------------------------------------------------------
 * Übersicht Empfänger (Filter + AJAX-Table + Bulk-Leiste unter Tabelle)
 * ----------------------------------------------------------------------
 * Umsetzung:
 *  • Filterformular (klassisch GET) -> setzt Session-Filter dauerhaft
 *  • Tabelle + Pagination werden via empfaenger_table_ajax.php geladen (AJAX POST)
 *  • Bulk-Leiste unter Tabelle:
 *      - markierte löschen (als unsubscribed)
 *      - aktiv/inaktiv
 *      - in andere Liste verschieben (nur wenn oben Liste gewählt!)
 *      - Tag hinzufügen
 *      - Tag entfernen (NEU)
 *  • Logging: ErrorLogger::logSqlSuccess / logSqlError (SQL im AJAX-Endpoint + Bulk)
 *  • Auto-dismiss Alerts
 *  • Null-sichere htmlspecialchars
 *
 * WICHTIGER FIX:
 *  - Beim Klick auf "Filtern" wird die Seite per GET neu geladen, damit die
 *    Session-Filter wirklich gesetzt werden und beim Browser-Refresh erhalten bleiben.
 *  - Redirects wie ?success=deleted überschreiben die Session NICHT.
 */

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

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

$db = Database::getInstance();

/** Null-sicher escapen */
function e($v): string
{
    return htmlspecialchars((string)($v ?? ''), ENT_QUOTES, 'UTF-8');
}

/* =========================================================================
 * Filter (Session-Persistenz, delete-sicher)
 * -------------------------------------------------------------------------
 * Session wird NUR aktualisiert, wenn apply_filters=1 gesetzt ist.
 * Dadurch überschreiben Redirects (z.B. nach Löschen) die Session nicht.
 * ========================================================================= */
$filterKeys = [
    'list_id',
    'tag_id',
    'tag_mode', // NEU: has / not_has
    'search',
    'activity_filter',
    'click_filter',
    'doi_filter',
    'status_filter'
];

if (isset($_GET['reset'])) {
    unset($_SESSION['empfaenger_filter']);
    header('Location: empfaenger.php');
    exit;
}

if (!isset($_SESSION['empfaenger_filter']) || !is_array($_SESSION['empfaenger_filter'])) {
    $_SESSION['empfaenger_filter'] = [];
}

/**
 * Session nur bei echtem "Filtern" aktualisieren (apply_filters=1)
 * - hier werden auch leere Werte gespeichert, falls User bewusst "Alle" wählt
 */
if (isset($_GET['apply_filters']) && $_GET['apply_filters'] === '1') {
    foreach ($filterKeys as $key) {
        if (array_key_exists($key, $_GET)) {
            $_SESSION['empfaenger_filter'][$key] = $_GET[$key];
        }
    }
}

/** Formularwerte aus Session */
foreach ($filterKeys as $key) {
    $$key = $_SESSION['empfaenger_filter'][$key] ?? '';
}

/** Defaults/Validierung: tag_mode */
if ($tag_mode !== 'has' && $tag_mode !== 'not_has') {
    $tag_mode = 'has';
}

/* =========================================================================
 * Dropdowns laden (Listen/Tags)
 * ========================================================================= */
try {
    $listsStmt = $db->query("SELECT id, name FROM lists ORDER BY name");
    $lists = $listsStmt->fetchAll(PDO::FETCH_ASSOC);
    ErrorLogger::logSqlSuccess('empfaenger.php | file: ' . __FILE__ . ' | message: SELECT Listen geladen');

    $tagsStmt = $db->query("SELECT id, name FROM tags ORDER BY name");
    $tags = $tagsStmt->fetchAll(PDO::FETCH_ASSOC);
    ErrorLogger::logSqlSuccess('empfaenger.php | file: ' . __FILE__ . ' | message: SELECT Tags geladen');
} catch (Throwable $e) {
    ErrorLogger::logSqlError('empfaenger.php | file: ' . __FILE__ . ' | error: ' . $e->getMessage());
    $lists = [];
    $tags = [];
}

/* =========================================================================
 * HTML
 * ========================================================================= */
$title = 'Empfängerübersicht';
ob_start();
?>

<div class="page-header h2">
  👥 Empfänger &raquo; Übersicht
</div>

<div id="page-alert" class="alert d-none" role="alert"></div>

<?php if (isset($_GET['success']) && $_GET['success'] === 'deleted'): ?>
  <div class="alert alert-success">
    ✅ Empfänger wurde gelöscht.
  </div>
<?php endif; ?>

<div class="mb-3">
  <a href="empfaenger_create.php" class="btn btn-primary">➕ Empfänger anlegen</a>
  <a href="tags.php" class="btn btn-secondary">🏷 Tags verwalten</a>
  <a href="felder.php" class="btn btn-secondary">➕ Zusatzfelder verwalten</a>
</div>

<button class="btn btn-outline-secondary mb-3" type="button" data-bs-toggle="collapse" data-bs-target="#filterBox">
  🔍 Filter anzeigen / verbergen
</button>

<div class="collapse show" id="filterBox">
  <form method="get" id="filterForm" class="card card-body mb-4">
    <input type="hidden" name="apply_filters" value="1">

    <div class="row g-3">

      <div class="col-md-3">
        <label class="form-label">Liste</label>
        <select name="list_id" id="list_id" class="form-select">
          <option value="">Alle</option>
          <?php foreach ($lists as $l): ?>
            <option value="<?= (int)$l['id'] ?>" <?= (string)$list_id === (string)$l['id'] ? 'selected' : '' ?>>
              <?= e($l['name']) ?>
            </option>
          <?php endforeach; ?>
        </select>
      </div>

      <div class="col-md-3">
        <label class="form-label">Tag</label>
        <select name="tag_id" id="tag_id" class="form-select">
          <option value="">Alle</option>
          <?php foreach ($tags as $t): ?>
            <option value="<?= (int)$t['id'] ?>" <?= (string)$tag_id === (string)$t['id'] ? 'selected' : '' ?>>
              <?= e($t['name']) ?>
            </option>
          <?php endforeach; ?>
        </select>
      </div>

      <!-- NEU: Tag-Modus -->
      <div class="col-md-3">
        <label class="form-label">Tag-Modus</label>
        <select name="tag_mode" id="tag_mode" class="form-select">
          <option value="has" <?= $tag_mode === 'has' ? 'selected' : '' ?>>ist vorhanden</option>
          <option value="not_has" <?= $tag_mode === 'not_has' ? 'selected' : '' ?>>ist NICHT vorhanden</option>
        </select>
        <div class="form-text">Wirkt nur, wenn oben ein Tag ausgewählt ist.</div>
      </div>

      <div class="col-md-3">
        <label class="form-label">E-Mail enthält</label>
        <input type="text" name="search" id="search" value="<?= e($search) ?>" class="form-control">
      </div>

      <div class="col-md-3">
        <label class="form-label">Aktivität</label>
        <select name="activity_filter" id="activity_filter" class="form-select">
          <option value="">Alle</option>
          <option value="2" <?= $activity_filter === '2' ? 'selected' : '' ?>>Letzte 2 Tage</option>
          <option value="90" <?= $activity_filter === '90' ? 'selected' : '' ?>>Letzte 90 Tage</option>
          <option value="180" <?= $activity_filter === '180' ? 'selected' : '' ?>>Letzte 180 Tage</option>
          <option value="90_180" <?= $activity_filter === '90_180' ? 'selected' : '' ?>>90–180 Tage</option>
          <option value="180_360" <?= $activity_filter === '180_360' ? 'selected' : '' ?>>180–360 Tage</option>
          <option value="360_720" <?= $activity_filter === '360_720' ? 'selected' : '' ?>>360–720 Tage</option>
          <option value="inactive" <?= $activity_filter === 'inactive' ? 'selected' : '' ?>>Keine Aktivität</option>
        </select>
      </div>

      <div class="col-md-3">
        <label class="form-label">Klicks</label>
        <select name="click_filter" id="click_filter" class="form-select">
          <option value="">Alle</option>
          <option value="clicked" <?= $click_filter === 'clicked' ? 'selected' : '' ?>>Mind. 1 Klick</option>
          <option value="1d" <?= $click_filter === '1d' ? 'selected' : '' ?>>1 Tag</option>
          <option value="2d" <?= $click_filter === '2d' ? 'selected' : '' ?>>2 Tage</option>
          <option value="5d" <?= $click_filter === '5d' ? 'selected' : '' ?>>5 Tage</option>
          <option value="30d" <?= $click_filter === '30d' ? 'selected' : '' ?>>30 Tage</option>
          <option value="60d" <?= $click_filter === '60d' ? 'selected' : '' ?>>60 Tage</option>
          <option value="90d" <?= $click_filter === '90d' ? 'selected' : '' ?>>90 Tage</option>
          <option value="not_clicked" <?= $click_filter === 'not_clicked' ? 'selected' : '' ?>>Keine Klicks</option>
        </select>
      </div>

      <div class="col-md-3">
        <label class="form-label">DOI-Status</label>
        <select name="doi_filter" id="doi_filter" class="form-select">
          <option value="">Alle</option>
          <option value="confirmed" <?= $doi_filter === 'confirmed' ? 'selected' : '' ?>>Bestätigt</option>
          <option value="not_confirmed" <?= $doi_filter === 'not_confirmed' ? 'selected' : '' ?>>Nicht bestätigt</option>
        </select>
      </div>

      <div class="col-md-3">
        <label class="form-label">Status</label>
        <select name="status_filter" id="status_filter" class="form-select">
          <option value="">Alle</option>
          <option value="active" <?= $status_filter === 'active' ? 'selected' : '' ?>>🟢 Aktiv</option>
          <option value="inactive" <?= $status_filter === 'inactive' ? 'selected' : '' ?>>🚫 Inaktiv</option>
          <option value="unsubscribed" <?= $status_filter === 'unsubscribed' ? 'selected' : '' ?>>❌ Abgemeldet</option>
          <option value="bounced" <?= $status_filter === 'bounced' ? 'selected' : '' ?>>❗ Unzustellbar</option>
          <option value="pause" <?= $status_filter === 'pause' ? 'selected' : '' ?>>⏸ Pause</option>
        </select>
      </div>

      <div class="col-12">
        <button type="submit" class="btn btn-primary">Filtern</button>
        <a href="empfaenger.php?reset=1" class="btn btn-outline-secondary">Zurücksetzen</a>
      </div>
    </div>
  </form>
</div>

<div id="table-container">
  <div class="text-muted">Lade Empfänger…</div>
</div>

<!-- Bulk-Bar -->
<div class="card card-body mt-3 d-none" id="bulk-bar">
  <div class="row g-2 align-items-center">
    <div class="col-auto">
      <div class="fw-semibold">🧩 Markierte Empfänger</div>
      <div class="text-muted" id="bulk-selected-count">0 ausgewählt</div>
    </div>

    <div class="col-auto">
      <select id="bulk-action" class="form-select">
        <option value="">Aktion wählen…</option>
        <option value="set_active">✅ Aktiv setzen</option>
        <option value="set_inactive">🚫 Inaktiv setzen</option>
        <option value="delete">🗑️ Löschen / Abmelden</option>
        <option value="add_tag">🏷 Tag hinzufügen</option>
        <option value="remove_tag">🏷 Tag entfernen</option> <!-- NEU -->
        <option value="move_to_list" id="bulk-move-option" class="d-none">➡️ In andere Liste verschieben</option>
      </select>
    </div>

    <div class="col-auto d-none" id="bulk-tag-wrap">
      <select id="bulk-tag-id" class="form-select">
        <option value="">Tag wählen…</option>
        <?php foreach ($tags as $t): ?>
          <option value="<?= (int)$t['id'] ?>"><?= e($t['name']) ?></option>
        <?php endforeach; ?>
      </select>
      <div class="form-text">Gilt für „Tag hinzufügen“ und „Tag entfernen“.</div>
    </div>

    <div class="col-auto d-none" id="bulk-list-wrap">
      <select id="bulk-target-list" class="form-select">
        <option value="">Ziel-Liste wählen…</option>
        <?php foreach ($lists as $l): ?>
          <option value="<?= (int)$l['id'] ?>"><?= e($l['name']) ?></option>
        <?php endforeach; ?>
      </select>

      <div class="form-text">Quelle: <strong id="bulk-source-label">-</strong></div>

      <!-- HINWEIS DOI / DSGVO -->
      <div class="alert alert-warning mt-2 mb-0 py-2 small">
        ⚠️ <strong>Hinweis zu DOI (listenabhängig / DSGVO-relevant):</strong><br>
        Beim Verschieben in eine andere Liste wird <strong>keine DOI-Bestätigung „mitgenommen“</strong>.
        DOI bleibt in <code>recipient_list_optin</code> immer <strong>pro Liste</strong> gespeichert.
        Wenn die Ziel-Liste DOI erfordert oder Kampagnen nur an DOI senden, kann der Empfänger dort
        ggf. <strong>keine Mails erhalten</strong>, bis er für die Ziel-Liste (neu) bestätigt wurde.
      </div>
    </div>

    <div class="col-auto">
      <button class="btn btn-primary" id="bulk-apply">Anwenden</button>
    </div>
  </div>
</div>

<script>
function showAlert(message, type = 'success') {
  const el = document.getElementById('page-alert');
  el.className = 'alert alert-' + type;
  el.textContent = message;
  el.classList.remove('d-none');
  setTimeout(() => el.classList.add('d-none'), 4000);
}

/* =========================================================================
 * Filter Payload (GET -> POST)
 * ========================================================================= */
function getFilterPayload(page = 1) {
  const fd = new FormData(document.getElementById('filterForm'));
  fd.set('page', String(page));
  return new URLSearchParams(fd);
}

/* =========================================================================
 * Tabelle laden (AJAX)
 * ========================================================================= */
async function loadRecipients(page = 1) {
  const container = document.getElementById('table-container');
  container.innerHTML = '<div class="text-muted">Lade Empfänger…</div>';

  try {
    const res = await fetch('empfaenger_table_ajax.php', {
      method: 'POST',
      headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
      body: getFilterPayload(page).toString()
    });

    if (!res.ok) {
      const txt = await res.text();
      container.innerHTML =
        '<div class="alert alert-danger">' +
        '<div><strong>Fehler beim Laden der Empfänger</strong></div>' +
        '<div class="small">HTTP ' + res.status + ' ' + res.statusText + '</div>' +
        '<pre class="small mb-0" style="white-space:pre-wrap;">' + (txt || '(keine Antwort)') + '</pre>' +
        '</div>';
      return;
    }

    const html = await res.text();
    container.innerHTML = html;

    bindTableCheckboxes();
  } catch (e) {
    container.innerHTML =
      '<div class="alert alert-danger">' +
      'Technischer Fehler beim Laden der Tabelle.<br>' +
      '<span class="small text-muted">' + (e && e.message ? e.message : '') + '</span>' +
      '</div>';
  }

  updateMoveToListVisibility();
}

/* =========================================================================
 * Helper: Selected IDs
 * ========================================================================= */
function getSelectedIds() {
  return Array.from(document.querySelectorAll('#table-container input.recipient-checkbox:checked'))
    .map(cb => cb.value);
}

/* =========================================================================
 * Bulk-Bar aktualisieren
 * ========================================================================= */
function updateBulkBar() {
  const ids = getSelectedIds();
  document.getElementById('bulk-selected-count').textContent = ids.length + ' ausgewählt';
  document.getElementById('bulk-bar').classList.toggle('d-none', ids.length === 0);
}

/* =========================================================================
 * Checkbox Handling (Select All + Einzel)
 * ========================================================================= */
function bindTableCheckboxes() {
  const selectAll = document.getElementById('select_all');
  const checkboxes = Array.from(document.querySelectorAll('#table-container input.recipient-checkbox'));

  if (selectAll) {
    selectAll.addEventListener('change', () => {
      checkboxes.forEach(cb => cb.checked = selectAll.checked);
      updateBulkBar();
    });
  }

  checkboxes.forEach(cb => cb.addEventListener('change', updateBulkBar));
  updateBulkBar();
}

/* =========================================================================
 * Move-To-List nur erlauben, wenn oben eine Liste gewählt wurde
 * ========================================================================= */
function updateMoveToListVisibility() {
  const listId = document.getElementById('list_id').value;
  const opt = document.getElementById('bulk-move-option');
  const listWrap = document.getElementById('bulk-list-wrap');
  const label = document.getElementById('bulk-source-label');

  if (listId) {
    opt.classList.remove('d-none');
    label.textContent = 'Liste #' + listId;
  } else {
    opt.classList.add('d-none');
    if (document.getElementById('bulk-action').value === 'move_to_list') {
      document.getElementById('bulk-action').value = '';
      listWrap.classList.add('d-none');
    }
    label.textContent = '-';
  }
}

/* =========================================================================
 * Bulk-Aktion UI toggles
 * ========================================================================= */
document.getElementById('bulk-action').addEventListener('change', () => {
  const val = document.getElementById('bulk-action').value;

  // Tag-Auswahl sichtbar bei add_tag UND remove_tag
  document.getElementById('bulk-tag-wrap')
    .classList.toggle('d-none', !(val === 'add_tag' || val === 'remove_tag'));

  // Listen-Auswahl sichtbar nur bei move_to_list
  document.getElementById('bulk-list-wrap')
    .classList.toggle('d-none', val !== 'move_to_list');
});

/* =========================================================================
 * Bulk-Aktion ausführen
 * ========================================================================= */
document.getElementById('bulk-apply').addEventListener('click', async () => {
  const ids = getSelectedIds();
  const action = document.getElementById('bulk-action').value;

  if (!ids.length) return showAlert('Keine Empfänger ausgewählt.', 'warning');
  if (!action) return showAlert('Bitte eine Aktion wählen.', 'warning');

  const payload = new URLSearchParams();
  payload.set('action', action);
  ids.forEach(id => payload.append('recipient_ids[]', id));

  // Move To List
  if (action === 'move_to_list') {
    const source = document.getElementById('list_id').value;
    const target = document.getElementById('bulk-target-list').value;
    if (!source) return showAlert('Liste verschieben ist nur möglich, wenn oben eine Liste gewählt wurde.', 'warning');
    if (!target) return showAlert('Bitte eine Ziel-Liste auswählen.', 'warning');
    payload.set('source_list_id', source);
    payload.set('target_list_id', target);
  }

  // Tag hinzufügen/entfernen
  if (action === 'add_tag' || action === 'remove_tag') {
    const tagId = document.getElementById('bulk-tag-id').value;
    if (!tagId) return showAlert('Bitte einen Tag auswählen.', 'warning');
    payload.set('tag_id', tagId);
  }

  // Delete Confirm
  if (action === 'delete') {
    if (!confirm('Wirklich alle markierten Empfänger löschen/abmelden?')) return;
  }

  try {
    const res = await fetch('empfaenger_bulk_ajax.php', {
      method: 'POST',
      headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
      body: payload.toString()
    });

    const data = await res.json();

    if (data && data.success) {
      showAlert(data.message || 'Aktion erfolgreich.', 'success');
      setTimeout(() => loadRecipients(1), 400);
    } else {
      showAlert((data && data.message) ? data.message : 'Aktion fehlgeschlagen.', 'danger');
    }
  } catch (e) {
    showAlert('Technischer Fehler beim Ausführen der Aktion.', 'danger');
  }
});

/* =========================================================================
 * Events
 * ========================================================================= */
document.getElementById('list_id').addEventListener('change', () => {
  updateMoveToListVisibility();
});

/* =========================================================================
 * Init
 * ========================================================================= */
updateMoveToListVisibility();
loadRecipients(<?= (int)($_GET['page'] ?? 1) ?>);
</script>

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