-- ==========================================================
-- Migration v4 — Discount Engine (قوانین خودکار + کد تخفیف) و اتصال آن به سفارش
-- بعد از migration_v3.sql اجرا شود.
-- ==========================================================

SET NAMES utf8mb4;

-- قوانین تخفیف خودکار (VIP، تعداد سفارش، مناسبتی، مشتری پرتکرار و...)
-- rule_type فقط یک برچسب سازمان‌دهی برای پنل است؛ منطق واقعی از روی همین ستون‌های شرط خوانده می‌شود
-- تا افزودن یک قانون جدید هرگز نیاز به تغییر کد نداشته باشد.
CREATE TABLE IF NOT EXISTS discount_rules (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(191) NOT NULL,
    rule_type ENUM('vip','order_count','frequent_customer','seasonal','manual') NOT NULL DEFAULT 'manual',
    description VARCHAR(255) NULL,          -- توضیح کوتاه برای نمایش به مشتری («تخفیف مشتری VIP»)

    discount_kind ENUM('percent','fixed') NOT NULL DEFAULT 'percent',
    discount_value DECIMAL(14,4) NOT NULL,

    min_order_amount DECIMAL(14,0) NULL,
    max_discount_cap DECIMAL(14,0) NULL,

    requires_vip TINYINT(1) NOT NULL DEFAULT 0,
    min_successful_orders INT UNSIGNED NULL,
    min_total_spent DECIMAL(14,0) NULL,

    start_at DATETIME NULL,
    expires_at DATETIME NULL,

    applicable_services TEXT NULL,          -- JSON آرایهٔ advertising_type_id؛ NULL یعنی همهٔ سرویس‌ها

    active TINYINT(1) NOT NULL DEFAULT 1,
    priority INT NOT NULL DEFAULT 0,

    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- کدهای تخفیف (Coupon)
CREATE TABLE IF NOT EXISTS discount_codes (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    code VARCHAR(64) NOT NULL UNIQUE,
    description VARCHAR(255) NULL,

    discount_kind ENUM('percent','fixed') NOT NULL DEFAULT 'percent',
    discount_value DECIMAL(14,4) NOT NULL,

    min_order_amount DECIMAL(14,0) NULL,
    max_discount_cap DECIMAL(14,0) NULL,

    start_at DATETIME NULL,
    expires_at DATETIME NULL,

    usage_limit INT UNSIGNED NULL,          -- سقف کل استفاده (همهٔ مشتریان)
    per_customer_limit INT UNSIGNED NULL,   -- سقف استفاده برای هر مشتری

    applicable_services TEXT NULL,          -- JSON آرایهٔ advertising_type_id؛ NULL یعنی همه

    active TINYINT(1) NOT NULL DEFAULT 1,
    priority INT NOT NULL DEFAULT 0,

    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- مصرف واقعی کدهای تخفیف (فقط در لحظهٔ ثبت نهایی سفارش ثبت می‌شود، نه در Draft)
CREATE TABLE IF NOT EXISTS discount_usages (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    discount_code_id INT UNSIGNED NOT NULL,
    customer_id INT UNSIGNED NOT NULL,
    order_id INT UNSIGNED NOT NULL,
    used_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (discount_code_id) REFERENCES discount_codes(id) ON DELETE CASCADE,
    FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE,
    FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
    UNIQUE KEY uq_code_order (discount_code_id, order_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- تاریخچهٔ کامل رویدادهای تخفیف روی هر سفارش (اعمال/تغییر/حذف/رد) - بند ۹ و ۱۱ درخواست مرحلهٔ ۴
CREATE TABLE IF NOT EXISTS order_discount_history (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    order_id INT UNSIGNED NOT NULL,
    discount_rule_id INT UNSIGNED NULL,
    discount_code_id INT UNSIGNED NULL,
    discount_amount DECIMAL(14,0) NOT NULL DEFAULT 0,
    event ENUM('applied','changed','removed','rejected') NOT NULL,
    reason VARCHAR(255) NULL,
    changed_by ENUM('system','customer','admin') NOT NULL DEFAULT 'system',
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
    FOREIGN KEY (discount_rule_id) REFERENCES discount_rules(id) ON DELETE SET NULL,
    FOREIGN KEY (discount_code_id) REFERENCES discount_codes(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- اتصال تخفیف اعمال‌شده به خود سفارش (برای دسترسی سریع بدون Join به History)
ALTER TABLE orders
    ADD COLUMN IF NOT EXISTS discount_rule_id INT UNSIGNED NULL,
    ADD COLUMN IF NOT EXISTS discount_code_id INT UNSIGNED NULL,
    ADD COLUMN IF NOT EXISTS discount_reason VARCHAR(255) NULL;

-- ⚠️ اگر MySQL شما از IF NOT EXISTS در ALTER TABLE پشتیبانی نمی‌کند (قدیمی‌تر از 8.0.29 و غیر MariaDB)،
-- عبارت IF NOT EXISTS را حذف کنید و اگر ستون وجود داشت، خطا را نادیده بگیرید.
