<?php
// admin/empfaenger/import_csv.php
// CSV-Import Empfänger + Intake-Sperrliste (Blacklist) anwenden

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();
$success = false;
$error = '';

$importierte = 0;     // neu zur Liste hinzugefügt
$duplikate = 0;       // Empfänger existiert bereits
$gesperrt = 0;        // durch Sperrliste blockiert

/**
 * -----------------------------------------------------------
 * Sperrliste-Check (Intake-only!)
 * -----------------------------------------------------------
 * Diese Funktion wird ausschließlich beim Import verwendet, um zu verhindern,
 * dass gesperrte Adressen überhaupt ins System übernommen werden.
 *
 * Rückgabe:
 * - false => nicht gesperrt
 * - array => gesperrt (enthält reason/type/value)
 */
function checkSuppressionList(PDO $db, string $email)
{
    $email = trim(strtolower($email));
    if ($email === '' || strpos($email, '@') === false) {
        return false;
    }

    $domain = substr(strrchr($email, "@"), 1);
    $domain = trim(strtolower($domain));
    if ($domain === '') {
        return false;
    }

    try {
        $sql = "
            SELECT id, type, value, reason, details, expires_at
            FROM suppression_list
            WHERE is_active = 1
              AND (expires_at IS NULL OR expires_at > NOW())
              AND (
                   (type = 'email'  AND value = :email)
                OR (type = 'domain' AND value = :domain)
              )
            ORDER BY CASE WHEN type = 'email' THEN 0 ELSE 1 END
            LIMIT 1
        ";

        $stmt = $db->prepare($sql);
        $stmt->execute([
            ':email'  => $email,
            ':domain' => $domain,
        ]);

        $hit = $stmt->fetch(PDO::FETCH_ASSOC);

        ErrorLogger::logSqlSuccess('Sperrliste-Check (import_csv intake)', [
            'email'   => $email,
            'domain'  => $domain,
            'blocked' => (bool)$hit
        ]);

        return $hit ?: false;

    } catch (Throwable $e) {
        // Fail-open: Import nicht kaputt machen, wenn die Sperrlistenprüfung fehlschlägt.
        ErrorLogger::logSqlError('Sperrliste-Check (import_csv) fehlgeschlagen: ' . $e->getMessage());
        return false;
    }
}

try {
    $list_stmt = $db->query("SELECT id, name FROM lists ORDER BY name ASC");
    $listen = $list_stmt->fetchAll(PDO::FETCH_ASSOC);
    ErrorLogger::logSqlSuccess("Empfängerlisten für CSV-Import geladen");
} catch (Exception $e) {
    ErrorLogger::logSqlError("Fehler beim Laden der Listen für CSV-Import: " . $e->getMessage());
    $listen = [];
    $error = 'Listen konnten nicht geladen werden.';
}

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['csv_file'], $_POST['list_id'])) {
    $list_id = (int)$_POST['list_id'];
    $csv_tmp = $_FILES['csv_file']['tmp_name'];

    if (!is_uploaded_file($csv_tmp)) {
        $error = 'Fehler beim Datei-Upload.';
        ErrorLogger::log("CSV-Datei wurde nicht korrekt hochgeladen", 'ERROR');
    } else {
        if (($handle = fopen($csv_tmp, 'r')) !== false) {
            $header = fgetcsv($handle, 1000, ';');

            while (($data = fgetcsv($handle, 1000, ';')) !== false) {
                $anrede   = trim($data[0] ?? '');
                $vorname  = trim($data[1] ?? '');
                $nachname = trim($data[2] ?? '');
                $email    = trim($data[3] ?? '');

                // ------------------------------
                // 1) E-Mail validieren + normalisieren
                // ------------------------------
                if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
                    continue;
                }
                $email = strtolower($email);

                // ------------------------------
                // 2) Sperrliste anwenden (Intake-only!)
                //    -> Gesperrte Adressen werden NICHT importiert / NICHT verknüpft
                // ------------------------------
                $suppressed = checkSuppressionList($db, $email);
                if ($suppressed !== false) {
                    $gesperrt++;

                    // Intern loggen: so kannst du später nachvollziehen, warum übersprungen wurde
                    ErrorLogger::logSqlSuccess('Import blockiert durch Sperrliste', [
                        'email'  => $email,
                        'type'   => $suppressed['type'] ?? null,
                        'reason' => $suppressed['reason'] ?? null,
                        'value'  => $suppressed['value'] ?? null,
                        'list_id'=> $list_id
                    ]);

                    // Adresse überspringen
                    continue;
                }

                try {
                    // ------------------------------
                    // 3) Empfänger anlegen, falls nicht vorhanden
                    // ------------------------------
                    $stmt = $db->prepare("SELECT id FROM recipients WHERE email = ?");
                    $stmt->execute([$email]);
                    $recipient = $stmt->fetch(PDO::FETCH_ASSOC);

                    if (!$recipient) {
                        $insert = $db->prepare("INSERT INTO recipients (email, anrede, vorname, nachname, status) VALUES (?, ?, ?, ?, 'active')");
                        $insert->execute([$email, $anrede, $vorname, $nachname]);
                        $recipient_id = $db->lastInsertId();
                        ErrorLogger::logSqlSuccess("Empfänger $email angelegt mit ID $recipient_id");
                    } else {
                        $recipient_id = $recipient['id'];
                        $duplikate++;
                    }

                    // ------------------------------
                    // 4) Empfänger der Liste zuordnen (falls noch nicht verknüpft)
                    // ------------------------------
                    $check = $db->prepare("SELECT 1 FROM recipient_lists WHERE recipient_id = ? AND list_id = ?");
                    $check->execute([$recipient_id, $list_id]);

                    if ($check->rowCount() === 0) {
                        $insert_link = $db->prepare("INSERT INTO recipient_lists (recipient_id, list_id, subscribed_at) VALUES (?, ?, NOW())");
                        $insert_link->execute([$recipient_id, $list_id]);
                        $importierte++;
                        ErrorLogger::logSqlSuccess("Empfänger $recipient_id der Liste $list_id hinzugefügt");
                    }
                } catch (Exception $e) {
                    ErrorLogger::logSqlError("Fehler beim Importieren von $email: " . $e->getMessage());
                }
            }

            fclose($handle);
            $success = true;

            $admin_user = $_SESSION['username'] ?? 'Unbekannt';
            $file_name = $_FILES['csv_file']['name'] ?? 'n/a';

            try {
                // ------------------------------
                // 5) Import-Log schreiben (erweitert um gesperrt)
                //    Wenn deine import_log Tabelle kein Feld "suppressed" hat,
                //    dann bitte das Feld ergänzen ODER den Wert weglassen.
                // ------------------------------
                // Empfehlung: Tabelle import_log um Spalte "suppressed" INT ergänzen.
                // ALTER TABLE import_log ADD COLUMN suppressed INT NOT NULL DEFAULT 0;

                $log_stmt = $db->prepare("INSERT INTO import_log (admin_user, list_id, file_name, total, imported, duplicates, suppressed) VALUES (?, ?, ?, ?, ?, ?, ?)");
                $log_stmt->execute([
                    $admin_user, $list_id, $file_name,
                    $importierte + $duplikate + $gesperrt, $importierte, $duplikate, $gesperrt
                ]);

                ErrorLogger::log("CSV-Import durch $admin_user abgeschlossen: $importierte neu, $duplikate Duplikate, $gesperrt gesperrt", 'INFO');
            } catch (Exception $e) {
                // Fallback: Wenn import_log keine suppressed-Spalte hat, loggen wir wenigstens sauber
                ErrorLogger::logSqlError("Fehler beim Schreiben in import_log: " . $e->getMessage());

                // Optional: Versuch ohne suppressed-Feld (damit Importlog trotzdem funktioniert)
                try {
                    $log_stmt = $db->prepare("INSERT INTO import_log (admin_user, list_id, file_name, total, imported, duplicates) VALUES (?, ?, ?, ?, ?, ?)");
                    $log_stmt->execute([
                        $admin_user, $list_id, $file_name,
                        $importierte + $duplikate + $gesperrt, $importierte, $duplikate
                    ]);
                    ErrorLogger::log("CSV-Import (Fallback ohne suppressed-Spalte) durch $admin_user abgeschlossen.", 'INFO');
                } catch (Exception $e2) {
                    ErrorLogger::logSqlError("Fallback import_log (ohne suppressed) fehlgeschlagen: " . $e2->getMessage());
                }
            }
        } else {
            $error = 'CSV-Datei konnte nicht gelesen werden.';
            ErrorLogger::log("CSV-Datei konnte nicht geöffnet werden", 'ERROR');
        }
    }
}

$pageHelp = renderPageHelp([
    'sections' => [
        [
            'heading' => 'Was macht diese Seite?',
            'items' => [
                'Hier importierst du Empfänger aus einer Datei in eine ausgewählte Liste.',
                'Der Import kann vorhandene Felder, Tags und Zusatzdaten übernehmen, wenn die Datei passend aufgebaut ist.',
            ],
        ],
        [
            'heading' => 'Was muss ich eingeben oder auswählen?',
            'items' => [
                'Wähle die Importdatei und die Zielliste aus.',
                'Ordne die Spalten so zu, dass E-Mail-Adresse und weitere Felder korrekt erkannt werden.',
            ],
        ],
        [
            'heading' => 'Worauf sollte ich achten?',
            'items' => [
                'Pflichtfelder müssen vollständig sein, sonst werden Datensätze übersprungen oder fehlerhaft übernommen.',
                'Prüfe vor dem Import, ob die Datei wirklich zur gewünschten Liste und Struktur passt.',
            ],
        ],
    ],
    'warning' => 'Ein Import kann viele Datensätze auf einmal anlegen oder verändern. Führe ihn nur mit einer geprüften Datei aus.',
]);

ob_start();
?>
<div class="container mt-4">
    <?= $pageHelp ?>
    <div class="page-header h2">📥 Empfänger-Import</div>

    <?php if ($success): ?>
        <div class="alert alert-success alert-dismissible fade show" role="alert">
            <i class="tml tml-check-circle"></i>
            Import abgeschlossen.<br>
            Neu in Liste eingefügt: <strong><?= $importierte ?></strong><br>
            Bereits vorhanden (Duplikate): <strong><?= $duplikate ?></strong><br>
            Durch Sperrliste blockiert: <strong><?= $gesperrt ?></strong>
            <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
        </div>
        <script>setTimeout(()=>document.querySelector(".alert")?.remove(),5000);</script>

    <?php elseif ($error): ?>
        <div class="alert alert-danger alert-dismissible fade show" role="alert">
            <i class="tml tml-exclamation-circle"></i>
            ❌ <?= htmlspecialchars($error) ?>
            <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
        </div>
        <script>setTimeout(()=>document.querySelector(".alert")?.remove(),5000);</script>
    <?php endif; ?>

    <form method="post" enctype="multipart/form-data" class="mt-3">
        <div class="mb-3">
            <label for="list_id" class="form-label">Ziel-Liste:</label>
            <select name="list_id" id="list_id" class="form-select" required>
                <option value="">-- Bitte wählen --</option>
                <?php foreach ($listen as $liste): ?>
                    <option value="<?= $liste['id'] ?>"><?= htmlspecialchars($liste['name']) ?></option>
                <?php endforeach; ?>
            </select>
        </div>

        <div class="mb-3">
            <label for="csv_file" class="form-label">CSV-Datei hochladen:</label>
            <input type="file" name="csv_file" id="csv_file" class="form-control" accept=".csv" required>
            <small class="form-text text-muted">Erwartetes Format: <code>Anrede;Vorname;Nachname;Email</code></small>
        </div>

        <button type="submit" class="btn btn-primary">Import starten</button>
    </form>
</div>
<?php
$pageContent = ob_get_clean();
include __DIR__ . '/../template.php';
