<?php
/**
 * acl-scope-registry.php — رجیستری ماژول‌ها، scope و پروفایل‌های آماده دسترسی
 */

if ( ! defined( 'ABSPATH' ) ) exit;

/**
 * تنظیمات scope هر ماژول / منو
 * scope_type خالی = بدون محدوده شیء
 */
function acl_get_module_registry(): array {
    return [
        'inventory' => [
            'label'       => 'انبار',
            'menu_key'    => 'inventory',
            'view_perm'   => 'inv.view',
            'scope_type'  => 'warehouse',
            'scope_label' => 'انبارهای مجاز',
            'scope_api'   => '/inv/warehouses',
            'suggest_roles' => ['warehouse_keeper', 'manager'],
        ],
        'sales' => [
            'label'       => 'فروش',
            'menu_key'    => 'sales',
            'view_perm'   => 'sales.view',
            'scope_type'  => 'warehouse',
            'scope_label' => 'انبارهای مجاز (فروش)',
            'scope_api'   => '/inv/warehouses',
            'suggest_roles' => ['sales_user', 'manager'],
        ],
        'purchase' => [
            'label'       => 'خرید',
            'menu_key'    => 'purchase',
            'view_perm'   => 'purchase.view',
            'scope_type'  => 'warehouse',
            'scope_label' => 'انبارهای مجاز (خرید)',
            'scope_api'   => '/inv/warehouses',
            'suggest_roles' => ['purchase_user', 'manager'],
        ],
        'gis' => [
            'label'       => 'نقشه هوشمند',
            'menu_key'    => 'gis',
            'view_perm'   => 'gis.view',
            'scope_type'  => 'district',
            'scope_label' => 'مناطق مجاز',
            'scope_api'   => '/gis/districts',
            'suggest_roles' => ['gis_user', 'manager'],
        ],
        'eqtesad_melk' => [
            'label'         => 'اقتصاد ملک',
            'menu_key'      => 'eqtesad_melk',
            'view_perm'     => 'melk.view',
            'scope_type'    => 'district',
            'scope_label'   => 'مناطق مجاز (سرگروه)',
            'scope_api'     => '/gis/districts',
            'suggest_roles' => ['district_lead', 'melk_coordinator', 'manager'],
        ],
        'cpm' => [
            'label'       => 'کنترل پروژه',
            'menu_key'    => 'cpm',
            'view_perm'   => 'cpm.view',
            'scope_type'  => 'project',
            'scope_label' => 'پروژه‌های مجاز',
            'scope_api'   => '/pc/projects',
            'suggest_roles' => ['project_manager', 'manager'],
        ],
        'workflow' => [
            'label'       => 'Workflow پروژه‌ها',
            'menu_key'    => 'workflow',
            'view_perm'   => 'cpm.view',
            'scope_type'  => 'project',
            'scope_label' => 'پروژه‌های مجاز',
            'scope_api'   => '/pc/projects',
            'suggest_roles' => ['project_manager', 'manager'],
        ],
        'accounting' => [
            'label'       => 'حسابداری',
            'menu_key'    => 'accounting',
            'view_perm'   => 'acc.view',
            'scope_type'  => '',
            'scope_label' => '',
            'scope_api'   => '',
            'suggest_roles' => ['accountant', 'manager'],
        ],
        'treasury' => [
            'label'       => 'خزانه',
            'menu_key'    => 'treasury',
            'view_perm'   => 'treasury.view',
            'scope_type'  => '',
            'scope_label' => '',
            'scope_api'   => '',
            'suggest_roles' => ['accountant', 'manager'],
        ],
        'payroll' => [
            'label'       => 'حقوق',
            'menu_key'    => 'payroll',
            'view_perm'   => 'payroll.view',
            'scope_type'  => '',
            'scope_label' => '',
            'scope_api'   => '',
            'suggest_roles' => ['accountant', 'manager'],
        ],
        'crm' => [
            'label'       => 'CRM',
            'menu_key'    => 'crm',
            'view_perm'   => 'crm.view',
            'scope_type'  => '',
            'scope_label' => '',
            'scope_api'   => '',
            'suggest_roles' => ['manager'],
        ],
        'contracts' => [
            'label'       => 'قراردادها',
            'menu_key'    => 'contracts',
            'view_perm'   => '',
            'scope_type'  => 'project',
            'scope_label' => 'پروژه‌های مجاز',
            'scope_api'   => '/pc/projects',
            'suggest_roles' => ['project_manager', 'manager'],
        ],
        'unitsales' => [
            'label'       => 'فروش واحد',
            'menu_key'    => 'unitsales',
            'view_perm'   => '',
            'scope_type'  => 'project',
            'scope_label' => 'پروژه‌های مجاز',
            'scope_api'   => '/pc/projects',
            'suggest_roles' => ['project_manager', 'manager'],
        ],
        'permits' => [
            'label'       => 'مجوزها',
            'menu_key'    => 'permits',
            'view_perm'   => '',
            'scope_type'  => 'project',
            'scope_label' => 'پروژه‌های مجاز',
            'scope_api'   => '/pc/projects',
            'suggest_roles' => ['project_manager', 'manager'],
        ],
        'chat' => [
            'label'       => 'چت و پشتیبانی',
            'menu_key'    => 'chat',
            'view_perm'   => '',
            'scope_type'  => '',
            'scope_label' => '',
            'scope_api'   => '',
            'suggest_roles' => [],
        ],
        'wpproducts' => [
            'label'       => 'محصولات فروشگاه',
            'menu_key'    => 'wpproducts',
            'view_perm'   => '',
            'scope_type'  => '',
            'scope_label' => '',
            'scope_api'   => '',
            'suggest_roles' => [],
        ],
        'access' => [
            'label'       => 'مدیریت دسترسی‌ها',
            'menu_key'    => 'access',
            'view_perm'   => 'system.acl.manage',
            'scope_type'  => '',
            'scope_label' => '',
            'scope_api'   => '',
            'suggest_roles' => ['super_admin'],
        ],
        'users' => [
            'label'       => 'کاربران سیستم',
            'menu_key'    => 'users',
            'view_perm'   => 'system.users.manage',
            'scope_type'  => '',
            'scope_label' => '',
            'scope_api'   => '',
            'suggest_roles' => ['super_admin'],
        ],
    ];
}

/**
 * پروفایل‌های آماده دسترسی
 */
function acl_get_access_profiles(): array {
    return [
        [
            'key'         => 'inv_ops',
            'label'       => 'کاربر انبار',
            'description' => 'فقط منوی انبار — مدیریت موجودی و اسناد',
            'menu_keys'   => ['inventory'],
            'role_slugs'  => ['warehouse_keeper'],
            'scopes'      => ['warehouse' => []],
        ],
        [
            'key'         => 'sales_ops',
            'label'       => 'کاربر فروش',
            'description' => 'منوی فروش + مشاهده انبار',
            'menu_keys'   => ['sales', 'inventory'],
            'role_slugs'  => ['sales_user'],
            'scopes'      => ['warehouse' => []],
        ],
        [
            'key'         => 'purchase_ops',
            'label'       => 'کاربر خرید',
            'description' => 'منوی خرید + مشاهده انبار',
            'menu_keys'   => ['purchase', 'inventory'],
            'role_slugs'  => ['purchase_user'],
            'scopes'      => ['warehouse' => []],
        ],
        [
            'key'         => 'inv_sales_purchase',
            'label'       => 'انبار + خرید + فروش',
            'description' => 'سه منوی عملیاتی — مناسب شعبه/انبار مشخص',
            'menu_keys'   => ['inventory', 'sales', 'purchase'],
            'role_slugs'  => ['warehouse_keeper', 'sales_user', 'purchase_user'],
            'scopes'      => ['warehouse' => []],
        ],
        [
            'key'         => 'project_ops',
            'label'       => 'مدیر پروژه',
            'description' => 'کنترل پروژه + Workflow',
            'menu_keys'   => ['cpm', 'workflow'],
            'role_slugs'  => ['project_manager'],
            'scopes'      => ['project' => []],
        ],
        [
            'key'         => 'gis_ops',
            'label'       => 'کارشناس GIS',
            'description' => 'نقشه و پارسل‌ها',
            'menu_keys'   => ['gis'],
            'role_slugs'  => ['gis_user'],
            'scopes'      => ['district' => []],
        ],
        [
            'key'         => 'melk_district_lead',
            'label'       => 'سرگروه منطقه — اقتصاد ملک',
            'description' => 'مدیریت منطقه، محلات و پرونده‌های ملک',
            'menu_keys'   => ['eqtesad_melk', 'gis', 'realestate'],
            'role_slugs'  => ['district_lead'],
            'scopes'      => ['district' => []],
        ],
        [
            'key'         => 'melk_neighborhood_mgr',
            'label'       => 'مدیر محله — اقتصاد ملک',
            'description' => 'مدیریت محله و بلوک‌های زیرمجموعه',
            'menu_keys'   => ['eqtesad_melk', 'gis', 'usedash'],
            'role_slugs'  => ['neighborhood_manager'],
            'scopes'      => ['neighborhood' => []],
        ],
        [
            'key'         => 'melk_specialist',
            'label'       => 'کارشناس مشترک — اقتصاد ملک',
            'description' => 'حقوقی، شهرداری، ثبت و سایر کارشناسان سراسری',
            'menu_keys'   => ['eqtesad_melk', 'gis'],
            'role_slugs'  => ['melk_specialist'],
            'scopes'      => [],
        ],
        [
            'key'         => 'melk_coordinator',
            'label'       => 'هماهنگ‌کننده — اقتصاد ملک',
            'description' => 'نظارت سراسری شبکه بنگاه و مدیریت سازمان',
            'menu_keys'   => ['eqtesad_melk', 'gis', 'realestate'],
            'role_slugs'  => ['melk_coordinator'],
            'scopes'      => [],
        ],
        [
            'key'         => 'finance_ops',
            'label'       => 'حسابداری و خزانه',
            'description' => 'ماژول‌های مالی',
            'menu_keys'   => ['accounting', 'treasury', 'payroll'],
            'role_slugs'  => ['accountant'],
            'scopes'      => [],
        ],
        [
            'key'         => 'viewer_all',
            'label'       => 'فقط مشاهده',
            'description' => 'مشاهده همه ماژول‌های اصلی بدون ویرایش',
            'menu_keys'   => ['gis', 'inventory', 'sales', 'purchase', 'cpm', 'accounting', 'crm'],
            'role_slugs'  => ['viewer'],
            'scopes'      => [],
        ],
    ];
}

/**
 * scope typeهای یکتا برای UI
 */
function acl_get_scope_types_from_menus( array $menu_keys ): array {
    $registry = acl_get_module_registry();
    $types    = [];

    foreach ( $menu_keys as $mk ) {
        foreach ( $registry as $mod ) {
            if ( $mod['menu_key'] === $mk && ! empty( $mod['scope_type'] ) ) {
                $types[ $mod['scope_type'] ] = [
                    'scope_type'  => $mod['scope_type'],
                    'scope_label' => $mod['scope_label'],
                    'scope_api'   => $mod['scope_api'],
                ];
            }
        }
    }
    return array_values( $types );
}

/**
 * نقش‌های پیشنهادی بر اساس منوهای انتخاب‌شده
 */
function acl_suggest_roles_for_menus( array $menu_keys ): array {
    global $wpdb;
    $registry = acl_get_module_registry();
    $slugs    = [];

    foreach ( $menu_keys as $mk ) {
        foreach ( $registry as $mod ) {
            if ( $mod['menu_key'] === $mk && ! empty( $mod['suggest_roles'] ) ) {
                $slugs = array_merge( $slugs, $mod['suggest_roles'] );
            }
        }
    }
    $slugs = array_unique( $slugs );
    if ( ! $slugs ) return [];

    $placeholders = implode( ',', array_fill( 0, count( $slugs ), '%s' ) );
    return $wpdb->get_results(
        $wpdb->prepare(
            "SELECT id, slug, name, description FROM {$wpdb->prefix}acl_roles WHERE slug IN ({$placeholders}) ORDER BY sort_order",
            ...$slugs
        ),
        ARRAY_A
    ) ?? [];
}
