-- DuygularNet (Pulse) - Production Database Schema
-- MySQL / MariaDB compatible SQL file.
-- Import this file into your phpMyAdmin or MySQL server to prepare the production database.

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";

-- --------------------------------------------------------
-- Table structure for table `users`
-- --------------------------------------------------------
CREATE TABLE IF NOT EXISTS `users` (
  `username` varchar(255) NOT NULL,
  `name` varchar(255) NOT NULL,
  `email` varchar(255) DEFAULT NULL,
  `avatarUrl` varchar(500) DEFAULT NULL,
  `coverUrl` varchar(500) DEFAULT NULL,
  `bio` text DEFAULT NULL,
  `isVerified` tinyint(1) NOT NULL DEFAULT 0,
  `isVip` tinyint(1) NOT NULL DEFAULT 0,
  `vipExpireTimestamp` bigint(20) NOT NULL DEFAULT 0,
  `privacy` varchar(50) NOT NULL DEFAULT 'PUBLIC',
  `joinTimestamp` bigint(20) NOT NULL DEFAULT 0,
  `ipAddress` varchar(100) DEFAULT '127.0.0.1',
  `status` varchar(50) NOT NULL DEFAULT 'Active', -- 'Active', 'Suspended'
  PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------
-- Table structure for table `posts`
-- --------------------------------------------------------
CREATE TABLE IF NOT EXISTS `posts` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `authorName` varchar(255) NOT NULL,
  `authorUsername` varchar(255) NOT NULL,
  `authorAvatarUrl` varchar(500) NOT NULL,
  `isVerified` tinyint(1) NOT NULL DEFAULT 0,
  `text` text NOT NULL,
  `timestamp` bigint(20) NOT NULL,
  `likesCount` int(11) NOT NULL DEFAULT 0,
  `commentsCount` int(11) NOT NULL DEFAULT 0,
  `repostsCount` int(11) NOT NULL DEFAULT 0,
  `isLiked` tinyint(1) NOT NULL DEFAULT 0,
  `isReposted` tinyint(1) NOT NULL DEFAULT 0,
  `isBookmarked` tinyint(1) NOT NULL DEFAULT 0,
  `imageUri` varchar(500) DEFAULT NULL,
  `imageCount` int(11) NOT NULL DEFAULT 0,
  `linkTitle` varchar(500) DEFAULT NULL,
  `linkUrl` varchar(500) DEFAULT NULL,
  `linkImage` varchar(500) DEFAULT NULL,
  `pollQuestion` varchar(500) DEFAULT NULL,
  `pollOption1` varchar(255) DEFAULT NULL,
  `pollOption2` varchar(255) DEFAULT NULL,
  `pollVotes1` int(11) NOT NULL DEFAULT 0,
  `pollVotes2` int(11) NOT NULL DEFAULT 0,
  `userVotedOption` int(11) DEFAULT NULL,
  `location` varchar(255) DEFAULT NULL,
  `isSpamOrReported` tinyint(1) NOT NULL DEFAULT 0,
  `reportsCount` int(11) NOT NULL DEFAULT 0,
  `visibility` varchar(50) NOT NULL DEFAULT 'EVERYONE',
  `commentsEnabled` tinyint(1) NOT NULL DEFAULT 1,
  `viewsCount` int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  KEY `authorUsername` (`authorUsername`),
  FULLTEXT KEY `text_fulltext` (`text`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------
-- Table structure for table `comments`
-- --------------------------------------------------------
CREATE TABLE IF NOT EXISTS `comments` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `postId` bigint(20) NOT NULL,
  `authorName` varchar(255) NOT NULL,
  `authorUsername` varchar(255) NOT NULL,
  `authorAvatarUrl` varchar(500) NOT NULL,
  `text` text NOT NULL,
  `timestamp` bigint(20) NOT NULL,
  `likesCount` int(11) NOT NULL DEFAULT 0,
  `isLiked` tinyint(1) NOT NULL DEFAULT 0,
  `parentId` bigint(20) DEFAULT NULL,
  `isReported` tinyint(1) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  KEY `postId` (`postId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------
-- Table structure for table `messages`
-- --------------------------------------------------------
CREATE TABLE IF NOT EXISTS `messages` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `senderId` varchar(255) NOT NULL,
  `senderName` varchar(255) NOT NULL,
  `text` text NOT NULL,
  `imageUri` varchar(500) DEFAULT NULL,
  `audioUri` varchar(500) DEFAULT NULL,
  `timestamp` bigint(20) NOT NULL,
  `isRead` tinyint(1) NOT NULL DEFAULT 0,
  `isEdited` tinyint(1) NOT NULL DEFAULT 0,
  `deletedByUser` tinyint(1) NOT NULL DEFAULT 0,
  `recipientUsername` varchar(255) NOT NULL DEFAULT 'cerenkaya_ux',
  `replyToId` bigint(20) DEFAULT NULL,
  `replyToText` text DEFAULT NULL,
  `replyToSenderName` varchar(255) DEFAULT NULL,
  `reactions` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------
-- Table structure for table `hashtags`
-- --------------------------------------------------------
CREATE TABLE IF NOT EXISTS `hashtags` (
  `hashtag` varchar(255) NOT NULL,
  `postsCount` int(11) NOT NULL DEFAULT 1,
  PRIMARY KEY (`hashtag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------
-- Table structure for table `banned_items`
-- --------------------------------------------------------
CREATE TABLE IF NOT EXISTS `banned_items` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `type` varchar(50) NOT NULL, -- 'WORD', 'USERNAME', 'EMAIL'
  `value` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `type_value` (`type`, `value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------
-- Table structure for table `audit_logs`
-- --------------------------------------------------------
CREATE TABLE IF NOT EXISTS `audit_logs` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `moderatorUsername` varchar(255) NOT NULL DEFAULT 'System',
  `actionType` varchar(100) NOT NULL, -- 'POST_DELETE', 'COMMENT_DELETE', 'USER_SUSPEND', 'USER_ACTIVE', 'DATA_EXPORT', 'DATA_IMPORT', 'WEB_MODERATION'
  `targetItem` varchar(255) DEFAULT NULL,
  `targetDetails` text DEFAULT NULL,
  `reason` text DEFAULT NULL,
  `timestamp` bigint(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------
-- Table structure for table `security_logs`
-- --------------------------------------------------------
CREATE TABLE IF NOT EXISTS `security_logs` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `usernameOrEmail` varchar(255) NOT NULL,
  `ipAddress` varchar(100) NOT NULL,
  `actionType` varchar(100) NOT NULL, -- 'LOGIN_FAILED', 'LOGIN_SUCCESS', 'LOCKOUT_TEMP', etc.
  `details` text NOT NULL,
  `timestamp` bigint(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------
-- Table structure for table `user_reports`
-- --------------------------------------------------------
CREATE TABLE IF NOT EXISTS `user_reports` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `reportedUsername` varchar(255) NOT NULL,
  `reportedName` varchar(255) NOT NULL,
  `reporterUsername` varchar(255) NOT NULL,
  `reason` varchar(255) NOT NULL,
  `details` text NOT NULL,
  `evidenceUri` varchar(500) DEFAULT NULL,
  `timestamp` bigint(20) NOT NULL,
  `reportedEmail` varchar(255) NOT NULL DEFAULT 'bilinmiyor@pulse.com',
  `reportedIp` varchar(100) NOT NULL DEFAULT '192.168.1.1',
  `reportedBio` text DEFAULT NULL,
  `reportType` varchar(50) NOT NULL DEFAULT 'USER', -- 'USER', 'POST', 'COMMENT'
  `targetPostId` bigint(20) DEFAULT NULL,
  `targetCommentId` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------
-- Table structure for table `kvkk_reports`
-- --------------------------------------------------------
CREATE TABLE IF NOT EXISTS `kvkk_reports` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `reportedUsername` varchar(255) NOT NULL,
  `reportedName` varchar(255) NOT NULL,
  `reporterUsername` varchar(255) NOT NULL,
  `reason` varchar(255) NOT NULL,
  `details` text NOT NULL,
  `evidenceUri` varchar(500) DEFAULT NULL,
  `timestamp` bigint(20) NOT NULL,
  `reportedEmail` varchar(255) NOT NULL DEFAULT 'bilinmiyor@pulse.com',
  `reportedIp` varchar(100) NOT NULL DEFAULT '192.168.1.1',
  `reportedBio` text DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------
-- Table structure for table `api_keys`
-- --------------------------------------------------------
CREATE TABLE IF NOT EXISTS `api_keys` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `api_key` varchar(255) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `status` varchar(50) NOT NULL DEFAULT 'ACTIVE', -- 'ACTIVE', 'REVOKED'
  PRIMARY KEY (`id`),
  UNIQUE KEY `api_key` (`api_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


-- --------------------------------------------------------
-- Populate with initial beautiful sample data
-- --------------------------------------------------------

-- Insert standard users (VIP, Verified, etc.)
INSERT INTO `users` (`username`, `name`, `email`, `avatarUrl`, `coverUrl`, `bio`, `isVerified`, `isVip`, `vipExpireTimestamp`, `privacy`, `joinTimestamp`, `ipAddress`, `status`) VALUES
('ardayilmaz', 'Arda Yılmaz', 'arda@duyapp.com', 'avatar1', 'cover1', 'Edebiyat aşığı, amatör yazar. Şiir ruhun gıdasıdır.', 1, 0, 0, 'PUBLIC', 1780000000000, '192.168.1.102', 'Active'),
('cerenkaya_ux', 'Ceren Kaya', 'ceren@duyapp.com', 'avatar2', 'cover2', 'UX Tasarımcısı & Kitap Kurdu. 📚🎨 Hayatı estetik yaşamak gerek.', 1, 1, 1890000000000, 'PUBLIC', 1780050000000, '192.168.1.103', 'Active'),
('pulse_app', 'DuygularNet Ekibi', 'ekip@duyapp.com', 'avatar_pulse', 'cover_pulse', 'DuygularNet Resmi Hesabı. Hoş geldiniz! ✨ En güzel edebiyat topluluğu.', 1, 1, 9999999999000, 'PUBLIC', 1780100000000, '127.0.0.1', 'Active'),
('candemirel', 'Can Demirel', 'can@duyapp.com', 'avatar3', 'cover3', 'Tarih ve şiir sever. Geçmişin izinde.', 0, 0, 0, 'PUBLIC', 1780200000000, '192.168.1.104', 'Active');

-- Insert initial posts
INSERT INTO `posts` (`id`, `authorName`, `authorUsername`, `authorAvatarUrl`, `isVerified`, `text`, `timestamp`, `likesCount`, `commentsCount`, `repostsCount`, `isLiked`, `isReposted`, `isBookmarked`, `imageUri`, `pollQuestion`, `pollOption1`, `pollOption2`, `pollVotes1`, `pollVotes2`, `userVotedOption`, `viewsCount`) VALUES
(1, 'Arda Yılmaz', 'ardayilmaz', 'avatar1', 1, 'En sevdiğim şairlerden Turgut Uyar der ki: \'Herkesin bir gideni vardır, içinden bir türlü uğurlayamadığı.\' Kelimelerin o derin gücü ve her okunuşta farklı bir anlam sunan şiirlerin sadeliği ruhumu dinlendiriyor. Sizlerin bu aralar başucu şiiri hangisi? 📖✨ #ŞiirSokakta #Edebiyat', 1783515433000, 142, 2, 38, 0, 0, 0, NULL, NULL, NULL, NULL, 0, 0, NULL, 1245),
(2, 'Ceren Kaya', 'cerenkaya_ux', 'avatar2', 1, 'Zamanın hızlı akışı içinde durup bir kitap kapağı aralamak, o eski sayfaların kokusunu içine çekmek... Son zamanlardaki bilgi ve gürültü kirliliğinden sonra edebiyatın sakin, derin dünyası ruhumuza çok iyi geliyor. Tıpkı sade bir kütüphane köşesi gibi... 📚☕ #KitapAlıntıları #Edebiyat', 1783515453000, 328, 1, 89, 1, 0, 0, NULL, NULL, NULL, NULL, 0, 0, NULL, 2840),
(3, 'DuygularNet Ekibi', 'pulse_app', 'avatar_pulse', 1, 'DuygularNet\'e hoş geldiniz! 🎉 Şairlerin, yazarların, kitap severlerin ve edebiyat tutkunlarının bir araya geldiği, en sevdiğiniz mısraları, alıntıları ve şiirleri paylaşabileceğiniz yeni nesil edebiyat durağınız. 💙 Bizimle en sevdiğiniz alıntıları, kitap yorumlarınızı paylaşın.', 1783515483000, 1240, 2, 512, 1, 1, 1, NULL, 'Sizce hangisi daha etkileyici?', 'Klasik Türk Edebiyatı (Roman & Şiir)', 'Dünya Klasikleri (Felsefe & Deneme)', 432, 678, NULL, 14205);

-- Insert comments
INSERT INTO `comments` (`id`, `postId`, `authorName`, `authorUsername`, `authorAvatarUrl`, `text`, `timestamp`, `likesCount`, `isLiked`) VALUES
(1, 1, 'Ceren Kaya', 'cerenkaya_ux', 'avatar2', 'Turgut Uyar gerçekten çok özel bir şair. Paylaşımınız için teşekkürler, içimizi ısıttı.', 1783515433100, 15, 0),
(2, 1, 'Can Demirel', 'candemirel', 'avatar3', 'Kesinlikle katılıyorum Arda bey. Özellikle \'Göğe Bakma Durağı\' şiiri her okunduğunda insanı bambaşka diyarlara götürüyor.', 1783515433200, 24, 0);

-- Insert hashtags
INSERT INTO `hashtags` (`hashtag`, `postsCount`) VALUES
('#ŞiirSokakta', 1),
('#Edebiyat', 2),
('#KitapAlıntıları', 1);

-- Insert initial active API Key
INSERT INTO `api_keys` (`api_key`, `status`) VALUES
('duyapp_api_key_84427ad1_prod', 'ACTIVE');

COMMIT;
