-- =====================================================================
-- BarKala v173 — سخت‌سازی و بهینه‌سازی دیتابیس (cPanel / MariaDB 10.6+)
-- اجرا: بعد از فایل‌های 1 و 2 (و ترجیحاً قبل از استفادهٔ واقعی). قابل اجرای مجدد است.
-- پیش‌نیاز تلفن یکتا: اگر دیتابیس قدیمی دارید، این کوئری باید «هیچ ردیفی» برنگرداند:
--   SELECT phone, COUNT(*) c FROM users WHERE phone IS NOT NULL GROUP BY phone HAVING c>1;
-- =====================================================================
SET NAMES utf8mb4;

-- (۱) ایمیل/موبایل: نرمال‌سازی و یکتا بودن موبایل (قبلاً فقط ایمیل یکتا بود و ورود با OR مبهم می‌شد)
UPDATE users    SET email = LOWER(TRIM(email)) WHERE email IS NOT NULL;
UPDATE profiles SET email = LOWER(TRIM(email)) WHERE email IS NOT NULL;
UPDATE users    SET phone = NULL WHERE phone IS NOT NULL AND TRIM(phone) = '';
UPDATE users    SET phone = REPLACE(REPLACE(TRIM(phone), ' ', ''), '-', '') WHERE phone IS NOT NULL;
ALTER TABLE `users` ADD UNIQUE INDEX IF NOT EXISTS `uq_users_phone` (`phone`);

-- (۲) ستون‌های توکن: از TEXT (بدون ایندکس، اسکن کامل جدول‌های دارای تصویر/صوت base64) به VARCHAR(191) + ایندکس
ALTER TABLE `bk_invoice_messages`
  MODIFY COLUMN `sender_token` VARCHAR(191) NULL,
  MODIFY COLUMN `invoice_no`   VARCHAR(191) NULL,
  ADD INDEX IF NOT EXISTS `idx_invmsg_sender` (`sender_token`),
  ADD INDEX IF NOT EXISTS `idx_invmsg_no` (`invoice_no`),
  ADD INDEX IF NOT EXISTS `idx_invmsg_status_ts` (`status`, `created_ts`);

ALTER TABLE `bk_direct_voice_notes`
  MODIFY COLUMN `sender_token`     VARCHAR(191) NOT NULL,
  MODIFY COLUMN `invoice_group_id` VARCHAR(191) NOT NULL,
  ADD INDEX IF NOT EXISTS `idx_voice_sender` (`sender_token`),
  ADD INDEX IF NOT EXISTS `idx_voice_group` (`invoice_group_id`);

ALTER TABLE `marketer_orders`
  MODIFY COLUMN `marketer_token` VARCHAR(191) NULL,
  ADD INDEX IF NOT EXISTS `idx_mo_marketer` (`marketer_token`),
  ADD INDEX IF NOT EXISTS `idx_mo_status` (`status`, `created_at`);

-- (۳) تنظیمات: اطمینان از TEXT (کاتالوگ اختصاصی بازاریاب) حتی اگر فایل 2 اجرا نشده باشد
ALTER TABLE `bk_kv_settings` MODIFY COLUMN `v` TEXT NULL;

-- (۴) ایندکس پاکسازی (cron-maintenance روزانه؛ bk_audit_log از قبل idx_audit_time دارد)
ALTER TABLE `bk_security_events` ADD INDEX IF NOT EXISTS `idx_secev_created` (`created_at`);

-- (۵) پاکسازی دوره‌ای: روش اصلی cron است (cPanel ← Cron Jobs، روزانه):
--       wget -q -O /dev/null "https://YOUR-DOMAIN/api/cron-maintenance?key=BK_CRON_KEY"
--     اگر هاست شما EVENT را مجاز می‌کند (event_scheduler=ON) می‌توانید به‌جای آن این را فعال کنید:
-- CREATE EVENT IF NOT EXISTS ev_bk_purge ON SCHEDULE EVERY 1 DAY DO BEGIN
--   DELETE FROM api_sessions WHERE expires_at < NOW();
--   DELETE FROM bk_rate_limits;
--   DELETE FROM bk_security_events WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);
--   DELETE FROM bk_audit_log WHERE created_at < DATE_SUB(NOW(), INTERVAL 180 DAY);
-- END;
