import { debounce } from 'lodash-es';
import { authStore } from "@/store/modules/authorize.js";
import { storeToRefs } from 'pinia';
export default (app) => {
  // 获取授权信息
  const authorizeData = authStore();
  const { ruleBtn } = storeToRefs(authorizeData);

  // 定义自定义指令
  const directives = {
    // 指令: 禁止输入空格 v-no-space
    'no-space': {
      mounted(el) {
        // 获取输入元素
        const input = el.tagName === 'INPUT' ? el : el.querySelector('input');
        if (!input) return;

        // 防抖处理输入事件，去除空格
        const handleInput = debounce((e) => {
          const value = e.target.value;
          const trimmedValue = value.replace(/\s/g, '');
          if (value !== trimmedValue) {
            e.target.value = trimmedValue;
            // 创建一次性的input事件
            const inputEvent = new InputEvent('input', { bubbles: true });
            e.target.dispatchEvent(inputEvent);
          }
        }, 100);

        // 监听输入事件
        input.addEventListener('input', handleInput);

        // 存储清理函数
        el._cleanup = () => input.removeEventListener('input', handleInput);
      },
      unmounted(el) {
        // 清理事件监听
        el._cleanup?.();
      }
    },

    // 指令: 上拉加载更多 v-loadmore
    'loadmore': {
      mounted(el, binding) {
        // 获取滚动容器
        const scrollBox = el.querySelector('.v-scroll-box .scroll-box');
        if (!scrollBox) {
          console.warn('v-loadmore: 未找到可滚动元素');
          return;
        }

        // 防抖处理滚动事件，检测是否接近底部
        const handleScroll = debounce(() => {
          const { scrollHeight, scrollTop, clientHeight } = scrollBox;
          const threshold = 50; // 提前触发的距离
          const isNearBottom = scrollHeight - scrollTop - clientHeight <= threshold;

          // 如果接近底部且绑定值为函数，则调用该函数
          if (isNearBottom && typeof binding.value === 'function') {
            binding.value();
          }
        }, 200);

        // 监听滚动事件
        scrollBox.addEventListener('scroll', handleScroll, { passive: true });

        // 存储清理函数
        el._cleanup = () => scrollBox.removeEventListener('scroll', handleScroll);
      },
      unmounted(el) {
        // 清理事件监听
        el._cleanup?.();
      }
    },

    // 指令: 权限控制 v-permission
    'permission': {
      mounted(el, binding) {
        if (!binding.value) return;

        // 获取按钮权限列表
        const btnList = ruleBtn.value;
        // 检查是否有权限
        const hasPermission = btnList.includes(binding.value);
// 工具函数: 安全地移除DOM元素
        const safeRemoveElement = (el) => {
          el.style.display = 'none';
          requestAnimationFrame(() => el.parentNode?.removeChild(el));
        };
        // 如果没有权限，安全移除元素
        if (!hasPermission) {
          safeRemoveElement(el);
        }
      }
    }
  };

  // 注册自定义指令
  Object.entries(directives).forEach(([name, directive]) => {
    app.directive(name, directive);
  });

  // 权限检查函数
  const hasPermission = (permissions) => {
    const permissionList = ruleBtn.value;
    if (!permissionList.length) return false;

    const requiredPermissions = Array.isArray(permissions) ? permissions : [permissions];
    return requiredPermissions.some(permission => permissionList.includes(permission));
  };

  // 将权限检查函数添加到全局属性，并使用代理进行缓存
  app.config.globalProperties.$hadRule = new Proxy(hasPermission, {
    // 创建缓存Map
    cache: new Map(),
    // 代理函数调用
    apply(target, thisArg, args) {
      // 将参数序列化作为缓存key
      const key = JSON.stringify(args);
      // 如果缓存中存在，直接返回缓存结果
      if (this.cache.has(key)) {
        return this.cache.get(key);
      }

      // 如果缓存中不存在，执行原函数并缓存结果
      const result = target.apply(thisArg, args);
      this.cache.set(key, result);
      return result;
    }
  });
};