/**
 * v-hasPermi 操作权限处理
 * Copyright (c) 2019 ruoyi
 */

import usePermissionStore from '@/store/permission.js';
import { useUserStore } from '@/store/user.ts';
import { nextTick } from 'vue';

export default {
    mounted(el, binding) {
        // 使用nextTick确保DOM完全渲染后再执行权限检查
        nextTick(() => {
            try {
                const { value } = binding;
                // eslint-disable-next-line camelcase
                const all_permission = '*:*:*';
                const permissionStore = usePermissionStore();
                const userStore = useUserStore();

                // 获取权限数据 - 优先使用菜单权限，如果没有则使用用户权限
                const permissions = permissionStore.userPermission && permissionStore.userPermission.length > 0 
                    ? permissionStore.userPermission 
                    : userStore.permissions;

                // 检查是否是超级管理员 - 只检查用户store中的权限，避免权限数据不一致
                const isSuperAdmin = userStore.permissions.includes('*:*:*') || userStore.roles.includes('admin');

                if (value && value instanceof Array && value.length > 0) {
                    const permissionFlag = value;

                    const hasPermissions = permissions.some((permission) => {
                        // eslint-disable-next-line camelcase
                        return all_permission === permission || permissionFlag.includes(permission);
                    });

                    // 只有非超级管理员且没有相应权限时才隐藏元素
                    if (!hasPermissions && !isSuperAdmin) {
                        // 安全地隐藏元素，避免DOM操作错误
                        try {
                            // 检查元素是否还在DOM中
                            if (el && el.parentNode && document.contains(el)) {
                                el.parentNode.removeChild(el);
                            } else {
                                // 如果元素不在DOM中或parentNode为null，使用display:none隐藏
                                el.style.display = 'none';
                                el.style.visibility = 'hidden';
                            }
                        } catch (error) {
                            console.warn('移除权限元素时出错:', error);
                            // 如果移除失败，使用CSS隐藏元素
                            el.style.display = 'none';
                            el.style.visibility = 'hidden';
                        }
                    }
                } else {
                    console.warn('权限指令缺少必要的权限值:', value);
                    // 不抛出错误，只是隐藏元素
                    el.style.display = 'none';
                }
            } catch (error) {
                console.error('权限指令执行出错:', error);
                // 出错时隐藏元素，避免影响页面渲染
                el.style.display = 'none';
            }
        });
    },
};
