/**
 * کاتالوگ دسترسی‌ها و نقش‌های داخلی سیستم.
 * تمام بررسی‌های مجوز در سمت سرور و بر اساس همین کلیدها انجام می‌شود؛
 * Frontend فقط برای نمایش/عدم نمایش از آن استفاده می‌کند و هرگز مرجع امنیتی نیست.
 */

export const PERMISSIONS = {
  // محتوای خبری
  'article.create': { fa: 'ایجاد خبر', group: 'محتوا' },
  'article.edit.own': { fa: 'ویرایش خبر خود', group: 'محتوا' },
  'article.edit.any': { fa: 'ویرایش هر خبر', group: 'محتوا' },
  'article.submit': { fa: 'ارسال خبر برای بررسی', group: 'محتوا' },
  'article.review': { fa: 'بررسی و بازگرداندن خبر', group: 'محتوا' },
  'article.approve': { fa: 'تأیید خبر', group: 'محتوا' },
  'article.publish': { fa: 'انتشار خبر', group: 'محتوا' },
  'article.schedule': { fa: 'زمان‌بندی انتشار', group: 'محتوا' },
  'article.lock': { fa: 'قفل کردن خبر', group: 'محتوا' },
  'article.correct': { fa: 'ثبت اصلاحیه رسمی', group: 'محتوا' },
  'article.archive': { fa: 'بایگانی خبر', group: 'محتوا' },

  // گزارش مردمی و پرونده
  'report.view.private': { fa: 'مشاهده گزارش‌های خصوصی', group: 'گزارش' },
  'report.moderate': { fa: 'بررسی و تأیید گزارش', group: 'گزارش' },
  'report.route': { fa: 'مسیریابی گزارش', group: 'گزارش' },
  'report.assign': { fa: 'تخصیص پرونده', group: 'گزارش' },
  'report.respond': { fa: 'ثبت پاسخ رسمی', group: 'گزارش' },
  'report.close': { fa: 'بستن پرونده', group: 'گزارش' },
  'report.reopen': { fa: 'بازگشایی پرونده', group: 'گزارش' },
  'routing.manage': { fa: 'مدیریت قواعد مسیریابی', group: 'گزارش' },

  // سازمان
  'organization.manage': { fa: 'مدیریت سازمان', group: 'سازمان' },
  'organization.staff.manage': { fa: 'مدیریت کارکنان سازمان', group: 'سازمان' },
  'organization.verify': { fa: 'تأیید سازمان', group: 'سازمان' },
  'organization.message': { fa: 'ارسال پیام سازمانی', group: 'سازمان' },
  'task.manage': { fa: 'مدیریت وظایف داخلی', group: 'سازمان' },

  // کسب‌وکار و اصناف
  'business.manage': { fa: 'مدیریت کسب‌وکار', group: 'کسب‌وکار' },
  'business.verify': { fa: 'تأیید کسب‌وکار', group: 'کسب‌وکار' },
  'guild.manage': { fa: 'مدیریت اصناف', group: 'کسب‌وکار' },

  // ارتباطات
  'communication.manage': { fa: 'مدیریت کانال‌های ارتباطی', group: 'ارتباطات' },

  // آمار
  'statistics.create': { fa: 'ایجاد مجموعه داده', group: 'آمار' },
  'statistics.edit': { fa: 'ویرایش مجموعه داده', group: 'آمار' },
  'statistics.publish': { fa: 'انتشار مجموعه داده', group: 'آمار' },

  // مدیریت سیستم
  'user.manage': { fa: 'مدیریت کاربران', group: 'سیستم' },
  'role.manage': { fa: 'مدیریت نقش‌ها', group: 'سیستم' },
  'permission.manage': { fa: 'مدیریت دسترسی‌ها', group: 'سیستم' },
  'taxonomy.manage': { fa: 'مدیریت طبقه‌بندی‌ها', group: 'سیستم' },
  'media.manage': { fa: 'مدیریت رسانه', group: 'سیستم' },
  'comment.moderate': { fa: 'مدیریت دیدگاه‌ها', group: 'سیستم' },
  'audit.view': { fa: 'مشاهده لاگ حسابرسی', group: 'سیستم' },
  'analytics.view': { fa: 'مشاهده تحلیل‌ها', group: 'سیستم' },
  'settings.manage': { fa: 'مدیریت تنظیمات', group: 'سیستم' },
  'search.manage': { fa: 'مدیریت موتور جست‌وجو', group: 'سیستم' },
  'backup.manage': { fa: 'مدیریت پشتیبان‌گیری', group: 'سیستم' },
} as const;

export type PermissionKey = keyof typeof PERMISSIONS;

type RoleDef = {
  fa: string;
  scope: 'global' | 'organization' | 'business';
  permissions: PermissionKey[] | '*';
  description: string;
};

export const ROLES: Record<string, RoleDef> = {
  super_admin: {
    fa: 'مدیر ارشد سیستم',
    scope: 'global',
    permissions: '*',
    description: 'دسترسی کامل؛ اما قوانین تغییرناپذیری آرشیو برای این نقش هم اعمال می‌شود.',
  },
  admin: {
    fa: 'مدیر سایت',
    scope: 'global',
    description: 'مدیریت کل محتوا و کاربران بدون دسترسی به تنظیمات بحرانی زیرساخت.',
    permissions: [
      'article.create', 'article.edit.any', 'article.review', 'article.approve', 'article.publish',
      'article.schedule', 'article.lock', 'article.correct', 'article.archive',
      'report.view.private', 'report.moderate', 'report.route', 'report.assign', 'report.close', 'report.reopen',
      'routing.manage', 'organization.manage', 'organization.verify', 'organization.staff.manage',
      'business.manage', 'business.verify', 'guild.manage', 'communication.manage',
      'statistics.create', 'statistics.edit', 'statistics.publish',
      'user.manage', 'taxonomy.manage', 'media.manage', 'comment.moderate',
      'audit.view', 'analytics.view', 'search.manage',
    ],
  },
  second_admin: {
    fa: 'مدیر دوم',
    scope: 'global',
    description: 'جانشین مدیر سایت با دسترسی محدودتر در حوزه کاربران و امنیت.',
    permissions: [
      'article.create', 'article.edit.any', 'article.review', 'article.approve', 'article.publish',
      'article.correct', 'report.view.private', 'report.moderate', 'report.route', 'report.assign',
      'business.verify', 'organization.verify', 'statistics.publish', 'comment.moderate',
      'analytics.view', 'audit.view',
    ],
  },
  editor_in_chief: {
    fa: 'سردبیر',
    scope: 'global',
    description: 'مسئول نهایی تحریریه.',
    permissions: [
      'article.create', 'article.edit.any', 'article.review', 'article.approve', 'article.publish',
      'article.schedule', 'article.lock', 'article.correct', 'article.archive',
      'statistics.publish', 'comment.moderate', 'analytics.view',
    ],
  },
  content_editor: {
    fa: 'ویراستار محتوا',
    scope: 'global',
    description: 'بررسی و ویرایش محتوا پیش از انتشار.',
    permissions: ['article.create', 'article.edit.any', 'article.review', 'article.approve', 'comment.moderate'],
  },
  reporter: {
    fa: 'خبرنگار',
    scope: 'global',
    description: 'تولید خبر و ارسال برای بررسی.',
    permissions: ['article.create', 'article.edit.own', 'article.submit'],
  },
  journalist: {
    fa: 'روزنامه‌نگار',
    scope: 'global',
    description: 'تولید گزارش و تحلیل.',
    permissions: ['article.create', 'article.edit.own', 'article.submit'],
  },
  data_editor: {
    fa: 'دبیر داده',
    scope: 'global',
    description: 'مدیریت مجموعه‌داده‌ها و روزنامه‌نگاری داده.',
    permissions: ['statistics.create', 'statistics.edit', 'statistics.publish', 'article.create', 'article.edit.own', 'article.submit'],
  },
  researcher: {
    fa: 'پژوهشگر',
    scope: 'global',
    description: 'دسترسی پژوهشی به داده و آرشیو.',
    permissions: ['statistics.create', 'statistics.edit', 'article.create', 'article.edit.own'],
  },
  moderator: {
    fa: 'ناظر محتوا',
    scope: 'global',
    description: 'بررسی گزارش‌های مردمی و دیدگاه‌ها.',
    permissions: ['report.moderate', 'report.route', 'report.view.private', 'comment.moderate'],
  },
  organization_manager: {
    fa: 'مدیر سازمان',
    scope: 'organization',
    description: 'مدیریت کامل فضای کاری یک سازمان.',
    permissions: [
      'organization.manage', 'organization.staff.manage', 'organization.message',
      'report.assign', 'report.respond', 'report.close', 'report.view.private',
      'task.manage', 'communication.manage', 'statistics.create', 'analytics.view',
    ],
  },
  organization_staff: {
    fa: 'کارمند سازمان',
    scope: 'organization',
    description: 'رسیدگی به پرونده‌های ارجاع‌شده.',
    permissions: ['report.respond', 'report.view.private', 'task.manage'],
  },
  pr_officer: {
    fa: 'مسئول روابط عمومی',
    scope: 'organization',
    description: 'انتشار پاسخ رسمی و مدیریت کانال‌های ارتباطی سازمان.',
    permissions: ['report.respond', 'report.view.private', 'communication.manage', 'organization.message'],
  },
  verified_official: {
    fa: 'مقام رسمی تأییدشده',
    scope: 'organization',
    description: 'مقام رسمی با امکان پاسخ نشان‌دار.',
    permissions: ['report.respond', 'report.view.private'],
  },
  business_owner: {
    fa: 'صاحب کسب‌وکار',
    scope: 'business',
    description: 'مدیریت کامل صفحه کسب‌وکار خود.',
    permissions: ['business.manage', 'report.respond', 'report.view.private'],
  },
  business_manager: {
    fa: 'مدیر فروشگاه',
    scope: 'business',
    description: 'مدیریت شعبه و پاسخ به گزارش‌ها.',
    permissions: ['business.manage', 'report.respond'],
  },
  guild_manager: {
    fa: 'مدیر صنف',
    scope: 'global',
    description: 'مدیریت صنف و اعضای آن.',
    permissions: ['guild.manage', 'business.verify', 'report.respond', 'report.view.private'],
  },
  citizen: {
    fa: 'شهروند',
    scope: 'global',
    description: 'کاربر عادی؛ ثبت گزارش و پیگیری پرونده خود.',
    permissions: [],
  },
};

export function permissionsForRole(roleKey: string): PermissionKey[] {
  const role = ROLES[roleKey];
  if (!role) return [];
  if (role.permissions === '*') return Object.keys(PERMISSIONS) as PermissionKey[];
  return role.permissions;
}
