import { useCallback, useMemo } from 'react';
import { useAuthStore } from '@/features/auth/store/authStore';
import type { PermissionCheck, PermissionName } from '@/features/auth/constants/permissions';

function matchesPermission(userPermissions: string[], required: PermissionCheck): boolean {
  const list = Array.isArray(required) ? required : [required];
  return list.some((permission) => userPermissions.includes(permission));
}

export function usePermissions() {
  const user = useAuthStore((state) => state.user);
  const isLoading = useAuthStore((state) => state.isLoading);

  const permissions = useMemo(() => user?.permissions ?? [], [user?.permissions]);
  const isSuperAdmin = Boolean(user?.is_super_admin);

  const can = useCallback(
    (required?: PermissionCheck): boolean => {
      if (!required) {
        return true;
      }
      if (!user) {
        return false;
      }
      if (isSuperAdmin) {
        return true;
      }
      return matchesPermission(permissions, required);
    },
    [user, isSuperAdmin, permissions],
  );

  const canAny = useCallback(
    (required: PermissionName[]): boolean => {
      if (!user) {
        return false;
      }
      if (isSuperAdmin) {
        return true;
      }
      return required.some((permission) => permissions.includes(permission));
    },
    [user, isSuperAdmin, permissions],
  );

  const canAll = useCallback(
    (required: PermissionName[]): boolean => {
      if (!user) {
        return false;
      }
      if (isSuperAdmin) {
        return true;
      }
      return required.every((permission) => permissions.includes(permission));
    },
    [user, isSuperAdmin, permissions],
  );

  return {
    can,
    canAny,
    canAll,
    permissions,
    isSuperAdmin,
    isReady: !isLoading && Boolean(user),
  };
}
