-- ============================================================
-- Migration: کنترل دسترسی مبتنی بر نقش (RBAC)
-- روی دیتابیس‌های موجود این فایل را Import کنید.
-- شامل: گسترش ستون users.role + جدول‌های roles/permissions/role_permissions + داده‌های پیش‌فرض
-- ============================================================

-- ۱) ستون نقش کاربر را از ENUM به VARCHAR تغییر می‌دهیم تا نقش‌های سفارشی ممکن شود
ALTER TABLE users MODIFY COLUMN role VARCHAR(30) NOT NULL DEFAULT 'seller';

-- ۲) جدول‌ها
CREATE TABLE IF NOT EXISTS roles (
    id         INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    code       VARCHAR(30) NOT NULL,
    name       VARCHAR(60) NOT NULL,
    is_system  TINYINT(1) NOT NULL DEFAULT 0,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uq_role_code (code)
) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_persian_ci;

CREATE TABLE IF NOT EXISTS permissions (
    code  VARCHAR(40) PRIMARY KEY,
    label VARCHAR(80) NOT NULL,
    grp   VARCHAR(40) NOT NULL DEFAULT ''
) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_persian_ci;

CREATE TABLE IF NOT EXISTS role_permissions (
    role_id         INT UNSIGNED NOT NULL,
    permission_code VARCHAR(40) NOT NULL,
    PRIMARY KEY (role_id, permission_code),
    CONSTRAINT fk_rp_role FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
    CONSTRAINT fk_rp_perm FOREIGN KEY (permission_code) REFERENCES permissions(code) ON DELETE CASCADE
) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_persian_ci;

-- ۳) داده‌های پیش‌فرض (INSERT IGNORE تا اجرای دوباره مشکلی ایجاد نکند)
INSERT IGNORE INTO permissions (code, label, grp) VALUES
    ('sales.create',     'ثبت فروش (صندوق)',          'فروش'),
    ('sales.view',       'مشاهده فاکتورها',           'فروش'),
    ('products.manage',  'مدیریت اجناس (افزودن/ویرایش)', 'انبار'),
    ('products.delete',  'حذف/غیرفعال‌سازی اجناس',     'انبار'),
    ('stock.manage',     'عملیات انبار (ورود/خروج)',   'انبار'),
    ('customers.manage', 'مدیریت مشتریان',            'مشتریان'),
    ('expenses.manage',  'مدیریت مصارف',              'مالی'),
    ('dashboard.view',   'مشاهده داشبورد',            'گزارش'),
    ('reports.view',     'گزارش‌ها و تحلیل',           'گزارش'),
    ('users.manage',     'مدیریت کاربران',            'مدیریت سیستم'),
    ('roles.manage',     'مدیریت نقش‌ها و دسترسی‌ها',   'مدیریت سیستم'),
    ('audit.view',       'مشاهده لاگ ممیزی',          'مدیریت سیستم');

INSERT IGNORE INTO roles (code, name, is_system) VALUES
    ('admin',     'مدیر سیستم', 1),
    ('seller',    'فروشنده',    1),
    ('warehouse', 'انباردار',   1);

INSERT IGNORE INTO role_permissions (role_id, permission_code)
SELECT r.id, p.code FROM roles r CROSS JOIN permissions p WHERE r.code = 'admin';

INSERT IGNORE INTO role_permissions (role_id, permission_code)
SELECT r.id, c.code FROM roles r
JOIN (SELECT 'sales.create' AS code UNION SELECT 'sales.view' UNION SELECT 'customers.manage') c
WHERE r.code = 'seller';

INSERT IGNORE INTO role_permissions (role_id, permission_code)
SELECT r.id, c.code FROM roles r
JOIN (SELECT 'products.manage' AS code UNION SELECT 'stock.manage' UNION SELECT 'sales.view' UNION SELECT 'customers.manage') c
WHERE r.code = 'warehouse';
