SET NAMES utf8mb4;
CREATE TABLE IF NOT EXISTS users (
 id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, chat_id BIGINT NOT NULL, username VARCHAR(255) NULL, first_name VARCHAR(255) NULL,
 step VARCHAR(100) NOT NULL DEFAULT 'home', status ENUM('active','blocked') NOT NULL DEFAULT 'active', warnings INT UNSIGNED NOT NULL DEFAULT 0,
 message_count BIGINT UNSIGNED NOT NULL DEFAULT 0, ai_count BIGINT UNSIGNED NOT NULL DEFAULT 0, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
 last_activity DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY(id), UNIQUE KEY uq_users_chat(chat_id), KEY idx_users_status(status), KEY idx_users_last(last_activity)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS groups (
 id BIGINT NOT NULL, title VARCHAR(255) NULL, username VARCHAR(255) NULL, ai_enabled TINYINT(1) NOT NULL DEFAULT 1,
 message_count BIGINT UNSIGNED NOT NULL DEFAULT 0, ai_count BIGINT UNSIGNED NOT NULL DEFAULT 0, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
 last_activity DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY(id), KEY idx_groups_activity(last_activity)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS force_channels (
 id INT UNSIGNED NOT NULL AUTO_INCREMENT, channel_username VARCHAR(255) NOT NULL, display_name VARCHAR(255) NOT NULL, enabled TINYINT(1) NOT NULL DEFAULT 1,
 created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY(id), UNIQUE KEY uq_force_username(channel_username)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS settings (id INT UNSIGNED NOT NULL AUTO_INCREMENT,_key VARCHAR(191) NOT NULL,_value LONGTEXT NULL,PRIMARY KEY(id),UNIQUE KEY uq_setting_key(_key)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS ai_profiles (id INT UNSIGNED NOT NULL AUTO_INCREMENT,name VARCHAR(100) NOT NULL,system_prompt LONGTEXT NOT NULL,enabled TINYINT(1) NOT NULL DEFAULT 1,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS conversation_messages (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,user_id BIGINT NOT NULL,group_id BIGINT NULL,role ENUM('system','user','assistant') NOT NULL,content LONGTEXT NOT NULL,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY(id),KEY idx_conv_user_group(user_id,group_id,id),KEY idx_conv_created(created_at)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS usage_windows (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,user_id BIGINT NOT NULL,group_id BIGINT NULL,window_start DATETIME NOT NULL,request_count INT UNSIGNED NOT NULL DEFAULT 0,PRIMARY KEY(id),UNIQUE KEY uq_usage(user_id,group_id,window_start),KEY idx_usage_window(window_start)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS webhook_events (update_id BIGINT NOT NULL,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY(update_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS spam_hits (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,user_id BIGINT NOT NULL,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY(id),KEY idx_spam_user_time(user_id,created_at)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS tickets (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,user_id BIGINT NOT NULL,assigned_to BIGINT NULL,status ENUM('open','closed') NOT NULL DEFAULT 'open',created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,closed_at DATETIME NULL,PRIMARY KEY(id),KEY idx_ticket_user(user_id),KEY idx_ticket_status(status)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS ticket_messages (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,ticket_id BIGINT UNSIGNED NOT NULL,sender_id BIGINT NOT NULL,sender_type ENUM('user','agent') NOT NULL,message_text LONGTEXT NOT NULL,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY(id),KEY idx_ticket_msg(ticket_id,id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS support_agents (id BIGINT NOT NULL,enabled TINYINT(1) NOT NULL DEFAULT 1,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS log_channels (id INT UNSIGNED NOT NULL AUTO_INCREMENT,chat_id BIGINT NOT NULL,category VARCHAR(50) NOT NULL DEFAULT 'all',enabled TINYINT(1) NOT NULL DEFAULT 1,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY(id),KEY idx_log_chat(chat_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS app_logs (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,category VARCHAR(50) NOT NULL,message TEXT NOT NULL,user_id BIGINT NULL,group_id BIGINT NULL,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY(id),KEY idx_log_cat(category),KEY idx_log_date(created_at)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS broadcast_jobs (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,kind ENUM('users','groups','glass') NOT NULL,text LONGTEXT NOT NULL,buttons_json LONGTEXT NULL,status ENUM('draft','queued','running','paused','done','failed') NOT NULL DEFAULT 'queued',target_type ENUM('users','groups') NOT NULL DEFAULT 'users',total_targets BIGINT UNSIGNED NOT NULL DEFAULT 0,sent_count BIGINT UNSIGNED NOT NULL DEFAULT 0,failed_count BIGINT UNSIGNED NOT NULL DEFAULT 0,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY(id),KEY idx_broadcast_status(status)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS broadcast_queue (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,job_id BIGINT UNSIGNED NOT NULL,target_id BIGINT NOT NULL,status ENUM('pending','sent','failed') NOT NULL DEFAULT 'pending',attempts TINYINT UNSIGNED NOT NULL DEFAULT 0,last_error TEXT NULL,sent_at DATETIME NULL,PRIMARY KEY(id),UNIQUE KEY uq_job_target(job_id,target_id),KEY idx_queue_job_status(job_id,status,id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS daily_stats (stat_date DATE NOT NULL,users_new INT UNSIGNED NOT NULL DEFAULT 0,groups_new INT UNSIGNED NOT NULL DEFAULT 0,messages BIGINT UNSIGNED NOT NULL DEFAULT 0,ai_requests BIGINT UNSIGNED NOT NULL DEFAULT 0,PRIMARY KEY(stat_date)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS backups (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,file_name VARCHAR(255) NOT NULL,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS settings_versions (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,snapshot LONGTEXT NOT NULL,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS user_states (user_id BIGINT NOT NULL,state VARCHAR(100) NOT NULL,data_json LONGTEXT NULL,updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY(user_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO settings(_key,_value) VALUES
('welcome_text','🤖 سلام! به ربات هوش مصنوعی خوش آمدید.\nپیام خود را ارسال کنید تا پاسخ بدهم.'),('help_text','📚 راهنما\n\nدر خصوصی پیام خود را ارسال کنید. در گروه با @BotUsername یا Reply به پیام من از AI استفاده کنید.'),('blocked_text','🚫 دسترسی شما به ربات مسدود شده است.'),('maintenance_text','🛠 ربات موقتاً در حال بروزرسانی است. لطفاً بعداً دوباره تلاش کنید.'),('not_joined_text','❌ هنوز جوین نشدید.\n\nلطفاً ابتدا در تمام کانال‌های مشخص‌شده عضو شوید و سپس گزینه «تأیید عضویت» را انتخاب کنید.'),('joined_text','✅ عضویت شما تأیید شد.\nاکنون می‌توانید از امکانات ربات استفاده کنید.'),('moderation_warning','⚠️ هشدار\nلطفاً از الفاظ توهین‌آمیز و نامناسب خودداری کنید.\nدر صورت تکرار، دسترسی شما ممکن است محدود شود.'),('limit_text','⚠️ محدودیت استفاده\nشما به سقف استفاده از هوش مصنوعی رسیده‌اید.\n🕐 زمان بازگشت دسترسی: {until}\n🇮🇷 زمان بر اساس ساعت ایران'),('spam_text','🚦 درخواست‌ها بیش از حد مجاز است. لطفاً {seconds} ثانیه صبر کنید.'),('support_closed_text','✅ تیکت #{id} با موفقیت بسته شد.\nدر صورت نیاز می‌توانید درخواست جدیدی ثبت کنید.'),('ai_error_text','⚠️ در پردازش درخواست مشکلی پیش آمد. لطفاً دوباره تلاش کنید.'),('ai_system_prompt','You are a helpful assistant. Answer clearly and safely.'),('ai_private_limit','30'),('ai_group_limit','10'),('ai_window_minutes','60'),('spam_window_seconds','10'),('spam_max_requests','5'),('spam_cooldown_seconds','30'),('moderation_enabled','1'),('moderation_block_after','5'),('maintenance_mode','0'),('feature_groups','1'),('feature_support','1'),('feature_broadcast','1'),('feature_forced_join','1'),('feature_memory','1'),('feature_antispam','1'),('ai_temperature','0.7'),('ai_max_tokens','1200'),('active_ai_profile_id','0'),('ai_api_url',''),('ai_api_key',''),('ai_model',''),('ai_fallback_url',''),('ai_fallback_key',''),('ai_fallback_model','')
ON DUPLICATE KEY UPDATE _key=_key;
INSERT INTO ai_profiles(name,system_prompt,enabled) SELECT 'دستیار عمومی','You are a helpful assistant. Answer clearly and safely.',1 WHERE NOT EXISTS(SELECT 1 FROM ai_profiles LIMIT 1);
