-- ==========================================================
-- Migration v3 — ماژول سفارش (Order State Machine) + قیمت قبلی مشتری + تاریخچهٔ قیمت
-- بعد از schema.sql و migration_v2.sql اجرا شود.
-- ==========================================================

SET NAMES utf8mb4;

CREATE TABLE IF NOT EXISTS orders (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    customer_id INT UNSIGNED NOT NULL,
    advertising_type_id INT UNSIGNED NOT NULL,

    status ENUM(
        'draft',                               -- در حال پر شدن فرم توسط مشتری
        'pending_admin_review',                 -- ثبت شده، منتظر بررسی ادمین
        'awaiting_customer_price_confirmation',-- ادمین قیمت را مشخص کرده، منتظر تأیید مشتری
        'awaiting_payment',                     -- مشتری قیمت را تأیید کرده، منتظر هماهنگی/پرداخت
        'completed',
        'cancelled',                            -- توسط مشتری لغو شده (در فرم یا بعد از دیدن قیمت)
        'rejected'                              -- توسط ادمین رد شده
    ) NOT NULL DEFAULT 'draft',

    price_status ENUM('not_required','pending_review','proposed','approved','rejected')
        NOT NULL DEFAULT 'not_required',

    discount_status ENUM('not_applied','applied','rejected','expired') NOT NULL DEFAULT 'not_applied',

    base_amount DECIMAL(14,0) NULL,      -- برآورد اولیه (Fixed/Calculated) یا NULL برای Custom
    discount_amount DECIMAL(14,0) NOT NULL DEFAULT 0,
    final_amount DECIMAL(14,0) NULL,     -- فقط بعد از تأیید ادمین پر می‌شود

    is_vip_at_order_time TINYINT(1) NOT NULL DEFAULT 0,  -- زیرساخت برای مرحلهٔ ۴ (Discount Engine)

    admin_notes TEXT NULL,
    rejection_reason TEXT NULL,
    cancellation_reason VARCHAR(255) NULL,

    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    submitted_at DATETIME NULL,   -- زمانی که مشتری «تأیید» زد و سفارش وارد pending_admin_review شد
    completed_at DATETIME NULL,

    FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE,
    FOREIGN KEY (advertising_type_id) REFERENCES advertising_types(id),
    INDEX idx_status (status),
    INDEX idx_customer (customer_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- مقادیر فیلدهای Dynamic هر سفارش
CREATE TABLE IF NOT EXISTS order_field_values (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    order_id INT UNSIGNED NOT NULL,
    field_key VARCHAR(64) NOT NULL,
    label VARCHAR(191) NOT NULL,   -- کپی از لحظهٔ ثبت، تا اگر بعداً فیلد در پنل تغییر کرد، سابقهٔ سفارش عوض نشود
    value TEXT NULL,
    FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
    UNIQUE KEY uq_order_field (order_id, field_key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- قیمت قبلی اعلام‌شدهٔ مشتری (فقط Reference برای ادمین - بند ۸ درخواست مرحلهٔ ۳)
CREATE TABLE IF NOT EXISTS order_previous_prices (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    order_id INT UNSIGNED NOT NULL UNIQUE,
    reported_amount DECIMAL(14,0) NULL,
    reported_source VARCHAR(255) NULL,   -- از کجا/چه فروشنده‌ای
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- تاریخچهٔ تغییر قیمت توسط ادمین
CREATE TABLE IF NOT EXISTS order_price_history (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    order_id INT UNSIGNED NOT NULL,
    old_amount DECIMAL(14,0) NULL,
    new_amount DECIMAL(14,0) NOT NULL,
    changed_by_admin_id INT UNSIGNED NULL,
    reason VARCHAR(500) NULL,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
    FOREIGN KEY (changed_by_admin_id) REFERENCES admins(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- تاریخچهٔ تغییر وضعیت سفارش (برای پیگیری/گزارش‌گیری - بند ۱۳ درخواست مرحلهٔ ۳)
CREATE TABLE IF NOT EXISTS order_status_history (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    order_id INT UNSIGNED NOT NULL,
    old_status VARCHAR(64) NULL,
    new_status VARCHAR(64) NOT NULL,
    changed_by ENUM('customer','admin','system') NOT NULL,
    note VARCHAR(500) NULL,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- وضعیت مکالمهٔ چندمرحله‌ای مشتری (مشابه admin_states، ولی جدا - بند ۱۶: تفکیک منطق Customer از Admin)
CREATE TABLE IF NOT EXISTS customer_states (
    telegram_user_id BIGINT UNSIGNED NOT NULL PRIMARY KEY,
    state VARCHAR(64) NOT NULL,
    payload TEXT NULL,
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT IGNORE INTO settings (setting_key, setting_value) VALUES
    ('admin_contact_username', ''),
    ('order_awaiting_payment_message',
     '✅ سفارش شما تأیید شد.\nجهت هماهنگی نهایی و پرداخت با مدیر در ارتباط باشید.'),
    ('order_rejected_message_default',
     'متأسفانه امکان ثبت این سفارش در حال حاضر وجود ندارد.');
