-- =====================================================================
-- 2026_sprint1_callcenter.sql — اسپرینت ۱: کال‌سنتر + نوبت‌دهی + ظرفیت + sync
-- افزایشی، اجرای مجدد امن (IF NOT EXISTS / INSERT IGNORE). Rollback در پایین.
-- دیتابیس: shadicli_nurse
-- =====================================================================
SET NAMES utf8mb4;

-- ۱) نوبت‌ها در اپ (مبدأ: سایت از طریق sync، یا ساختِ داخلی)
CREATE TABLE IF NOT EXISTS `cw_appointments` (
  `id`             BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `external_id`    VARCHAR(64)  DEFAULT NULL,         -- شناسه‌ی رزرو سایت (idempotency)
  `cw_patient_id`  INT UNSIGNED DEFAULT NULL,
  `full_name`      VARCHAR(150) NOT NULL,
  `mobile`         VARCHAR(20)  DEFAULT NULL,
  `service`        VARCHAR(190) DEFAULT NULL,
  `doctor_id`      INT UNSIGNED DEFAULT NULL,
  `doctor_name`    VARCHAR(150) DEFAULT NULL,         -- نامِ خام از سایت (اگر نگاشت نشد)
  `appt_date`      DATE         DEFAULT NULL,         -- میلادی (داخلی)
  `appt_date_jalali` VARCHAR(12) DEFAULT NULL,        -- شمسی (نمایش/تطبیق با سایت)
  `appt_time`      VARCHAR(5)   DEFAULT NULL,         -- HH:MM
  `status`         ENUM('new','confirmed','arrived','done','cancelled','no_show') NOT NULL DEFAULT 'new',
  `source`         ENUM('site','callcenter','reception') NOT NULL DEFAULT 'site',
  `operator_id`    INT UNSIGNED DEFAULT NULL,
  `admin_note`     VARCHAR(500) DEFAULT NULL,
  `sms_status`     VARCHAR(20)  DEFAULT NULL,
  `cw_visit_id`    BIGINT UNSIGNED DEFAULT NULL,      -- پس از «حضور»
  `created_at`     DATETIME     NOT NULL,
  `updated_at`     DATETIME     DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_external` (`external_id`),
  KEY `idx_date` (`appt_date`),
  KEY `idx_status` (`status`),
  KEY `idx_mobile` (`mobile`),
  KEY `idx_slot` (`appt_date`,`appt_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ۲) قواعد ظرفیت (معادل appointment_slot_rules سایت) — تاریخ میلادی، day_of_week 0=شنبه..6=جمعه
CREATE TABLE IF NOT EXISTS `cw_appt_slot_rules` (
  `id`               INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `day_of_week`      TINYINT      DEFAULT NULL,       -- 0=شنبه..6=جمعه (NULL=همه)
  `date_override`    DATE         DEFAULT NULL,       -- قانونِ تاریخِ خاص (میلادی)
  `time_start`       VARCHAR(8)   NOT NULL,           -- HH:MM:SS
  `time_end`         VARCHAR(8)   NOT NULL,
  `doctor_id_or_name`VARCHAR(150) DEFAULT NULL,
  `service_category` VARCHAR(150) DEFAULT NULL,
  `max_bookings`     INT          NOT NULL DEFAULT 4,
  `is_active`        TINYINT      NOT NULL DEFAULT 1,
  `created_at`       DATETIME     DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_dow` (`day_of_week`),
  KEY `idx_dateov` (`date_override`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ۳) override ظرفیتِ اسلاتِ مشخص
CREATE TABLE IF NOT EXISTS `cw_appt_slot_overrides` (
  `id`               INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `slot_date`        DATE         NOT NULL,
  `slot_time`        VARCHAR(8)   NOT NULL,
  `doctor_id_or_name`VARCHAR(150) DEFAULT NULL,
  `max_bookings`     INT          NOT NULL,
  `created_by`       INT UNSIGNED DEFAULT NULL,
  `created_at`       DATETIME     DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_slot` (`slot_date`,`slot_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ۴) قفلِ اسلات
CREATE TABLE IF NOT EXISTS `cw_appt_slot_locks` (
  `id`               INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `slot_date`        DATE         NOT NULL,
  `slot_time`        VARCHAR(8)   NOT NULL,
  `doctor_id_or_name`VARCHAR(150) DEFAULT NULL,
  `reason`           VARCHAR(200) DEFAULT NULL,
  `created_by`       INT UNSIGNED DEFAULT NULL,
  `created_at`       DATETIME     DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_slot` (`slot_date`,`slot_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ۵) لاگ کال‌سنتر
CREATE TABLE IF NOT EXISTS `cw_callcenter_log` (
  `id`            BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `appointment_id`BIGINT UNSIGNED DEFAULT NULL,
  `operator_id`   INT UNSIGNED DEFAULT NULL,
  `action`        VARCHAR(40)  NOT NULL,             -- confirm/cancel/no_show/call/note
  `note`          VARCHAR(500) DEFAULT NULL,
  `created_at`    DATETIME     NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_appt` (`appointment_id`),
  KEY `idx_op` (`operator_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ۶) صندوق ورودیِ sync (idempotency + لاگ)
CREATE TABLE IF NOT EXISTS `cw_sync_inbox` (
  `id`           BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `external_id`  VARCHAR(64)  DEFAULT NULL,
  `source`       VARCHAR(40)  NOT NULL DEFAULT 'site',
  `event`        VARCHAR(40)  DEFAULT 'booking',
  `payload_json` MEDIUMTEXT   DEFAULT NULL,
  `status`       ENUM('pending','done','failed','duplicate') NOT NULL DEFAULT 'pending',
  `error`        VARCHAR(500) DEFAULT NULL,
  `received_at`  DATETIME     NOT NULL,
  `processed_at` DATETIME     DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_ext` (`external_id`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- قانونِ ظرفیتِ پیش‌فرض (همه‌ی روزها، ۰۹:۰۰ تا ۲۰:۳۰، سقف ۴) — فقط اگر هیچ قانونی نیست
INSERT INTO `cw_appt_slot_rules` (`day_of_week`,`date_override`,`time_start`,`time_end`,`doctor_id_or_name`,`service_category`,`max_bookings`,`is_active`,`created_at`)
SELECT NULL, NULL, '09:00:00', '20:30:00', NULL, NULL, 4, 1, NOW()
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `cw_appt_slot_rules`);

-- =====================================================================
-- ROLLBACK (در صورت نیاز، این بخش را جداگانه اجرا کنید):
-- DROP TABLE IF EXISTS `cw_sync_inbox`;
-- DROP TABLE IF EXISTS `cw_callcenter_log`;
-- DROP TABLE IF EXISTS `cw_appt_slot_locks`;
-- DROP TABLE IF EXISTS `cw_appt_slot_overrides`;
-- DROP TABLE IF EXISTS `cw_appt_slot_rules`;
-- DROP TABLE IF EXISTS `cw_appointments`;
-- =====================================================================
