export const ACCESS_GRANTS = {
  REQUESTS_ALL: "requests:all",
  TRANSACTIONS_ALL: "transactions:all",
  PAYMENT_BATCH_CARDS_ALL: "paymentBatchCards:all",
  PAYMENT_CARDS_ALL: "paymentCards:all",
  PAYMENT_SLIPS_ALL: "paymentSlips:all",
  NEWS_ALL: "news:all",
  MESSAGES_ALL: "messages:all",
};

export const ACCESS_GRANT_DEFINITIONS = [
  {
    key: ACCESS_GRANTS.REQUESTS_ALL,
    resource: "requests",
    label: "همه درخواست‌ها",
    description: "مشاهده و مدیریت همه درخواست‌ها بدون فیلتر مالکیت",
  },
  {
    key: ACCESS_GRANTS.TRANSACTIONS_ALL,
    resource: "transactions",
    label: "همه تراکنش‌ها",
    description: "مشاهده و مدیریت همه تراکنش‌ها بدون فیلتر مالکیت",
  },
  {
    key: ACCESS_GRANTS.PAYMENT_BATCH_CARDS_ALL,
    resource: "paymentBatchCards",
    label: "همه بسته‌های کارت هدیه",
    description: "مشاهده و مدیریت همه بسته‌های کارت هدیه",
  },
  {
    key: ACCESS_GRANTS.PAYMENT_CARDS_ALL,
    resource: "paymentCards",
    label: "همه کارت‌های هدیه",
    description: "مشاهده و مدیریت همه کارت‌های هدیه",
  },
  {
    key: ACCESS_GRANTS.PAYMENT_SLIPS_ALL,
    resource: "paymentSlips",
    label: "همه فیش‌های پرداخت",
    description: "مشاهده و مدیریت همه فیش‌های پرداخت",
  },
  {
    key: ACCESS_GRANTS.NEWS_ALL,
    resource: "news",
    label: "همه خبرها",
    description: "دسترسی کامل به همه خبرها در بخش مدیریت",
  },
  {
    key: ACCESS_GRANTS.MESSAGES_ALL,
    resource: "messages",
    label: "همه پیام‌ها",
    description: "مشاهده همه پیام‌ها بدون محدودیت مخاطب یا سازنده",
  },
];

const ACCESS_GRANT_KEY_SET = new Set(
  ACCESS_GRANT_DEFINITIONS.map((item) => item.key),
);

export const normalizeAccessGrants = (value) => {
  const values = Array.isArray(value)
    ? value
    : typeof value === "string"
      ? value
          .split(",")
          .map((item) => item.trim())
          .filter(Boolean)
      : [];

  return [...new Set(values)].filter((item) => ACCESS_GRANT_KEY_SET.has(item));
};

export const hasAccessGrant = (user, grantKey) => {
  if (!user || !grantKey) {
    return false;
  }

  if (user.role?.isSuperAdmin || user.role?.value === "superAdmin") {
    return true;
  }

  return normalizeAccessGrants(user.accessGrants).includes(grantKey);
};

export const hasAllResourceAccess = (user, resource) =>
  hasAccessGrant(user, `${resource}:all`);
