/**
 * DataScope resource 常量（规则 §5.3.1.3 Resource 命名规范）
 *
 * 统一 snake_case 名词单数，附属资源跟随父资源。
 * 新增业务模块时在此文件追加常量，@DataScope 装饰器只接受此处列出的值，
 * 避免"resource 拼写错误导致静默降级到 SELF"的隐蔽 bug（§5.3.17）。
 *
 * 合规要求：每个常量值必须在 permissions.seed.ts 里至少对应一条权限码
 * （如 `user:read` 说明 `user` resource 合法存在）。
 */
export const DATA_SCOPE_RESOURCE = {
  WILDCARD: '*',

  // Organization 模块
  USER: 'user',
  DEPARTMENT: 'department',
  POSITION: 'position',
  ORGANIZATION: 'organization',
  REGION: 'region',
  ROLE: 'role',
  PERMISSION: 'permission',

  // 业务域
  PURCHASE_ORDER: 'purchase_order',
  EXPENSE_REQUEST: 'expense_request',
  CONTRACT_REQUEST: 'contract_request',
  APPROVAL: 'approval',
  FORM_TEMPLATE: 'form_template',
  FORM_INSTANCE: 'form_instance',
  MEETING: 'meeting',
  ATTENDANCE: 'attendance',
  PART: 'part',
  TICKET: 'ticket',
  KNOWLEDGE_ARTICLE: 'knowledge_article',
  PERFORMANCE_CYCLE: 'performance_cycle',
  ROBOT_UNIT: 'robot_unit',

  // IAM 治理
  DELEGATION: 'delegation',
  ACCESS_REVIEW: 'access_review',

  // 模块级 resource（permission 码用，DataScope 暂未接入业务模块）
  AI_TOOL: 'ai_tool',
  AUDIT: 'audit',
  AUTOMATION: 'automation',
  DEVTRACKER: 'devtracker',
  FEEDBACK: 'feedback',
  FORM: 'form',
  HR: 'hr',
  LOG: 'log',
  MEETING_ATTENDANCE: 'meeting_attendance',
  NOTIFICATION: 'notification',
  PERFORMANCE: 'performance',
  SYSTEM: 'system',
  WORKFLOW: 'workflow',
  WORK_RECORD: 'work_record',
} as const;

/**
 * 历史命名豁免：以下 resource 已被 controller 大量绑定使用（如 'parts:read' × 91 处），
 * 改名属破坏性变更（涉及 db RolePermission 数据 + 大量 controller decorator）。
 * 列入 docs/todos/iam-data-scope-naming-debt.md，后续单独 PR 协调 controller + seed 一起换。
 *
 * **不暴露在 DataScopeResource 类型里**——避免静态层"祝福"违规命名，让 IDE 自动补全只看到
 * 推荐值；只在 seed 校验脚本和兼容查询时通过本 Set 放行。
 */
export const LEGACY_DATA_SCOPE_RESOURCES: ReadonlySet<string> = new Set([
  'org',
  'parts',
  'site-attendance',
  'robot-manager',
]);

export type DataScopeResource =
  (typeof DATA_SCOPE_RESOURCE)[keyof typeof DATA_SCOPE_RESOURCE];

/**
 * 所有已登记的 resource 值集合（用于 seed 校验）。包含正式常量 + 历史豁免。
 */
export const KNOWN_DATA_SCOPE_RESOURCES: Set<string> = new Set([
  ...Object.values(DATA_SCOPE_RESOURCE),
  ...LEGACY_DATA_SCOPE_RESOURCES,
]);
