-- ============================================================================
--  2026_sprint30l_phase4_runtime_pass3.sql — فاز ۴ / پاسِ سومِ رفعِ runtime
--  ADDITIVE فقط / idempotent / بدونِ DELIMITER / بدونِ stored procedure /
--  سازگار با cPanel و MariaDB/MySQL / غیرِمخرب.
--  پیش‌نیاز: پس از ...30i → 30j → 30k اجرا شود. اجرای چندباره بی‌خطر است.
--
--  چرا لازم است: کدِ پاسِ سوم «جلسهٔ زمان‌بندی‌شده» را معرفی می‌کند تا خدمتِ
--  جلسهٔ بعد پیش از تاریخِ نوبت در صف ظاهر/شروع نشود و به ویزیتِ قدیمیِ
--  تکمیل‌شده نچسبد. این دو ستون، تاریخِ زمان‌بندی و نوبتِ متناظر را نگه می‌دارند.
--  (نوشتنِ هر دو در کد با cw_col_exists گارد شده؛ بدونِ این مهاجرت سیستم
--   کار می‌کند ولی تاریخِ زمان‌بندی و پیوندِ نوبت ذخیره نمی‌شود.)
--
--  توجه: cw_performed_services.status از نوعِ VARCHAR(30) است (نه ENUM)،
--  بنابراین وضعیتِ جدیدِ 'scheduled' بدونِ تغییرِ ساختار پذیرفته می‌شود.
-- ============================================================================
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ─────────────── cw_performed_services: زمان‌بندیِ جلسهٔ بعد ───────────────
SET @c:=(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='cw_performed_services' AND COLUMN_NAME='scheduled_date');
SET @s:=IF(@c=0,"ALTER TABLE `cw_performed_services` ADD COLUMN `scheduled_date` DATE DEFAULT NULL",'SELECT 1'); PREPARE st FROM @s; EXECUTE st; DEALLOCATE PREPARE st;

SET @c:=(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='cw_performed_services' AND COLUMN_NAME='appointment_id');
SET @s:=IF(@c=0,"ALTER TABLE `cw_performed_services` ADD COLUMN `appointment_id` BIGINT UNSIGNED DEFAULT NULL",'SELECT 1'); PREPARE st FROM @s; EXECUTE st; DEALLOCATE PREPARE st;

-- ─────────────── cw_consents: مهرِ زمانِ waiver (ناوردایِ رضایت) ───────────────
-- override_waived بدونِ زمان قابلِ ممیزی نیست؛ این ستون آن را تغییرناپذیر ثبت می‌کند.
SET @c:=(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='cw_consents' AND COLUMN_NAME='waived_at');
SET @s:=IF(@c=0,"ALTER TABLE `cw_consents` ADD COLUMN `waived_at` DATETIME DEFAULT NULL",'SELECT 1'); PREPARE st FROM @s; EXECUTE st; DEALLOCATE PREPARE st;

-- backfill: waiverهای موجود بدونِ زمان، از updated_at/created_at مهر می‌خورند تا ناوردا آن‌ها را بلاک نکند
UPDATE `cw_consents`
   SET `waived_at` = COALESCE(`updated_at`,`created_at`)
 WHERE `status`='override_waived' AND `waived_at` IS NULL AND `waived_by` IS NOT NULL;

-- ─────────────── ایندکس‌های کمکی (غیرِیکتا، idempotent) ───────────────
SET @c:=(SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='cw_performed_services' AND INDEX_NAME='idx_ps_scheduled');
SET @s:=IF(@c=0,"ALTER TABLE `cw_performed_services` ADD INDEX `idx_ps_scheduled` (`status`,`scheduled_date`)",'SELECT 1'); PREPARE st FROM @s; EXECUTE st; DEALLOCATE PREPARE st;

SET @c:=(SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='cw_performed_services' AND INDEX_NAME='idx_ps_appt');
SET @s:=IF(@c=0,"ALTER TABLE `cw_performed_services` ADD INDEX `idx_ps_appt` (`appointment_id`)",'SELECT 1'); PREPARE st FROM @s; EXECUTE st; DEALLOCATE PREPARE st;

-- ─────────────── گزارشِ تشخیصی: جلسه‌های زمان‌بندی‌شدهٔ یتیم ───────────────
-- جلسهٔ scheduled که نوبتش لغو/منقضی شده یا نوبتی ندارد → نیازمندِ رسیدگیِ دستی
SELECT 'scheduled_sessions_orphan' AS report, ps.id AS performed_service_id, ps.patient_id,
       ps.session_no, ps.total_sessions, ps.scheduled_date, ps.appointment_id,
       COALESCE(a.status,'(بدونِ نوبت)') AS appt_status
  FROM cw_performed_services ps
  LEFT JOIN cw_appointments a ON a.id = ps.appointment_id
 WHERE ps.status='scheduled'
   AND (ps.appointment_id IS NULL OR a.id IS NULL OR a.status IN ('cancelled','rejected','expired','lost'));

-- جلسهٔ scheduled که تاریخش گذشته ولی هنوز فعال نشده (بیمار مراجعه نکرده / check-in نشده)
SELECT 'scheduled_sessions_past_due' AS report, ps.id AS performed_service_id, ps.patient_id,
       ps.session_no, ps.scheduled_date, ps.appointment_id, a.status AS appt_status
  FROM cw_performed_services ps
  LEFT JOIN cw_appointments a ON a.id = ps.appointment_id
 WHERE ps.status='scheduled' AND ps.scheduled_date IS NOT NULL AND ps.scheduled_date < CURDATE();

-- ─────────────── گزارشِ تشخیصی: پرستارانِ طبقه‌بندی‌نشده برای لیزر ───────────────
SELECT 'nurses_unclassified_for_laser' AS report, id, full_name
  FROM nurses WHERE is_active=1 AND is_laser IS NULL;

SET FOREIGN_KEY_CHECKS = 1;
-- پایانِ مهاجرتِ 30l
