-- ============================================
-- Multi-App Social Media & Dating Platform
-- MySQL Database Schema (MariaDB)
-- ============================================
-- Aufteilung: Chat (Login, Nachrichten, Reaktionen, Gruppenchats) = Rocket.Chat/MongoDB.
-- MariaDB = Plattform (profil, app_id, posts, stories, kontakte, dating, …).
-- Tabellen nachrichten/reaktionen bleiben im Schema (FKs), werden bei Nutzung von
-- Rocket.Chat für Chat nicht befüllt. Siehe database/AUFTEILUNG.md.
-- Produktion: Charset utf8mb4, Zeit UTC.
-- ============================================


-- ============================================
-- 1. PROFIL (User Profile)
-- ============================================
CREATE TABLE IF NOT EXISTS `profil` (
  `benutzer_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `benutzername` VARCHAR(255) NOT NULL,
  `passwort_hash` VARCHAR(255) NOT NULL,
  `telefonnummer` VARCHAR(50) DEFAULT NULL,
  `email` VARCHAR(255) DEFAULT NULL,
  `profilbild_url` VARCHAR(500) DEFAULT NULL,
  `profilbilder_json` JSON DEFAULT NULL,
  `geburtstag` DATE DEFAULT NULL,
  `geschlecht` ENUM('m', 'w', 'd', 'keine_angabe') DEFAULT NULL,
  `geschlecht_orientierung` VARCHAR(50) DEFAULT NULL,
  `status_text` TEXT DEFAULT NULL,
  `zuletzt_online` DATETIME DEFAULT NULL,
  `online_status` TINYINT(1) DEFAULT 0,
  `sichtbarkeit_status` TINYINT(1) DEFAULT 1,
  `profil_privat_status` TINYINT(1) DEFAULT 0,
  `verifiziert_status` TINYINT(1) DEFAULT 0,
  `benachrichtigungen_aktiv` TINYINT(1) DEFAULT 1,
  `verschluesselung_aktiviert` TINYINT(1) DEFAULT 0,
  `registriert_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `letzter_login` DATETIME DEFAULT NULL,
  `account_status` ENUM('aktiv', 'gesperrt', 'geloescht', 'deaktiviert') DEFAULT 'aktiv',
  `zweifaktor_authentifizierung` TINYINT(1) DEFAULT 0,
  `sprache` VARCHAR(10) DEFAULT 'de',
  `zeitzone` VARCHAR(50) DEFAULT 'Europe/Berlin',
  `stadt` VARCHAR(100) DEFAULT NULL,
  `land` VARCHAR(100) DEFAULT NULL,
  `postleitzahl` VARCHAR(20) DEFAULT NULL,
  `adresse` VARCHAR(255) DEFAULT NULL,
  `hausnummer` VARCHAR(20) DEFAULT NULL,
  `latitude` DECIMAL(10, 8) DEFAULT NULL,
  `longitude` DECIMAL(11, 8) DEFAULT NULL,
  `device_ids_json` JSON DEFAULT NULL,
  `privacy_einstellungen_json` JSON DEFAULT NULL,
  PRIMARY KEY (`benutzer_id`),
  UNIQUE KEY `unique_username_app` (`app_id`, `benutzername`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_email` (`email`),
  KEY `idx_telefonnummer` (`telefonnummer`),
  KEY `idx_account_status` (`account_status`),
  KEY `idx_online_status` (`online_status`),
  KEY `idx_zuletzt_online` (`zuletzt_online`),
  KEY `idx_postleitzahl` (`postleitzahl`),
  KEY `idx_stadt` (`stadt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 2. GRUPPEN (Groups)
-- ============================================
CREATE TABLE IF NOT EXISTS `gruppen` (
  `gruppen_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `gruppen_name` VARCHAR(255) NOT NULL,
  `gruppen_bild_url` VARCHAR(500) DEFAULT NULL,
  `gruppen_beschreibung` TEXT DEFAULT NULL,
  `ersteller_id` BIGINT UNSIGNED NOT NULL,
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `geloescht_status` TINYINT(1) DEFAULT 0,
  `geloescht_am` DATETIME DEFAULT NULL,
  `wiederhergestellt_am` DATETIME DEFAULT NULL,
  `archiviert_am` DATETIME DEFAULT NULL,
  `entarchiviert_am` DATETIME DEFAULT NULL,
  `mitglieder_anzahl` INT UNSIGNED DEFAULT 0,
  `oeffentlich_status` TINYINT(1) DEFAULT 0,
  `einladungs_link` VARCHAR(255) DEFAULT NULL,
  `gruppen_einstellungen_json` JSON DEFAULT NULL,
  PRIMARY KEY (`gruppen_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_ersteller` (`ersteller_id`),
  KEY `idx_geloescht_status` (`geloescht_status`),
  CONSTRAINT `fk_gruppen_ersteller` FOREIGN KEY (`ersteller_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 3. NACHRICHTEN (Messages)
-- ============================================
CREATE TABLE IF NOT EXISTS `nachrichten` (
  `nachrichten_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `client_message_id` VARCHAR(36) DEFAULT NULL,
  `app_id` INT UNSIGNED NOT NULL,
  `absender_id` BIGINT UNSIGNED NOT NULL,
  `empfaenger_id` BIGINT UNSIGNED DEFAULT NULL,
  `nachrichten_text` TEXT DEFAULT NULL,
  `zeitstempel` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gelesen_status` TINYINT(1) DEFAULT 0,
  `geloescht_status` TINYINT(1) DEFAULT 0,
  `geloescht_am` DATETIME DEFAULT NULL,
  `archiviert_am` DATETIME DEFAULT NULL,
  `entarchiviert_am` DATETIME DEFAULT NULL,
  `nachrichten_typ` ENUM('text', 'bild', 'video', 'audio', 'dokument', 'standort', 'live_standort', 'kontakt', 'link', 'zitat', 'weitergeleitet', 'abstimmung', 'audiodatei') DEFAULT 'text',
  `anhang_url` VARCHAR(500) DEFAULT NULL,
  `anhang_typ` VARCHAR(50) DEFAULT NULL,
  `gruppen_id` BIGINT UNSIGNED DEFAULT NULL,
  `antwort_auf_nachricht_id` BIGINT UNSIGNED DEFAULT NULL,
  `weitergeleitet_status` TINYINT(1) DEFAULT 0,
  `original_nachricht_id` BIGINT UNSIGNED DEFAULT NULL,
  `original_absender_id` BIGINT UNSIGNED DEFAULT NULL,
  `original_zeitstempel` DATETIME DEFAULT NULL,
  `bearbeitet_status` TINYINT(1) DEFAULT 0,
  `bearbeitet_zeitstempel` DATETIME DEFAULT NULL,
  `geloescht_fuer_absender` TINYINT(1) DEFAULT 0,
  `geloescht_fuer_absender_am` DATETIME DEFAULT NULL,
  `geloescht_fuer_empfaenger` TINYINT(1) DEFAULT 0,
  `geloescht_fuer_empfaenger_am` DATETIME DEFAULT NULL,
  `verschluesselung_status` TINYINT(1) DEFAULT 0,
  `nachrichten_status` ENUM('pending', 'sending', 'gesendet', 'zugestellt', 'gelesen', 'fehler') DEFAULT 'gesendet',
  `view_once_status` TINYINT(1) DEFAULT 0,
  `angesehen_am` DATETIME DEFAULT NULL,
  `zitat_text` TEXT DEFAULT NULL,
  `zitat_absender` BIGINT UNSIGNED DEFAULT NULL,
  `zitat_zeitstempel` DATETIME DEFAULT NULL,
  `wiederhergestellt_am` DATETIME DEFAULT NULL,
  `media_dauer` INT UNSIGNED DEFAULT NULL,
  `media_thumbnail` VARCHAR(500) DEFAULT NULL,
  `standort_latitude` DECIMAL(10, 8) DEFAULT NULL,
  `standort_longitude` DECIMAL(11, 8) DEFAULT NULL,
  `dokument_name` VARCHAR(255) DEFAULT NULL,
  `dokument_groesse` BIGINT UNSIGNED DEFAULT NULL,
  `sprach_nachricht_url` VARCHAR(500) DEFAULT NULL,
  `sprach_nachricht_dauer` INT UNSIGNED DEFAULT NULL,
  `video_thumbnail` VARCHAR(500) DEFAULT NULL,
  `video_dauer` INT UNSIGNED DEFAULT NULL,
  `link_vorschau_url` VARCHAR(500) DEFAULT NULL,
  `link_vorschau_titel` VARCHAR(255) DEFAULT NULL,
  `link_vorschau_beschreibung` TEXT DEFAULT NULL,
  `link_vorschau_bild` VARCHAR(500) DEFAULT NULL,
  `verschluesselung_schluessel_id` BIGINT UNSIGNED DEFAULT NULL,
  `metadaten_json` JSON DEFAULT NULL,
  PRIMARY KEY (`nachrichten_id`),
  UNIQUE KEY `idx_client_message_id` (`app_id`, `client_message_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_absender` (`absender_id`),
  KEY `idx_empfaenger` (`empfaenger_id`),
  KEY `idx_gruppen_id` (`gruppen_id`),
  KEY `idx_zeitstempel` (`zeitstempel`),
  KEY `idx_gruppe_zeit` (`gruppen_id`, `zeitstempel`),
  KEY `idx_geloescht_status` (`geloescht_status`),
  KEY `idx_nachrichten_status` (`nachrichten_status`),
  KEY `idx_empfaenger_status` (`empfaenger_id`, `nachrichten_status`),
  KEY `idx_antwort_auf` (`antwort_auf_nachricht_id`),
  KEY `idx_weitergeleitet_status` (`weitergeleitet_status`),
  KEY `idx_original_nachricht` (`original_nachricht_id`),
  KEY `idx_original_absender` (`original_absender_id`),
  CONSTRAINT `fk_nachrichten_absender` FOREIGN KEY (`absender_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_nachrichten_empfaenger` FOREIGN KEY (`empfaenger_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_nachrichten_gruppe` FOREIGN KEY (`gruppen_id`) REFERENCES `gruppen` (`gruppen_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_nachrichten_antwort` FOREIGN KEY (`antwort_auf_nachricht_id`) REFERENCES `nachrichten` (`nachrichten_id`) ON DELETE SET NULL,
  CONSTRAINT `fk_nachrichten_original_nachricht` FOREIGN KEY (`original_nachricht_id`) REFERENCES `nachrichten` (`nachrichten_id`) ON DELETE SET NULL,
  CONSTRAINT `fk_nachrichten_original_absender` FOREIGN KEY (`original_absender_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE SET NULL,
  CONSTRAINT `fk_nachrichten_zitat_absender` FOREIGN KEY (`zitat_absender`) REFERENCES `profil` (`benutzer_id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 4. KONTAKTE (Contacts)
-- ============================================
CREATE TABLE IF NOT EXISTS `kontakte` (
  `kontakt_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `kontakt_benutzer_id` BIGINT UNSIGNED NOT NULL,
  `kontakt_name` VARCHAR(255) DEFAULT NULL,
  `kontakt_telefonnummer` VARCHAR(50) DEFAULT NULL,
  `kontakt_email` VARCHAR(255) DEFAULT NULL,
  `hinzugefuegt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `entfernt_am` DATETIME DEFAULT NULL,
  `wiederhergestellt_am` DATETIME DEFAULT NULL,
  `aktiv_status` TINYINT(1) DEFAULT 1,
  `favorit_status` TINYINT(1) DEFAULT 0,
  `angeheftet_status` TINYINT(1) DEFAULT 0,
  `angeheftet_am` DATETIME DEFAULT NULL,
  `entheftet_am` DATETIME DEFAULT NULL,
  `sortierung_position` INT DEFAULT 0,
  `zuletzt_kommuniziert_am` DATETIME DEFAULT NULL,
  PRIMARY KEY (`kontakt_id`),
  UNIQUE KEY `unique_kontakt` (`app_id`, `benutzer_id`, `kontakt_benutzer_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_kontakt_benutzer_id` (`kontakt_benutzer_id`),
  KEY `idx_aktiv_status` (`aktiv_status`),
  KEY `idx_angeheftet` (`angeheftet_status`),
  CONSTRAINT `fk_kontakte_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_kontakte_kontakt` FOREIGN KEY (`kontakt_benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 5. GRUPPEN_MITGLIEDER (Group Members)
-- ============================================
CREATE TABLE IF NOT EXISTS `gruppen_mitglieder` (
  `gruppen_mitglied_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `gruppen_id` BIGINT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `beitritts_datum` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `verlassen_am` DATETIME DEFAULT NULL,
  `aktiv_status` TINYINT(1) DEFAULT 1,
  `rolle` VARCHAR(50) DEFAULT 'mitglied',
  `admin_status` TINYINT(1) DEFAULT 0,
  `admin_rolle` VARCHAR(50) DEFAULT NULL,
  `admin_ernannt_am` DATETIME DEFAULT NULL,
  `admin_entfernt_am` DATETIME DEFAULT NULL,
  `benachrichtigungen_aktiv` TINYINT(1) DEFAULT 1,
  `zuletzt_gelesen_nachricht_id` BIGINT UNSIGNED DEFAULT NULL,
  PRIMARY KEY (`gruppen_mitglied_id`),
  UNIQUE KEY `unique_gruppen_mitglied` (`app_id`, `gruppen_id`, `benutzer_id`),
  KEY `idx_gruppen_id` (`gruppen_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_aktiv_status` (`aktiv_status`),
  CONSTRAINT `fk_gruppen_mitglieder_gruppe` FOREIGN KEY (`gruppen_id`) REFERENCES `gruppen` (`gruppen_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_gruppen_mitglieder_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_gruppen_mitglieder_nachricht` FOREIGN KEY (`zuletzt_gelesen_nachricht_id`) REFERENCES `nachrichten` (`nachrichten_id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 6. POSTS
-- ============================================
CREATE TABLE IF NOT EXISTS `posts` (
  `post_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `client_post_id` VARCHAR(36) DEFAULT NULL,
  `app_id` INT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `post_typ` ENUM('bild', 'video', 'text', 'carousel', 'reel', 'audio', 'dokument', 'link', 'gemischt') DEFAULT 'bild',
  `media_urls_json` JSON DEFAULT NULL,
  `media_typen_json` JSON DEFAULT NULL,
  `anhang_urls_json` JSON DEFAULT NULL,
  `anhang_typen_json` JSON DEFAULT NULL,
  `beschreibung` TEXT DEFAULT NULL,
  `hashtags_json` JSON DEFAULT NULL,
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `bearbeitet_am` DATETIME DEFAULT NULL,
  `geloescht_status` TINYINT(1) DEFAULT 0,
  `geloescht_am` DATETIME DEFAULT NULL,
  `wiederhergestellt_am` DATETIME DEFAULT NULL,
  `archiviert_am` DATETIME DEFAULT NULL,
  `entarchiviert_am` DATETIME DEFAULT NULL,
  `entwurf_status` TINYINT(1) DEFAULT 0,
  `privat_status` TINYINT(1) DEFAULT 0,
  `wiederveroeffentlicht_am` DATETIME DEFAULT NULL,
  `original_post_id` BIGINT UNSIGNED DEFAULT NULL,
  `sichtbarkeit_status` ENUM('oeffentlich', 'freunde', 'privat', 'nur_ich') DEFAULT 'oeffentlich',
  `likes_anzahl` INT UNSIGNED DEFAULT 0,
  `kommentare_anzahl` INT UNSIGNED DEFAULT 0,
  `geteilt_anzahl` INT UNSIGNED DEFAULT 0,
  `gespeichert_anzahl` INT UNSIGNED DEFAULT 0,
  `standort_latitude` DECIMAL(10, 8) DEFAULT NULL,
  `standort_longitude` DECIMAL(11, 8) DEFAULT NULL,
  `standort_name` VARCHAR(255) DEFAULT NULL,
  `metadaten_json` JSON DEFAULT NULL,
  PRIMARY KEY (`post_id`),
  UNIQUE KEY `idx_client_post_id` (`app_id`, `client_post_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_erstellt_am` (`erstellt_am`),
  KEY `idx_feed` (`app_id`, `geloescht_status`, `erstellt_am`),
  KEY `idx_geloescht_status` (`geloescht_status`),
  KEY `idx_entwurf_status` (`entwurf_status`),
  KEY `idx_original_post` (`original_post_id`),
  CONSTRAINT `fk_posts_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_posts_original` FOREIGN KEY (`original_post_id`) REFERENCES `posts` (`post_id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 7. POST_KOMMENTARE (Post Comments)
-- ============================================
CREATE TABLE IF NOT EXISTS `post_kommentare` (
  `kommentar_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `client_kommentar_id` VARCHAR(36) DEFAULT NULL,
  `app_id` INT UNSIGNED NOT NULL,
  `post_id` BIGINT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `antwort_auf_kommentar_id` BIGINT UNSIGNED DEFAULT NULL,
  `kommentar_text` TEXT NOT NULL,
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `bearbeitet_am` DATETIME DEFAULT NULL,
  `geloescht_status` TINYINT(1) DEFAULT 0,
  `geloescht_am` DATETIME DEFAULT NULL,
  `wiederhergestellt_am` DATETIME DEFAULT NULL,
  `archiviert_am` DATETIME DEFAULT NULL,
  `entarchiviert_am` DATETIME DEFAULT NULL,
  `likes_anzahl` INT UNSIGNED DEFAULT 0,
  `antworten_anzahl` INT UNSIGNED DEFAULT 0,
  `metadaten_json` JSON DEFAULT NULL,
  PRIMARY KEY (`kommentar_id`),
  UNIQUE KEY `idx_client_kommentar_id` (`app_id`, `client_kommentar_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_post_id` (`post_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_antwort_auf` (`antwort_auf_kommentar_id`),
  KEY `idx_geloescht_status` (`geloescht_status`),
  CONSTRAINT `fk_post_kommentare_post` FOREIGN KEY (`post_id`) REFERENCES `posts` (`post_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_post_kommentare_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_post_kommentare_antwort` FOREIGN KEY (`antwort_auf_kommentar_id`) REFERENCES `post_kommentare` (`kommentar_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 8. POST_LIKES (Post Likes)
-- ============================================
CREATE TABLE IF NOT EXISTS `post_likes` (
  `like_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `post_id` BIGINT UNSIGNED DEFAULT NULL,
  `kommentar_id` BIGINT UNSIGNED DEFAULT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `like_typ` ENUM('like', 'love', 'haha', 'wow', 'sad', 'angry', 'super_like') DEFAULT 'like',
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `entfernt_am` DATETIME DEFAULT NULL,
  `aktiv_status` TINYINT(1) DEFAULT 1,
  PRIMARY KEY (`like_id`),
  UNIQUE KEY `unique_post_like` (`app_id`, `post_id`, `benutzer_id`, `aktiv_status`),
  UNIQUE KEY `unique_kommentar_like` (`app_id`, `kommentar_id`, `benutzer_id`, `aktiv_status`),
  KEY `idx_post_id` (`post_id`),
  KEY `idx_kommentar_id` (`kommentar_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_aktiv_status` (`aktiv_status`),
  CONSTRAINT `fk_post_likes_post` FOREIGN KEY (`post_id`) REFERENCES `posts` (`post_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_post_likes_kommentar` FOREIGN KEY (`kommentar_id`) REFERENCES `post_kommentare` (`kommentar_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_post_likes_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `chk_post_or_kommentar` CHECK ((`post_id` IS NOT NULL AND `kommentar_id` IS NULL) OR (`post_id` IS NULL AND `kommentar_id` IS NOT NULL))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 9. POST_SAMMLUNGEN (Saved-Post Collections / Wiedergabelisten)
-- ============================================
CREATE TABLE IF NOT EXISTS `post_sammlungen` (
  `sammlung_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `sortierung_position` INT DEFAULT 0,
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `bearbeitet_am` DATETIME DEFAULT NULL,
  PRIMARY KEY (`sammlung_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  UNIQUE KEY `unique_benutzer_sammlung_name` (`app_id`, `benutzer_id`, `name`),
  CONSTRAINT `fk_post_sammlungen_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 10. POST_GESPEICHERT (Saved Posts)
-- ============================================
CREATE TABLE IF NOT EXISTS `post_gespeichert` (
  `gespeichert_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `post_id` BIGINT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `sammlung_id` BIGINT UNSIGNED DEFAULT NULL,
  `sortierung_position` INT DEFAULT 0,
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `entfernt_am` DATETIME DEFAULT NULL,
  `aktiv_status` TINYINT(1) DEFAULT 1,
  `sammlung_name` VARCHAR(255) DEFAULT NULL,
  PRIMARY KEY (`gespeichert_id`),
  UNIQUE KEY `unique_gespeichert` (`app_id`, `post_id`, `benutzer_id`),
  KEY `idx_post_id` (`post_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_sammlung_id` (`sammlung_id`),
  KEY `idx_aktiv_status` (`aktiv_status`),
  CONSTRAINT `fk_post_gespeichert_post` FOREIGN KEY (`post_id`) REFERENCES `posts` (`post_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_post_gespeichert_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_post_gespeichert_sammlung` FOREIGN KEY (`sammlung_id`) REFERENCES `post_sammlungen` (`sammlung_id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 11. POST_TEILEN (Shared Posts)
-- ============================================
CREATE TABLE IF NOT EXISTS `post_teilen` (
  `teilen_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `client_teilen_id` VARCHAR(36) DEFAULT NULL,
  `app_id` INT UNSIGNED NOT NULL,
  `post_id` BIGINT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `geteilt_an_benutzer_id` BIGINT UNSIGNED DEFAULT NULL,
  `geteilt_an_gruppe_id` BIGINT UNSIGNED DEFAULT NULL,
  `geteilt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `entfernt_am` DATETIME DEFAULT NULL,
  `aktiv_status` TINYINT(1) DEFAULT 1,
  `kommentar_zum_teilen` TEXT DEFAULT NULL,
  PRIMARY KEY (`teilen_id`),
  UNIQUE KEY `idx_client_teilen_id` (`app_id`, `client_teilen_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_post_id` (`post_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_aktiv_status` (`aktiv_status`),
  CONSTRAINT `fk_post_teilen_post` FOREIGN KEY (`post_id`) REFERENCES `posts` (`post_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_post_teilen_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_post_teilen_benutzer_empfaenger` FOREIGN KEY (`geteilt_an_benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_post_teilen_gruppe` FOREIGN KEY (`geteilt_an_gruppe_id`) REFERENCES `gruppen` (`gruppen_id`) ON DELETE CASCADE,
  CONSTRAINT `chk_post_teilen_ziel` CHECK ((`geteilt_an_benutzer_id` IS NOT NULL AND `geteilt_an_gruppe_id` IS NULL) OR (`geteilt_an_benutzer_id` IS NULL AND `geteilt_an_gruppe_id` IS NOT NULL))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 12. HASHTAGS
-- ============================================
CREATE TABLE IF NOT EXISTS `hashtags` (
  `hashtag_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `hashtag_text` VARCHAR(255) NOT NULL,
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `geloescht_status` TINYINT(1) DEFAULT 0,
  `geloescht_am` DATETIME DEFAULT NULL,
  `wiederhergestellt_am` DATETIME DEFAULT NULL,
  `verwendungen_anzahl` INT UNSIGNED DEFAULT 0,
  PRIMARY KEY (`hashtag_id`),
  UNIQUE KEY `unique_hashtag` (`app_id`, `hashtag_text`),
  KEY `idx_hashtag_text` (`hashtag_text`),
  KEY `idx_geloescht_status` (`geloescht_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 13. STORIES
-- ============================================
CREATE TABLE IF NOT EXISTS `stories` (
  `story_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `client_story_id` VARCHAR(36) DEFAULT NULL,
  `app_id` INT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `gruppen_id` BIGINT UNSIGNED DEFAULT NULL,
  `story_typ` ENUM('bild', 'video', 'text', 'boomerang') DEFAULT 'bild',
  `media_url` VARCHAR(500) NOT NULL,
  `media_typ` VARCHAR(50) DEFAULT NULL,
  `thumbnail_url` VARCHAR(500) DEFAULT NULL,
  `text_ueberlay` TEXT DEFAULT NULL,
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `abgelaufen_am` DATETIME NOT NULL,
  `geloescht_status` TINYINT(1) DEFAULT 0,
  `geloescht_am` DATETIME DEFAULT NULL,
  `wiederhergestellt_am` DATETIME DEFAULT NULL,
  `sichtbarkeit_status` ENUM('oeffentlich', 'freunde', 'privat') DEFAULT 'freunde',
  `ansichten_anzahl` INT UNSIGNED DEFAULT 0,
  `ansichten_json` JSON DEFAULT NULL,
  `reaktionen_anzahl` INT UNSIGNED DEFAULT 0,
  `reaktionen_json` JSON DEFAULT NULL,
  `metadaten_json` JSON DEFAULT NULL,
  PRIMARY KEY (`story_id`),
  UNIQUE KEY `idx_client_story_id` (`app_id`, `client_story_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_gruppen_id` (`gruppen_id`),
  KEY `idx_abgelaufen_am` (`abgelaufen_am`),
  KEY `idx_story_user_ablauf` (`benutzer_id`, `abgelaufen_am`),
  KEY `idx_geloescht_status` (`geloescht_status`),
  CONSTRAINT `fk_stories_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_stories_gruppe` FOREIGN KEY (`gruppen_id`) REFERENCES `gruppen` (`gruppen_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 14. STORY_HIGHLIGHTS (Story-Highlight-Sammlungen auf dem Profil)
-- ============================================
CREATE TABLE IF NOT EXISTS `story_highlights` (
  `highlight_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `cover_story_id` BIGINT UNSIGNED DEFAULT NULL,
  `cover_media_url` VARCHAR(500) DEFAULT NULL,
  `sortierung_position` INT DEFAULT 0,
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `bearbeitet_am` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `geloescht_status` TINYINT(1) DEFAULT 0,
  `geloescht_am` DATETIME DEFAULT NULL,
  PRIMARY KEY (`highlight_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_sortierung` (`benutzer_id`, `sortierung_position`),
  KEY `idx_geloescht_status` (`geloescht_status`),
  CONSTRAINT `fk_story_highlights_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_story_highlights_cover` FOREIGN KEY (`cover_story_id`) REFERENCES `stories` (`story_id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 15. HIGHLIGHT_STORIES (Welche Stories in welchem Highlight)
-- ============================================
CREATE TABLE IF NOT EXISTS `highlight_stories` (
  `highlight_story_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `highlight_id` BIGINT UNSIGNED NOT NULL,
  `story_id` BIGINT UNSIGNED NOT NULL,
  `sortierung_position` INT DEFAULT 0,
  `hinzugefuegt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`highlight_story_id`),
  UNIQUE KEY `unique_highlight_story` (`app_id`, `highlight_id`, `story_id`),
  KEY `idx_highlight_id` (`highlight_id`),
  KEY `idx_story_id` (`story_id`),
  CONSTRAINT `fk_highlight_stories_highlight` FOREIGN KEY (`highlight_id`) REFERENCES `story_highlights` (`highlight_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_highlight_stories_story` FOREIGN KEY (`story_id`) REFERENCES `stories` (`story_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 16. STORY_REAKTIONEN (Story Reactions)
-- ============================================
CREATE TABLE IF NOT EXISTS `story_reaktionen` (
  `reaktion_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `story_id` BIGINT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `reaktion_typ` ENUM('like', 'love', 'haha', 'wow') DEFAULT 'like',
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `entfernt_am` DATETIME DEFAULT NULL,
  `aktiv_status` TINYINT(1) DEFAULT 1,
  PRIMARY KEY (`reaktion_id`),
  UNIQUE KEY `unique_story_reaktion` (`app_id`, `story_id`, `benutzer_id`),
  KEY `idx_story_id` (`story_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_aktiv_status` (`aktiv_status`),
  CONSTRAINT `fk_story_reaktionen_story` FOREIGN KEY (`story_id`) REFERENCES `stories` (`story_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_story_reaktionen_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 17. FOLGEN (Follow)
-- ============================================
CREATE TABLE IF NOT EXISTS `folgen` (
  `folgen_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `folgender_benutzer_id` BIGINT UNSIGNED NOT NULL,
  `gefolgter_benutzer_id` BIGINT UNSIGNED NOT NULL,
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `entfolgt_am` DATETIME DEFAULT NULL,
  `aktiv_status` TINYINT(1) DEFAULT 1,
  `benachrichtigungen_aktiv` TINYINT(1) DEFAULT 1,
  PRIMARY KEY (`folgen_id`),
  UNIQUE KEY `unique_folgen` (`app_id`, `folgender_benutzer_id`, `gefolgter_benutzer_id`),
  KEY `idx_folgender` (`folgender_benutzer_id`),
  KEY `idx_gefolgter` (`gefolgter_benutzer_id`),
  KEY `idx_aktiv_status` (`aktiv_status`),
  CONSTRAINT `fk_folgen_folgender` FOREIGN KEY (`folgender_benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_folgen_gefolgter` FOREIGN KEY (`gefolgter_benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 18. BLOCKIERUNGEN (Blockings)
-- ============================================
CREATE TABLE IF NOT EXISTS `blockierungen` (
  `blockierung_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `blockierender_benutzer_id` BIGINT UNSIGNED NOT NULL,
  `blockierter_benutzer_id` BIGINT UNSIGNED NOT NULL,
  `aktion_typ` ENUM('blockiert', 'entblockt') NOT NULL,
  `aktion_zeitstempel` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `grund` VARCHAR(255) DEFAULT NULL,
  PRIMARY KEY (`blockierung_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_blockierender` (`blockierender_benutzer_id`),
  KEY `idx_blockierter` (`blockierter_benutzer_id`),
  KEY `idx_blockierung_lookup` (`blockierender_benutzer_id`, `blockierter_benutzer_id`, `aktion_typ`),
  KEY `idx_aktion_typ` (`aktion_typ`),
  CONSTRAINT `fk_blockierungen_blockierender` FOREIGN KEY (`blockierender_benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_blockierungen_blockierter` FOREIGN KEY (`blockierter_benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 19. REAKTIONEN (Message Reactions)
-- ============================================
CREATE TABLE IF NOT EXISTS `reaktionen` (
  `reaktion_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `nachrichten_id` BIGINT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `emoji_typ` VARCHAR(50) NOT NULL,
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `entfernt_am` DATETIME DEFAULT NULL,
  `aktiv_status` TINYINT(1) DEFAULT 1,
  PRIMARY KEY (`reaktion_id`),
  UNIQUE KEY `unique_reaktion` (`app_id`, `nachrichten_id`, `benutzer_id`, `emoji_typ`),
  KEY `idx_nachrichten_id` (`nachrichten_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_aktiv_status` (`aktiv_status`),
  CONSTRAINT `fk_reaktionen_nachricht` FOREIGN KEY (`nachrichten_id`) REFERENCES `nachrichten` (`nachrichten_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_reaktionen_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 20. MEDIEN_GALERIE (Media Gallery)
-- ============================================
CREATE TABLE IF NOT EXISTS `medien_galerie` (
  `medien_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `nachrichten_id` BIGINT UNSIGNED DEFAULT NULL,
  `chat_id` VARCHAR(255) DEFAULT NULL,
  `gruppen_id` BIGINT UNSIGNED DEFAULT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `medien_typ` ENUM('bild', 'video', 'audio', 'dokument', 'link') NOT NULL,
  `medien_url` VARCHAR(500) NOT NULL,
  `thumbnail_url` VARCHAR(500) DEFAULT NULL,
  `dateiname` VARCHAR(255) DEFAULT NULL,
  `dateigroesse` BIGINT UNSIGNED DEFAULT NULL,
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `geloescht_status` TINYINT(1) DEFAULT 0,
  `geloescht_am` DATETIME DEFAULT NULL,
  `wiederhergestellt_am` DATETIME DEFAULT NULL,
  `breite` INT UNSIGNED DEFAULT NULL,
  `hoehe` INT UNSIGNED DEFAULT NULL,
  `dauer` INT UNSIGNED DEFAULT NULL,
  PRIMARY KEY (`medien_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_nachrichten_id` (`nachrichten_id`),
  KEY `idx_chat_id` (`chat_id`),
  KEY `idx_gruppen_id` (`gruppen_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_geloescht_status` (`geloescht_status`),
  CONSTRAINT `fk_medien_galerie_nachricht` FOREIGN KEY (`nachrichten_id`) REFERENCES `nachrichten` (`nachrichten_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_medien_galerie_gruppe` FOREIGN KEY (`gruppen_id`) REFERENCES `gruppen` (`gruppen_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_medien_galerie_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 21. NACHRICHTEN_EINSTELLUNGEN (Message Settings)
-- ============================================
CREATE TABLE IF NOT EXISTS `nachrichten_einstellungen` (
  `einstellung_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `wer_kann_schreiben` ENUM('alle', 'kontakte', 'niemand', 'erlaubte_liste') DEFAULT 'alle',
  `nachrichten_limit` TINYINT(1) DEFAULT 0,
  `nachrichten_limit_anzahl` INT UNSIGNED DEFAULT 0,
  `posteingang_aktiv` TINYINT(1) DEFAULT 0,
  `automatisch_annehmen_nach` TINYINT(1) DEFAULT 0,
  `automatisch_annehmen_anzahl_nachrichten` INT UNSIGNED DEFAULT 0,
  `erlaubt_benutzer_ids_json` JSON DEFAULT NULL,
  `geaendert_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`einstellung_id`),
  UNIQUE KEY `unique_einstellungen` (`app_id`, `benutzer_id`),
  CONSTRAINT `fk_nachrichten_einstellungen_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 22. NACHRICHTEN_ANFRAGEN (Message Requests)
-- ============================================
CREATE TABLE IF NOT EXISTS `nachrichten_anfragen` (
  `anfrage_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `absender_id` BIGINT UNSIGNED NOT NULL,
  `empfaenger_id` BIGINT UNSIGNED NOT NULL,
  `nachrichten_id` BIGINT UNSIGNED DEFAULT NULL,
  `anfrage_status` ENUM('ausstehend', 'angenommen', 'abgelehnt', 'ignoriert') DEFAULT 'ausstehend',
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `angenommen_am` DATETIME DEFAULT NULL,
  `abgelehnt_am` DATETIME DEFAULT NULL,
  `ignoriert_am` DATETIME DEFAULT NULL,
  `wiederhergestellt_am` DATETIME DEFAULT NULL,
  `geaendert_am` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`anfrage_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_absender` (`absender_id`),
  KEY `idx_empfaenger` (`empfaenger_id`),
  KEY `idx_nachrichten_id` (`nachrichten_id`),
  KEY `idx_anfrage_status` (`anfrage_status`),
  CONSTRAINT `fk_nachrichten_anfragen_absender` FOREIGN KEY (`absender_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_nachrichten_anfragen_empfaenger` FOREIGN KEY (`empfaenger_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_nachrichten_anfragen_nachricht` FOREIGN KEY (`nachrichten_id`) REFERENCES `nachrichten` (`nachrichten_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 23. PROFIL_VORLIEBEN (Profile Preferences)
-- ============================================
CREATE TABLE IF NOT EXISTS `profil_vorlieben` (
  `vorliebe_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `vorliebe_typ` VARCHAR(100) NOT NULL,
  `vorliebe_wert` VARCHAR(255) NOT NULL,
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `entfernt_am` DATETIME DEFAULT NULL,
  `aktiv_status` TINYINT(1) DEFAULT 1,
  `sortierung_position` INT DEFAULT 0,
  PRIMARY KEY (`vorliebe_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_aktiv_status` (`aktiv_status`),
  CONSTRAINT `fk_profil_vorlieben_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 24. DATING_MATCHES
-- ============================================
CREATE TABLE IF NOT EXISTS `dating_matches` (
  `match_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `benutzer_1_id` BIGINT UNSIGNED NOT NULL,
  `benutzer_2_id` BIGINT UNSIGNED NOT NULL,
  `match_status` ENUM('neu', 'aktiv', 'unmatched', 'archiviert') DEFAULT 'neu',
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `geliked_von_benutzer_1_am` DATETIME DEFAULT NULL,
  `geliked_von_benutzer_2_am` DATETIME DEFAULT NULL,
  `super_like_benutzer_id` BIGINT UNSIGNED DEFAULT NULL,
  `super_like_am` DATETIME DEFAULT NULL,
  `unmatch_am` DATETIME DEFAULT NULL,
  `unmatch_von_benutzer_id` BIGINT UNSIGNED DEFAULT NULL,
  `aktiv_status` TINYINT(1) DEFAULT 1,
  `zuletzt_kommuniziert_am` DATETIME DEFAULT NULL,
  PRIMARY KEY (`match_id`),
  UNIQUE KEY `unique_match` (`app_id`, `benutzer_1_id`, `benutzer_2_id`),
  KEY `idx_benutzer_1` (`benutzer_1_id`),
  KEY `idx_benutzer_2` (`benutzer_2_id`),
  KEY `idx_aktiv_status` (`aktiv_status`),
  KEY `idx_match_status` (`match_status`),
  CONSTRAINT `fk_dating_matches_benutzer_1` FOREIGN KEY (`benutzer_1_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_dating_matches_benutzer_2` FOREIGN KEY (`benutzer_2_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_dating_matches_super_like` FOREIGN KEY (`super_like_benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE SET NULL,
  CONSTRAINT `fk_dating_matches_unmatch_von` FOREIGN KEY (`unmatch_von_benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 25. DATING_LIKES
-- ============================================
CREATE TABLE IF NOT EXISTS `dating_likes` (
  `like_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `client_like_id` VARCHAR(36) DEFAULT NULL,
  `app_id` INT UNSIGNED NOT NULL,
  `liker_benutzer_id` BIGINT UNSIGNED NOT NULL,
  `gelikter_benutzer_id` BIGINT UNSIGNED NOT NULL,
  `like_typ` ENUM('like', 'pass', 'super_like') DEFAULT 'like',
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `entfernt_am` DATETIME DEFAULT NULL,
  `aktiv_status` TINYINT(1) DEFAULT 1,
  PRIMARY KEY (`like_id`),
  UNIQUE KEY `idx_client_like_id` (`app_id`, `client_like_id`),
  UNIQUE KEY `unique_dating_like` (`app_id`, `liker_benutzer_id`, `gelikter_benutzer_id`),
  KEY `idx_liker` (`liker_benutzer_id`),
  KEY `idx_gelikter` (`gelikter_benutzer_id`),
  KEY `idx_like_typ` (`like_typ`),
  KEY `idx_aktiv_status` (`aktiv_status`),
  CONSTRAINT `fk_dating_likes_liker` FOREIGN KEY (`liker_benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_dating_likes_gelikter` FOREIGN KEY (`gelikter_benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 26. DATING_EINSTELLUNGEN (Dating Settings)
-- ============================================
CREATE TABLE IF NOT EXISTS `dating_einstellungen` (
  `einstellung_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `suchradius_km` INT UNSIGNED DEFAULT 50,
  `altersbereich_min` INT UNSIGNED DEFAULT 18,
  `altersbereich_max` INT UNSIGNED DEFAULT 99,
  `gesuchtes_geschlecht` ENUM('m', 'w', 'd', 'alle') DEFAULT 'alle',
  `gesuchte_geschlecht_orientierung` VARCHAR(50) DEFAULT NULL,
  `nur_verifiziert` TINYINT(1) DEFAULT 0,
  `nur_mit_fotos` TINYINT(1) DEFAULT 1,
  `geaendert_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`einstellung_id`),
  UNIQUE KEY `unique_dating_einstellungen` (`app_id`, `benutzer_id`),
  CONSTRAINT `fk_dating_einstellungen_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 27. DATING_GESEHEN (Dating Seen)
-- ============================================
CREATE TABLE IF NOT EXISTS `dating_gesehen` (
  `gesehen_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `seher_benutzer_id` BIGINT UNSIGNED NOT NULL,
  `gesehener_benutzer_id` BIGINT UNSIGNED NOT NULL,
  `gesehen_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `geloescht_status` TINYINT(1) DEFAULT 0,
  `geloescht_am` DATETIME DEFAULT NULL,
  `wiederhergestellt_am` DATETIME DEFAULT NULL,
  PRIMARY KEY (`gesehen_id`),
  UNIQUE KEY `unique_gesehen` (`app_id`, `seher_benutzer_id`, `gesehener_benutzer_id`),
  KEY `idx_seher` (`seher_benutzer_id`),
  KEY `idx_gesehener` (`gesehener_benutzer_id`),
  KEY `idx_geloescht_status` (`geloescht_status`),
  CONSTRAINT `fk_dating_gesehen_seher` FOREIGN KEY (`seher_benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_dating_gesehen_gesehener` FOREIGN KEY (`gesehener_benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 28. DATING_BOOST
-- ============================================
CREATE TABLE IF NOT EXISTS `dating_boost` (
  `boost_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `boost_start_am` DATETIME NOT NULL,
  `boost_end_am` DATETIME NOT NULL,
  `boost_typ` ENUM('standard', 'premium', 'super') DEFAULT 'standard',
  `aktiv_status` TINYINT(1) DEFAULT 1,
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`boost_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_boost_zeitraum` (`boost_start_am`, `boost_end_am`),
  KEY `idx_aktiv_status` (`aktiv_status`),
  CONSTRAINT `fk_dating_boost_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 29. POST_EMBEDDINGS (Post Embeddings/Vectors for Recommendations)
-- ============================================
CREATE TABLE IF NOT EXISTS `post_embeddings` (
  `embedding_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `post_id` BIGINT UNSIGNED NOT NULL,
  `embedding_typ` ENUM('video', 'bild', 'text', 'audio', 'gemischt') NOT NULL,
  `algo_name` VARCHAR(100) NOT NULL,
  `vector_db_id` VARCHAR(255) NOT NULL,
  `vector_db_name` ENUM('pinecone', 'weaviate', 'qdrant', 'milvus', 'chroma', 'custom') DEFAULT 'pinecone',
  `vektor_dimension` INT UNSIGNED NOT NULL,
  `metadaten_json` JSON DEFAULT NULL,
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `aktualisiert_am` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`embedding_id`),
  UNIQUE KEY `unique_post_embedding` (`app_id`, `post_id`, `embedding_typ`, `algo_name`),
  UNIQUE KEY `unique_vector_db_id` (`app_id`, `vector_db_name`, `vector_db_id`),
  KEY `idx_post_id` (`post_id`),
  KEY `idx_embedding_typ` (`embedding_typ`),
  KEY `idx_algo_name` (`algo_name`),
  KEY `idx_vector_db_id` (`vector_db_id`),
  KEY `idx_vector_db_name` (`vector_db_name`),
  CONSTRAINT `fk_post_embeddings_post` FOREIGN KEY (`post_id`) REFERENCES `posts` (`post_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 30. FREUNDE (Friends - separate from Follow)
-- ============================================
CREATE TABLE IF NOT EXISTS `freunde` (
  `freundschaft_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `client_freundschaft_id` VARCHAR(36) DEFAULT NULL,
  `app_id` INT UNSIGNED NOT NULL,
  `benutzer_1_id` BIGINT UNSIGNED NOT NULL,
  `benutzer_2_id` BIGINT UNSIGNED NOT NULL,
  `freundschaft_status` ENUM('ausstehend', 'angenommen', 'abgelehnt', 'entfernt') DEFAULT 'ausstehend',
  `anfrage_von_benutzer_id` BIGINT UNSIGNED NOT NULL,
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `angenommen_am` DATETIME DEFAULT NULL,
  `abgelehnt_am` DATETIME DEFAULT NULL,
  `entfernt_am` DATETIME DEFAULT NULL,
  `entfernt_von_benutzer_id` BIGINT UNSIGNED DEFAULT NULL,
  PRIMARY KEY (`freundschaft_id`),
  UNIQUE KEY `idx_client_freundschaft_id` (`app_id`, `client_freundschaft_id`),
  UNIQUE KEY `unique_freundschaft` (`app_id`, `benutzer_1_id`, `benutzer_2_id`),
  KEY `idx_benutzer_1` (`benutzer_1_id`),
  KEY `idx_benutzer_2` (`benutzer_2_id`),
  KEY `idx_freundschaft_status` (`freundschaft_status`),
  KEY `idx_anfrage_von` (`anfrage_von_benutzer_id`),
  CONSTRAINT `fk_freunde_benutzer_1` FOREIGN KEY (`benutzer_1_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_freunde_benutzer_2` FOREIGN KEY (`benutzer_2_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_freunde_anfrage_von` FOREIGN KEY (`anfrage_von_benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_freunde_entfernt_von` FOREIGN KEY (`entfernt_von_benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 31. LIVESTREAMS
-- ============================================
CREATE TABLE IF NOT EXISTS `livestreams` (
  `livestream_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `streamer_id` BIGINT UNSIGNED NOT NULL,
  `stream_titel` VARCHAR(255) DEFAULT NULL,
  `stream_beschreibung` TEXT DEFAULT NULL,
  `stream_thumbnail_url` VARCHAR(500) DEFAULT NULL,
  `stream_url` VARCHAR(500) NOT NULL,
  `rtmp_url` VARCHAR(500) DEFAULT NULL,
  `stream_key` VARCHAR(255) DEFAULT NULL,
  `gestartet_am` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
  `beendet_am` DATETIME(6) DEFAULT NULL,
  `stream_status` ENUM('vorbereitung', 'live', 'beendet', 'pausiert', 'abgebrochen') DEFAULT 'vorbereitung',
  `sichtbarkeit_status` ENUM('oeffentlich', 'freunde', 'privat') DEFAULT 'oeffentlich',
  `zuschauer_anzahl` INT UNSIGNED DEFAULT 0,
  `likes_anzahl` INT UNSIGNED DEFAULT 0,
  `kommentare_anzahl` INT UNSIGNED DEFAULT 0,
  `geschenke_anzahl` INT UNSIGNED DEFAULT 0,
  `aufzeichnung_aktiv` TINYINT(1) DEFAULT 0,
  `geloescht_status` TINYINT(1) DEFAULT 0,
  `geloescht_am` DATETIME(6) DEFAULT NULL,
  `metadaten_json` JSON DEFAULT NULL,
  PRIMARY KEY (`livestream_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_streamer_id` (`streamer_id`),
  KEY `idx_stream_status` (`stream_status`),
  KEY `idx_gestartet_am` (`gestartet_am`),
  KEY `idx_geloescht_status` (`geloescht_status`),
  CONSTRAINT `fk_livestreams_streamer` FOREIGN KEY (`streamer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 32. LIVESTREAM_KOMMENTARE (Live Stream Comments)
-- ============================================
CREATE TABLE IF NOT EXISTS `livestream_kommentare` (
  `kommentar_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `client_kommentar_id` VARCHAR(36) DEFAULT NULL,
  `app_id` INT UNSIGNED NOT NULL,
  `livestream_id` BIGINT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `kommentar_text` TEXT NOT NULL,
  `erstellt_am` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
  `sekunden_seit_stream_start` INT UNSIGNED DEFAULT NULL,
  `geloescht_status` TINYINT(1) DEFAULT 0,
  `geloescht_am` DATETIME(6) DEFAULT NULL,
  `pin_status` TINYINT(1) DEFAULT 0,
  `gepinnt_am` DATETIME(6) DEFAULT NULL,
  PRIMARY KEY (`kommentar_id`),
  UNIQUE KEY `idx_client_livestream_kommentar_id` (`app_id`, `client_kommentar_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_livestream_id` (`livestream_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_erstellt_am` (`erstellt_am`),
  KEY `idx_sekunden_seit_start` (`sekunden_seit_stream_start`),
  KEY `idx_geloescht_status` (`geloescht_status`),
  KEY `idx_pin_status` (`pin_status`),
  CONSTRAINT `fk_livestream_kommentare_stream` FOREIGN KEY (`livestream_id`) REFERENCES `livestreams` (`livestream_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_livestream_kommentare_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 33. LIVESTREAM_MODERATOREN (Live Stream Moderators)
-- ============================================
CREATE TABLE IF NOT EXISTS `livestream_moderatoren` (
  `moderator_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `livestream_id` BIGINT UNSIGNED NOT NULL,
  `moderator_benutzer_id` BIGINT UNSIGNED NOT NULL,
  `ernannt_von_benutzer_id` BIGINT UNSIGNED NOT NULL,
  `ernannt_am` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
  `entfernt_am` DATETIME(6) DEFAULT NULL,
  `aktiv_status` TINYINT(1) DEFAULT 1,
  `rechte_json` JSON DEFAULT NULL,
  PRIMARY KEY (`moderator_id`),
  UNIQUE KEY `unique_moderator` (`app_id`, `livestream_id`, `moderator_benutzer_id`),
  KEY `idx_livestream_id` (`livestream_id`),
  KEY `idx_moderator_benutzer_id` (`moderator_benutzer_id`),
  KEY `idx_aktiv_status` (`aktiv_status`),
  CONSTRAINT `fk_livestream_moderatoren_stream` FOREIGN KEY (`livestream_id`) REFERENCES `livestreams` (`livestream_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_livestream_moderatoren_moderator` FOREIGN KEY (`moderator_benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_livestream_moderatoren_ernannt_von` FOREIGN KEY (`ernannt_von_benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 34. LIVESTREAM_ZUSCHAUER (Live Stream Viewers)
-- ============================================
CREATE TABLE IF NOT EXISTS `livestream_zuschauer` (
  `zuschauer_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `livestream_id` BIGINT UNSIGNED NOT NULL,
  `zuschauer_benutzer_id` BIGINT UNSIGNED NOT NULL,
  `beigetreten_am` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
  `verlassen_am` DATETIME(6) DEFAULT NULL,
  `aktiv_status` TINYINT(1) DEFAULT 1,
  PRIMARY KEY (`zuschauer_id`),
  KEY `idx_livestream_id` (`livestream_id`),
  KEY `idx_zuschauer_benutzer_id` (`zuschauer_benutzer_id`),
  KEY `idx_aktiv_status` (`aktiv_status`),
  KEY `idx_beigetreten_am` (`beigetreten_am`),
  CONSTRAINT `fk_livestream_zuschauer_stream` FOREIGN KEY (`livestream_id`) REFERENCES `livestreams` (`livestream_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_livestream_zuschauer_benutzer` FOREIGN KEY (`zuschauer_benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 35. LIVESTREAM_LIKES (Live Stream Likes)
-- ============================================
CREATE TABLE IF NOT EXISTS `livestream_likes` (
  `like_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `livestream_id` BIGINT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `erstellt_am` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
  `entfernt_am` DATETIME(6) DEFAULT NULL,
  `aktiv_status` TINYINT(1) DEFAULT 1,
  PRIMARY KEY (`like_id`),
  UNIQUE KEY `unique_livestream_like` (`app_id`, `livestream_id`, `benutzer_id`, `aktiv_status`),
  KEY `idx_livestream_id` (`livestream_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_aktiv_status` (`aktiv_status`),
  CONSTRAINT `fk_livestream_likes_stream` FOREIGN KEY (`livestream_id`) REFERENCES `livestreams` (`livestream_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_livestream_likes_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 36. LIVESTREAM_GESCHENKE (Live Stream Gifts)
-- ============================================
CREATE TABLE IF NOT EXISTS `livestream_geschenke` (
  `geschenk_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `livestream_id` BIGINT UNSIGNED NOT NULL,
  `sender_id` BIGINT UNSIGNED NOT NULL,
  `geschenk_typ` VARCHAR(100) NOT NULL,
  `geschenk_name` VARCHAR(255) DEFAULT NULL,
  `geschenk_icon_url` VARCHAR(500) DEFAULT NULL,
  `geschenk_wert` DECIMAL(10, 2) DEFAULT NULL,
  `erstellt_am` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
  PRIMARY KEY (`geschenk_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_livestream_id` (`livestream_id`),
  KEY `idx_sender_id` (`sender_id`),
  KEY `idx_erstellt_am` (`erstellt_am`),
  CONSTRAINT `fk_livestream_geschenke_stream` FOREIGN KEY (`livestream_id`) REFERENCES `livestreams` (`livestream_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_livestream_geschenke_sender` FOREIGN KEY (`sender_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 37. LIVESTREAM_AUFZEICHNUNGEN (Live Stream Recordings)
-- ============================================
CREATE TABLE IF NOT EXISTS `livestream_aufzeichnungen` (
  `aufzeichnung_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `livestream_id` BIGINT UNSIGNED NOT NULL,
  `video_url` VARCHAR(500) NOT NULL,
  `thumbnail_url` VARCHAR(500) DEFAULT NULL,
  `dauer_sekunden` INT UNSIGNED DEFAULT NULL,
  `dateigroesse` BIGINT UNSIGNED DEFAULT NULL,
  `aufgezeichnet_am` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
  `verarbeitet_status` TINYINT(1) DEFAULT 0,
  `verarbeitet_am` DATETIME(6) DEFAULT NULL,
  `geloescht_status` TINYINT(1) DEFAULT 0,
  `geloescht_am` DATETIME(6) DEFAULT NULL,
  `metadaten_json` JSON DEFAULT NULL,
  PRIMARY KEY (`aufzeichnung_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_livestream_id` (`livestream_id`),
  KEY `idx_verarbeitet_status` (`verarbeitet_status`),
  KEY `idx_geloescht_status` (`geloescht_status`),
  CONSTRAINT `fk_livestream_aufzeichnungen_stream` FOREIGN KEY (`livestream_id`) REFERENCES `livestreams` (`livestream_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 38. ANRUFE (Calls - Video & Audio)
-- ============================================
CREATE TABLE IF NOT EXISTS `anrufe` (
  `anruf_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `client_call_id` VARCHAR(36) DEFAULT NULL,
  `app_id` INT UNSIGNED NOT NULL,
  `anrufer_id` BIGINT UNSIGNED NOT NULL,
  `empfaenger_id` BIGINT UNSIGNED DEFAULT NULL,
  `gruppen_id` BIGINT UNSIGNED DEFAULT NULL,
  `anruf_typ` ENUM('video', 'audio') NOT NULL,
  `anruf_status` ENUM('eingehend', 'angenommen', 'abgelehnt', 'verpasst', 'beendet', 'abgebrochen') DEFAULT 'eingehend',
  `gestartet_am` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
  `angenommen_am` DATETIME(6) DEFAULT NULL,
  `beendet_am` DATETIME(6) DEFAULT NULL,
  `dauer_sekunden` INT UNSIGNED DEFAULT NULL,
  `aufzeichnung_aktiv` TINYINT(1) DEFAULT 0,
  `webrtc_session_id` VARCHAR(255) DEFAULT NULL,
  `signaling_server_url` VARCHAR(500) DEFAULT NULL,
  `metadaten_json` JSON DEFAULT NULL,
  PRIMARY KEY (`anruf_id`),
  UNIQUE KEY `idx_client_call_id` (`app_id`, `client_call_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_anrufer_id` (`anrufer_id`),
  KEY `idx_empfaenger_id` (`empfaenger_id`),
  KEY `idx_gruppen_id` (`gruppen_id`),
  KEY `idx_anruf_status` (`anruf_status`),
  KEY `idx_gestartet_am` (`gestartet_am`),
  CONSTRAINT `fk_anrufe_anrufer` FOREIGN KEY (`anrufer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_anrufe_empfaenger` FOREIGN KEY (`empfaenger_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_anrufe_gruppe` FOREIGN KEY (`gruppen_id`) REFERENCES `gruppen` (`gruppen_id`) ON DELETE CASCADE,
  CONSTRAINT `chk_anruf_ziel` CHECK ((`empfaenger_id` IS NOT NULL AND `gruppen_id` IS NULL) OR (`empfaenger_id` IS NULL AND `gruppen_id` IS NOT NULL))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 39. ANRUF_TEILNEHMER (Call Participants)
-- ============================================
CREATE TABLE IF NOT EXISTS `anruf_teilnehmer` (
  `teilnehmer_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `anruf_id` BIGINT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `beigetreten_am` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
  `verlassen_am` DATETIME(6) DEFAULT NULL,
  `teilnehmer_status` ENUM('eingeladen', 'beigetreten', 'verlassen', 'abgelehnt') DEFAULT 'eingeladen',
  `mikrofon_aktiv` TINYINT(1) DEFAULT 1,
  `kamera_aktiv` TINYINT(1) DEFAULT 1,
  PRIMARY KEY (`teilnehmer_id`),
  KEY `idx_anruf_id` (`anruf_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_teilnehmer_status` (`teilnehmer_status`),
  CONSTRAINT `fk_anruf_teilnehmer_anruf` FOREIGN KEY (`anruf_id`) REFERENCES `anrufe` (`anruf_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_anruf_teilnehmer_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 40. ANRUF_AUFZEICHNUNGEN (Call Recordings)
-- ============================================
CREATE TABLE IF NOT EXISTS `anruf_aufzeichnungen` (
  `aufzeichnung_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `anruf_id` BIGINT UNSIGNED NOT NULL,
  `video_url` VARCHAR(500) DEFAULT NULL,
  `audio_url` VARCHAR(500) DEFAULT NULL,
  `thumbnail_url` VARCHAR(500) DEFAULT NULL,
  `dauer_sekunden` INT UNSIGNED DEFAULT NULL,
  `dateigroesse` BIGINT UNSIGNED DEFAULT NULL,
  `aufgezeichnet_am` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
  `verarbeitet_status` TINYINT(1) DEFAULT 0,
  `verarbeitet_am` DATETIME(6) DEFAULT NULL,
  `geloescht_status` TINYINT(1) DEFAULT 0,
  `geloescht_am` DATETIME(6) DEFAULT NULL,
  `metadaten_json` JSON DEFAULT NULL,
  PRIMARY KEY (`aufzeichnung_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_anruf_id` (`anruf_id`),
  KEY `idx_verarbeitet_status` (`verarbeitet_status`),
  KEY `idx_geloescht_status` (`geloescht_status`),
  CONSTRAINT `fk_anruf_aufzeichnungen_anruf` FOREIGN KEY (`anruf_id`) REFERENCES `anrufe` (`anruf_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 41. ABSTIMMUNGEN (Polls/Votes in Messages)
-- ============================================
CREATE TABLE IF NOT EXISTS `abstimmungen` (
  `abstimmung_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `nachrichten_id` BIGINT UNSIGNED NOT NULL,
  `abstimmung_frage` TEXT NOT NULL,
  `abstimmung_optionen_json` JSON NOT NULL,
  `abstimmung_typ` ENUM('einfach', 'mehrfach') DEFAULT 'einfach',
  `abstimmung_anonym` TINYINT(1) DEFAULT 0,
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `abgelaufen_am` DATETIME DEFAULT NULL,
  `geloescht_status` TINYINT(1) DEFAULT 0,
  `geloescht_am` DATETIME DEFAULT NULL,
  PRIMARY KEY (`abstimmung_id`),
  UNIQUE KEY `unique_abstimmung_nachricht` (`nachrichten_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_nachrichten_id` (`nachrichten_id`),
  KEY `idx_abgelaufen_am` (`abgelaufen_am`),
  KEY `idx_geloescht_status` (`geloescht_status`),
  CONSTRAINT `fk_abstimmungen_nachricht` FOREIGN KEY (`nachrichten_id`) REFERENCES `nachrichten` (`nachrichten_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 42. ABSTIMMUNG_STIMMEN (Poll Votes)
-- ============================================
CREATE TABLE IF NOT EXISTS `abstimmung_stimmen` (
  `stimme_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `abstimmung_id` BIGINT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `gewaehlte_option` INT UNSIGNED NOT NULL,
  `abgegeben_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `geaendert_am` DATETIME DEFAULT NULL,
  PRIMARY KEY (`stimme_id`),
  UNIQUE KEY `unique_abstimmung_stimme` (`app_id`, `abstimmung_id`, `benutzer_id`),
  KEY `idx_abstimmung_id` (`abstimmung_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_abgegeben_am` (`abgegeben_am`),
  CONSTRAINT `fk_abstimmung_stimmen_abstimmung` FOREIGN KEY (`abstimmung_id`) REFERENCES `abstimmungen` (`abstimmung_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_abstimmung_stimmen_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 43. AUDIO_BIBLIOTHEK (Audio Library - Music Tracks)
-- ============================================
CREATE TABLE IF NOT EXISTS `audio_bibliothek` (
  `audio_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `uploader_id` BIGINT UNSIGNED NOT NULL,
  `titel` VARCHAR(255) NOT NULL,
  `artist` VARCHAR(255) DEFAULT NULL,
  `album` VARCHAR(255) DEFAULT NULL,
  `audio_url` VARCHAR(500) NOT NULL,
  `thumbnail_url` VARCHAR(500) DEFAULT NULL,
  `dauer_sekunden` INT UNSIGNED DEFAULT NULL,
  `dateigroesse` BIGINT UNSIGNED DEFAULT NULL,
  `audio_format` VARCHAR(50) DEFAULT NULL,
  `lied_datum` DATE DEFAULT NULL,
  `upload_datum` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `genre` VARCHAR(100) DEFAULT NULL,
  `beschreibung` TEXT DEFAULT NULL,
  `verwendungen_anzahl` INT UNSIGNED DEFAULT 0,
  `likes_anzahl` INT UNSIGNED DEFAULT 0,
  `geloescht_status` TINYINT(1) DEFAULT 0,
  `geloescht_am` DATETIME DEFAULT NULL,
  `metadaten_json` JSON DEFAULT NULL,
  PRIMARY KEY (`audio_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_uploader_id` (`uploader_id`),
  KEY `idx_titel` (`titel`),
  KEY `idx_artist` (`artist`),
  KEY `idx_genre` (`genre`),
  KEY `idx_upload_datum` (`upload_datum`),
  KEY `idx_lied_datum` (`lied_datum`),
  KEY `idx_geloescht_status` (`geloescht_status`),
  CONSTRAINT `fk_audio_bibliothek_uploader` FOREIGN KEY (`uploader_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 44. POST_AUDIO_VERWENDUNGEN (Post Audio Usage)
-- ============================================
CREATE TABLE IF NOT EXISTS `post_audio_verwendungen` (
  `verwendung_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `post_id` BIGINT UNSIGNED NOT NULL,
  `audio_id` BIGINT UNSIGNED NOT NULL,
  `start_sekunde` INT UNSIGNED DEFAULT 0,
  `dauer_sekunden` INT UNSIGNED DEFAULT NULL,
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`verwendung_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_post_id` (`post_id`),
  KEY `idx_audio_id` (`audio_id`),
  CONSTRAINT `fk_post_audio_verwendungen_post` FOREIGN KEY (`post_id`) REFERENCES `posts` (`post_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_post_audio_verwendungen_audio` FOREIGN KEY (`audio_id`) REFERENCES `audio_bibliothek` (`audio_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 45. LIVE_STANDORTE (Live Locations in Messages)
-- ============================================
CREATE TABLE IF NOT EXISTS `live_standorte` (
  `standort_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `nachrichten_id` BIGINT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `latitude` DECIMAL(10, 8) NOT NULL,
  `longitude` DECIMAL(11, 8) NOT NULL,
  `genauigkeit` DECIMAL(10, 2) DEFAULT NULL,
  `gestartet_am` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
  `abgelaufen_am` DATETIME(6) NOT NULL,
  `aktualisiert_am` DATETIME(6) DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(6),
  `aktiv_status` TINYINT(1) DEFAULT 1,
  PRIMARY KEY (`standort_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_nachrichten_id` (`nachrichten_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_aktiv_status` (`aktiv_status`),
  KEY `idx_abgelaufen_am` (`abgelaufen_am`),
  CONSTRAINT `fk_live_standorte_nachricht` FOREIGN KEY (`nachrichten_id`) REFERENCES `nachrichten` (`nachrichten_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_live_standorte_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- 46. FCM_TOKENS (Firebase Cloud Messaging Tokens)
-- ============================================
CREATE TABLE IF NOT EXISTS `fcm_tokens` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `fcm_token` VARCHAR(255) NOT NULL,
  `platform` VARCHAR(50) DEFAULT 'unknown',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_user_token` (`benutzer_id`, `fcm_token`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_updated_at` (`updated_at`),
  CONSTRAINT `fk_fcm_tokens_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- ERWEITERUNGEN: Pins, Wiedergabelisten, Mentions, Story-Views, etc.
-- ============================================

-- Gruppen: angeheftete Nachricht + angehefteter Post (FK nach CREATE von nachrichten/posts)
ALTER TABLE `gruppen`
  ADD COLUMN `angeheftete_nachricht_id` BIGINT UNSIGNED DEFAULT NULL AFTER `gruppen_einstellungen_json`,
  ADD COLUMN `angehefteter_post_id` BIGINT UNSIGNED DEFAULT NULL AFTER `angeheftete_nachricht_id`,
  ADD KEY `idx_angeheftete_nachricht` (`angeheftete_nachricht_id`),
  ADD KEY `idx_angehefteter_post` (`angehefteter_post_id`),
  ADD CONSTRAINT `fk_gruppen_angeheftete_nachricht` FOREIGN KEY (`angeheftete_nachricht_id`) REFERENCES `nachrichten` (`nachrichten_id`) ON DELETE SET NULL,
  ADD CONSTRAINT `fk_gruppen_angehefteter_post` FOREIGN KEY (`angehefteter_post_id`) REFERENCES `posts` (`post_id`) ON DELETE SET NULL;

-- 47. ERWAEHNUNGEN (Mentions in Posts, Kommentaren, Nachrichten)
CREATE TABLE IF NOT EXISTS `erwaehnungen` (
  `erwaehnung_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `post_id` BIGINT UNSIGNED DEFAULT NULL,
  `kommentar_id` BIGINT UNSIGNED DEFAULT NULL,
  `nachrichten_id` BIGINT UNSIGNED DEFAULT NULL,
  `erwaehnter_benutzer_id` BIGINT UNSIGNED NOT NULL,
  `erwaehnt_von_benutzer_id` BIGINT UNSIGNED NOT NULL,
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`erwaehnung_id`),
  KEY `idx_app_id` (`app_id`),
  KEY `idx_post_id` (`post_id`),
  KEY `idx_kommentar_id` (`kommentar_id`),
  KEY `idx_nachrichten_id` (`nachrichten_id`),
  KEY `idx_erwaehnter_benutzer` (`erwaehnter_benutzer_id`),
  KEY `idx_erwaehnt_von` (`erwaehnt_von_benutzer_id`),
  CONSTRAINT `fk_erwaehnungen_post` FOREIGN KEY (`post_id`) REFERENCES `posts` (`post_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_erwaehnungen_kommentar` FOREIGN KEY (`kommentar_id`) REFERENCES `post_kommentare` (`kommentar_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_erwaehnungen_nachricht` FOREIGN KEY (`nachrichten_id`) REFERENCES `nachrichten` (`nachrichten_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_erwaehnungen_erwaehnter` FOREIGN KEY (`erwaehnter_benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_erwaehnungen_von` FOREIGN KEY (`erwaehnt_von_benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `chk_erwaehnung_kontext` CHECK (
    (`post_id` IS NOT NULL AND `kommentar_id` IS NULL AND `nachrichten_id` IS NULL) OR
    (`post_id` IS NULL AND `kommentar_id` IS NOT NULL AND `nachrichten_id` IS NULL) OR
    (`post_id` IS NULL AND `kommentar_id` IS NULL AND `nachrichten_id` IS NOT NULL)
  )
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 48. POST_HASHTAGS (Many-to-Many: Posts <-> Hashtags)
CREATE TABLE IF NOT EXISTS `post_hashtags` (
  `post_hashtag_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `post_id` BIGINT UNSIGNED NOT NULL,
  `hashtag_id` BIGINT UNSIGNED NOT NULL,
  `erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`post_hashtag_id`),
  UNIQUE KEY `unique_post_hashtag` (`app_id`, `post_id`, `hashtag_id`),
  KEY `idx_post_id` (`post_id`),
  KEY `idx_hashtag_id` (`hashtag_id`),
  CONSTRAINT `fk_post_hashtags_post` FOREIGN KEY (`post_id`) REFERENCES `posts` (`post_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_post_hashtags_hashtag` FOREIGN KEY (`hashtag_id`) REFERENCES `hashtags` (`hashtag_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 49. STORY_ANSICHTEN (Story Views pro User)
CREATE TABLE IF NOT EXISTS `story_ansichten` (
  `ansicht_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `story_id` BIGINT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `angesehen_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`ansicht_id`),
  UNIQUE KEY `unique_story_benutzer` (`app_id`, `story_id`, `benutzer_id`),
  KEY `idx_story_id` (`story_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_angesehen_am` (`angesehen_am`),
  CONSTRAINT `fk_story_ansichten_story` FOREIGN KEY (`story_id`) REFERENCES `stories` (`story_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_story_ansichten_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 50. PROFIL_GEPINNTE_POSTS (Angeheftete Posts auf dem Profil)
CREATE TABLE IF NOT EXISTS `profil_gepinnte_posts` (
  `gepinnt_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` INT UNSIGNED NOT NULL,
  `benutzer_id` BIGINT UNSIGNED NOT NULL,
  `post_id` BIGINT UNSIGNED NOT NULL,
  `sortierung_position` INT DEFAULT 0,
  `angeheftet_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`gepinnt_id`),
  UNIQUE KEY `unique_profil_gepinnt_post` (`app_id`, `benutzer_id`, `post_id`),
  KEY `idx_benutzer_id` (`benutzer_id`),
  KEY `idx_post_id` (`post_id`),
  CONSTRAINT `fk_profil_gepinnte_posts_benutzer` FOREIGN KEY (`benutzer_id`) REFERENCES `profil` (`benutzer_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_profil_gepinnte_posts_post` FOREIGN KEY (`post_id`) REFERENCES `posts` (`post_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- ENDE DER TABELLEN
-- ============================================

