import { useCommonStore } from "~/stores/commonStore";
import { useAuthStore } from "~/stores/authStore";

// plugins/my-directive.ts
export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.vueApp.directive("can", {
    // called before bound element's attributes
    // or event listeners are applied
    created(el, binding, vnode) {
      // see below for details on arguments

      if (vnode.elm && !isSuperAdmin()) {
        if (binding.value != "" && !hasPermission(binding.value)) {
          if (binding.modifiers.checkbox || binding.modifiers.radio) {
            vnode.elm.classList.add("disabled");
            vnode.elm.disabled = true;
          } else {
            vnode.elm.remove();
          }
        }
      }
    },
    // called right before the element is inserted into the DOM.
    beforeMount(el, binding, vnode) {},
    // called when the bound element's parent component
    // and all its children are mounted.
    mounted(el, binding, vnode) {},
    // called before the parent component is updated
    beforeUpdate(el, binding, vnode, prevVnode) {},
    // called after the parent component and
    // all of its children have updated
    updated(el, binding, vnode, prevVnode) {
      if (vnode.elm && !isSuperAdmin()) {
        if (binding.value != "" && !hasPermission(binding.value)) {
          if (binding.modifiers.checkbox || binding.modifiers.radio) {
            vnode.elm.classList.add("disabled");
            vnode.elm.disabled = true;
          } else {
            vnode.elm.remove();
          }
        }
      }
    },
    // called before the parent component is unmounted
    beforeUnmount(el, binding, vnode) {},
    // called when the parent component is unmounted
    unmounted(el, binding, vnode) {},

    getSSRProps(binding, vnode) {
      // You can provide SSR-specific props here
      return {};
    },
  });
});

function hasPermission(permission) {
  const CommonStore = useCommonStore();

  if (CommonStore.userPermisionGetter && CommonStore.userPermisionGetter.length)
    return CommonStore.userPermisionGetter.includes(permission);

  // if (CommonStore.getters.userPermisionGetter.includes(binding.value)) {
  // vnode.elm.style.display = 'none!important';
  // vnode.elm.classList.add('disabled');
  // vnode.elm.disabled = true;
  // vnode.elm.title = 'عدم دسترسی';
}

function isSuperAdmin() {
  const CommonStore = useAuthStore();

  // user with id = 2 is super admin
  return CommonStore?.currentUser?.user_level > 1;
}