/**
 * Roles, permissions and the seeded demo accounts (§33, §34, §57).
 *
 * Permissions are the unit of authorisation everywhere in the app: API routes check a
 * permission key, never a role name, so adding a role is a data change rather than a
 * code change.
 */

export interface PermissionSeed {
  key: string
  resource: string
  action: string
  description: string
  descriptionAr: string
}

function p(
  key: string,
  description: string,
  descriptionAr: string,
): PermissionSeed {
  const [resource, ...rest] = key.split('.')
  return { key, resource, action: rest.join('.'), description, descriptionAr }
}

export const PERMISSIONS: PermissionSeed[] = [
  p('grid.read', 'View live grid status and stability', 'عرض حالة الشبكة واستقرارها المباشر'),
  p('grid.map.read', 'View the national GIS map', 'عرض الخريطة الجغرافية الوطنية'),
  p('assets.read', 'View assets and their passports', 'عرض الأصول وبطاقاتها الرقمية'),
  p('assets.create', 'Register new assets', 'تسجيل أصول جديدة'),
  p('assets.update', 'Edit asset records', 'تعديل بيانات الأصول'),
  p('assets.delete', 'Remove assets', 'حذف الأصول'),
  p('telemetry.read', 'View raw sensor measurements', 'عرض قياسات المستشعرات الخام'),
  p('predictions.read', 'View AI predictions and explanations', 'عرض تنبؤات الذكاء الاصطناعي وتفسيراتها'),
  p('predictions.create', 'Generate new predictions on demand', 'توليد تنبؤات جديدة عند الطلب'),
  p('dna.read', 'View Failure DNA patterns and matches', 'عرض بصمات الأعطال وتطابقاتها'),
  p('dna.manage', 'Create and retire Failure DNA patterns', 'إنشاء بصمات الأعطال وإيقافها'),
  p('scenarios.read', 'View what-if scenarios', 'عرض السيناريوهات الافتراضية'),
  p('scenarios.create', 'Create custom scenarios', 'إنشاء سيناريوهات مخصصة'),
  p('scenarios.delete', 'Delete custom scenarios', 'حذف السيناريوهات المخصصة'),
  p('simulations.read', 'View simulation results', 'عرض نتائج المحاكاة'),
  p('simulations.run', 'Run digital-twin simulations', 'تشغيل محاكاة التوأم الرقمي'),
  p('recommendations.read', 'View AI preventive recommendations', 'عرض التوصيات الوقائية'),
  p('recommendations.approve', 'Approve a recommended action', 'اعتماد إجراء موصى به'),
  p('recommendations.execute', 'Mark an approved action as executed', 'تسجيل تنفيذ إجراء معتمد'),
  p('alerts.read', 'View alerts', 'عرض التنبيهات'),
  p('alerts.acknowledge', 'Acknowledge alerts', 'الإقرار باستلام التنبيهات'),
  p('alerts.assign', 'Assign alerts to operators', 'إسناد التنبيهات للمشغلين'),
  p('alerts.resolve', 'Resolve and close alerts', 'إغلاق التنبيهات ومعالجتها'),
  p('incidents.read', 'View incidents and replays', 'عرض الحوادث وإعادة تشغيلها'),
  p('incidents.manage', 'Create and edit incident records', 'إنشاء سجلات الحوادث وتعديلها'),
  p('maintenance.read', 'View maintenance plans and history', 'عرض خطط الصيانة وسجلاتها'),
  p('maintenance.manage', 'Schedule and complete maintenance', 'جدولة الصيانة وإغلاقها'),
  p('forecast.read', 'View load forecasts', 'عرض توقعات الأحمال'),
  p('renewables.read', 'View renewable intelligence', 'عرض ذكاء الطاقة المتجددة'),
  p('copilot.use', 'Use the NABDH Copilot', 'استخدام مساعد نَبْض'),
  p('executive.read', 'View the executive dashboard', 'عرض لوحة الإدارة التنفيذية'),
  p('models.read', 'View AI model registry and metrics', 'عرض سجل النماذج ومؤشراتها'),
  p('models.manage', 'Promote, retire and audit models', 'ترقية النماذج وإيقافها وتدقيقها'),
  p('integrations.read', 'View integration architecture', 'عرض معمارية التكامل'),
  p('integrations.manage', 'Configure integrations', 'تهيئة التكاملات'),
  p('audit.read', 'Read the audit log', 'قراءة سجل التدقيق'),
  p('settings.read', 'View platform settings', 'عرض إعدادات المنصة'),
  p('settings.manage', 'Change platform settings and risk weights', 'تعديل الإعدادات وأوزان الخطر'),
  p('users.read', 'View users', 'عرض المستخدمين'),
  p('users.manage', 'Create, edit and deactivate users', 'إنشاء المستخدمين وتعديلهم وتعطيلهم'),
  p('roles.read', 'View roles and permissions', 'عرض الأدوار والصلاحيات'),
  p('roles.manage', 'Change role permissions', 'تعديل صلاحيات الأدوار'),
  p('twin.read', 'View the digital twin', 'عرض التوأم الرقمي'),
  p('twin.simulate', 'Run simulations inside the twin sandbox', 'تشغيل المحاكاة داخل مختبر التوأم'),
  p('twin.snapshot', 'Capture and restore twin snapshots', 'التقاط لقطات التوأم واستعادتها'),
  p('resilience.run', 'Run resilience tests and the adversarial search', 'تشغيل اختبارات الصمود والبحث الخصومي'),
  p('agents.read', 'View AI agent analysis', 'عرض تحليل وكلاء الذكاء الاصطناعي'),
  p('agents.run', 'Run an orchestrated agent pass', 'تشغيل جولة تحليل منسّقة للوكلاء'),
  p('cascade.run', 'Run cascading-failure simulations', 'تشغيل محاكاة الأعطال المتتالية'),
  p('counterfactual.run', 'Search for minimum interventions', 'البحث عن أقل تدخل ممكن'),
  p('optimization.run', 'Run strategy optimisation and the Self-Healing Lab', 'تشغيل تحسين الاستراتيجيات ومختبر التعافي الذاتي'),
  p('stress.run', 'Run grid stress tests', 'تشغيل اختبارات إجهاد الشبكة'),
  p('knowledge.read', 'Explore the energy knowledge graph', 'استكشاف الرسم المعرفي للطاقة'),
  p('decisions.read', 'View decision records', 'عرض سجلات القرارات'),
  p('decisions.approve', 'Approve a decision as operator', 'اعتماد القرار كمشغل'),
  p('decisions.supervise', 'Approve a decision as supervisor', 'اعتماد القرار كمشرف'),
  p('warroom.access', 'Enter the AI War Room', 'الدخول إلى غرفة عمليات الذكاء الاصطناعي'),
  p('demo.run', 'Start and drive Demo Mode', 'تشغيل وضع العرض والتحكم فيه'),
  p('presentation.use', 'Enter Presentation and Control Room modes', 'الدخول إلى وضعي العرض وغرفة التحكم'),

  // ── 4.0 ────────────────────────────────────────────────────────────────────
  p('physics.read', 'View engineering constraints and operating envelopes', 'عرض القيود الهندسية ومظاريف التشغيل'),
  p('physics.validate', 'Run the physics validator against a strategy', 'تشغيل مدقق الفيزياء على استراتيجية'),
  p('physics.manage', 'Change engineering constraints', 'تعديل القيود الهندسية'),
  p('verification.read', 'View model-versus-reality verification', 'عرض التحقق بين النموذج والواقع'),
  p('verification.run', 'Record and close verification runs', 'تسجيل جولات التحقق وإغلاقها'),
  p('discovery.read', 'View discovered scenarios', 'عرض السيناريوهات المكتشفة'),
  p('discovery.run', 'Run autonomous scenario discovery', 'تشغيل الاكتشاف الذاتي للسيناريوهات'),
  p('evidence.read', 'Open Evidence Mode for a decision', 'فتح وضع الأدلة لقرار ما'),
  p('memory.read', 'Search decision memory', 'البحث في ذاكرة القرارات'),
  p('memory.write', 'Record outcomes and lessons', 'تسجيل النتائج والدروس'),
  p('learning.read', 'View learning candidates', 'عرض مرشحات التعلم'),
  p('learning.review', 'Approve or reject a learning candidate', 'اعتماد أو رفض مرشح تعلم'),
  p('datahealth.read', 'View the data health command center', 'عرض مركز صحة البيانات'),
  p('governance.read', 'View model governance and drift', 'عرض حوكمة النماذج والانحراف'),
  p('governance.manage', 'Move a model through its lifecycle', 'نقل النموذج عبر دورة حياته'),

  // ── 4.1 ────────────────────────────────────────────────────────────────────
  p('integrations.sync', 'Test and synchronise a data source', 'اختبار مصدر بيانات ومزامنته'),
  p('integrations.map', 'Edit field mappings', 'تعديل ربط الحقول'),
  p('integrations.simulate', 'Inject a connector fault in demo mode', 'حقن عطل موصّل في وضع العرض'),
  p('riskhunter.read', 'View risk hunts and their findings', 'عرض عمليات صيد المخاطر ونتائجها'),
  p('riskhunter.run', 'Run an autonomous risk hunt', 'تشغيل صيد ذاتي للمخاطر'),
  p('proof.read', 'Open a decision proof and its replay', 'فتح إثبات القرار وإعادة تشغيله'),
  p('proof.create', 'Freeze an analysis into a decision proof', 'تجميد التحليل في إثبات قرار'),
]

export const ALL_PERMISSION_KEYS = PERMISSIONS.map((x) => x.key)

const READ_ONLY_CORE = [
  'grid.read',
  'grid.map.read',
  'assets.read',
  'alerts.read',
  'predictions.read',
  'forecast.read',
  'renewables.read',
  'agents.read',
  'knowledge.read',
  'twin.read',
  // 4.0: the honesty surfaces are readable by everyone who can see the grid at all.
  // Hiding how confident the platform is, or how well it has been performing, from the
  // people reading its output would defeat the point of measuring it.
  'verification.read',
  'physics.read',
  'evidence.read',
  'datahealth.read',
  // 4.1: a proof is the answer to "why should I believe this", so it travels with the
  // recommendation rather than sitting behind a privilege.
  'proof.read',
  'riskhunter.read',
]

export interface RoleSeed {
  key: string
  name: string
  nameAr: string
  description: string
  descriptionAr: string
  level: number
  permissions: string[]
}

export const ROLES: RoleSeed[] = [
  {
    key: 'system_admin',
    name: 'System Administrator',
    nameAr: 'مدير النظام',
    description: 'Full platform administration, including users, roles, models and settings.',
    descriptionAr: 'إدارة كاملة للمنصة تشمل المستخدمين والأدوار والنماذج والإعدادات.',
    level: 100,
    permissions: ALL_PERMISSION_KEYS,
  },
  {
    key: 'executive',
    name: 'Executive',
    nameAr: 'قيادة تنفيذية',
    description: 'Strategic view of grid health, risk exposure and prevention performance.',
    descriptionAr: 'رؤية استراتيجية لصحة الشبكة ومستوى المخاطر وأداء الوقاية.',
    level: 80,
    permissions: [
      ...READ_ONLY_CORE,
      'executive.read',
      'incidents.read',
      'dna.read',
      'simulations.read',
      'decisions.read',
      'warroom.access',
      'decisions.supervise',
      'copilot.use',
      'presentation.use',
    ],
  },
  {
    key: 'control_operator',
    name: 'Control Center Operator',
    nameAr: 'مشغل مركز التحكم',
    description: 'Runs the grid in real time: acknowledges alerts, simulates and approves actions.',
    descriptionAr: 'يشغّل الشبكة لحظيًا: يستلم التنبيهات ويحاكي الإجراءات ويعتمدها.',
    level: 70,
    permissions: [
      ...READ_ONLY_CORE,
      'telemetry.read',
      'predictions.create',
      'dna.read',
      'scenarios.read',
      'scenarios.create',
      'scenarios.delete',
      'simulations.read',
      'simulations.run',
      'recommendations.read',
      'recommendations.approve',
      'recommendations.execute',
      'alerts.acknowledge',
      'alerts.assign',
      'alerts.resolve',
      'incidents.read',
      'incidents.manage',
      'maintenance.read',
      'copilot.use',
      'agents.run',
      'cascade.run',
      'counterfactual.run',
      'optimization.run',
      'stress.run',
      'twin.simulate',
      'twin.snapshot',
      'resilience.run',
      'decisions.read',
      'decisions.approve',
      'warroom.access',
      'demo.run',
      'presentation.use',
      'integrations.read',
      'physics.validate',
      'verification.run',
      'discovery.read',
      'discovery.run',
      'memory.read',
      'memory.write',
      'learning.read',
      'governance.read',
      'integrations.sync',
      'integrations.map',
      'integrations.simulate',
      'riskhunter.run',
      'proof.create',
    ],
  },
  {
    key: 'engineer',
    name: 'Engineer',
    nameAr: 'مهندس',
    description: 'Deep technical view of assets, telemetry, models and scenario analysis.',
    descriptionAr: 'رؤية فنية معمقة للأصول والقياسات والنماذج وتحليل السيناريوهات.',
    level: 60,
    permissions: [
      ...READ_ONLY_CORE,
      'assets.update',
      'telemetry.read',
      'predictions.create',
      'dna.read',
      'scenarios.read',
      'scenarios.create',
      'simulations.read',
      'simulations.run',
      'recommendations.read',
      'alerts.acknowledge',
      'incidents.read',
      'maintenance.read',
      'agents.run',
      'cascade.run',
      'counterfactual.run',
      'optimization.run',
      'stress.run',
      'twin.simulate',
      'twin.snapshot',
      'resilience.run',
      'decisions.read',
      'models.read',
      'copilot.use',
      'presentation.use',
      'integrations.read',
      'physics.validate',
      'discovery.read',
      'discovery.run',
      'memory.read',
      'learning.read',
      'governance.read',
      'integrations.sync',
      'riskhunter.run',
      'proof.create',
    ],
  },
  {
    key: 'maintenance_engineer',
    name: 'Maintenance Engineer',
    nameAr: 'مهندس صيانة',
    description: 'Owns predictive maintenance: work orders, condition history and asset health.',
    descriptionAr: 'مسؤول عن الصيانة التنبؤية: أوامر العمل وسجل الحالة وصحة الأصول.',
    level: 50,
    permissions: [
      ...READ_ONLY_CORE,
      'telemetry.read',
      'dna.read',
      'maintenance.read',
      'maintenance.manage',
      'alerts.acknowledge',
      'incidents.read',
      'decisions.read',
      'recommendations.read',
      'copilot.use',
    ],
  },
  {
    key: 'analyst',
    name: 'Analyst',
    nameAr: 'محلل',
    description: 'Studies patterns, runs scenarios and reviews model performance.',
    descriptionAr: 'يدرس الأنماط ويشغّل السيناريوهات ويراجع أداء النماذج.',
    level: 40,
    permissions: [
      ...READ_ONLY_CORE,
      'telemetry.read',
      'dna.read',
      'scenarios.read',
      'scenarios.create',
      'simulations.read',
      'simulations.run',
      'recommendations.read',
      'incidents.read',
      'maintenance.read',
      'models.read',
      'cascade.run',
      'counterfactual.run',
      'stress.run',
      'twin.simulate',
      'resilience.run',
      'decisions.read',
      'copilot.use',
      'executive.read',
      'discovery.read',
      'discovery.run',
      'memory.read',
      'learning.read',
      'governance.read',
      'riskhunter.run',
      'proof.create',
    ],
  },
  {
    key: 'viewer',
    name: 'Viewer',
    nameAr: 'مستعرض',
    description: 'Read-only situational awareness with no operational authority.',
    descriptionAr: 'اطلاع للقراءة فقط دون أي صلاحية تشغيلية.',
    level: 10,
    permissions: [...READ_ONLY_CORE],
  },
]

export interface UserSeed {
  email: string
  name: string
  nameAr: string
  employeeId: string
  department: string
  departmentAr: string
  phone: string
  locale: string
  roleKey: string
}

/**
 * Seeded demo accounts. They exist only while DEMO_ACCOUNTS_ENABLED is true and all
 * share DEMO_ACCOUNT_PASSWORD, which the README documents and the env template warns
 * must be changed before any shared deployment.
 *
 * All seven carry the same person's name on purpose: the reviewer is one person walking
 * the same platform through seven sets of permissions, and inventing seven identities
 * would suggest seven people whose separate access is being demonstrated. What
 * distinguishes an account here is its role, which every surface shows beneath the name.
 */
export const DEMO_USERS: UserSeed[] = [
  {
    email: 'admin@nabdh.sa',
    name: 'Ayman Hashash',
    nameAr: 'أيمن حشاش',
    employeeId: 'NB-1001',
    department: 'Platform Engineering',
    departmentAr: 'هندسة المنصات',
    phone: '+966 50 000 1001',
    locale: 'ar',
    roleKey: 'system_admin',
  },
  {
    email: 'exec@nabdh.sa',
    name: 'Ayman Hashash',
    nameAr: 'أيمن حشاش',
    employeeId: 'NB-1002',
    department: 'Executive Office',
    departmentAr: 'المكتب التنفيذي',
    phone: '+966 50 000 1002',
    locale: 'ar',
    roleKey: 'executive',
  },
  {
    email: 'operator@nabdh.sa',
    name: 'Ayman Hashash',
    nameAr: 'أيمن حشاش',
    employeeId: 'NB-1003',
    department: 'National Control Center',
    departmentAr: 'مركز التحكم الوطني',
    phone: '+966 50 000 1003',
    locale: 'ar',
    roleKey: 'control_operator',
  },
  {
    email: 'engineer@nabdh.sa',
    name: 'Ayman Hashash',
    nameAr: 'أيمن حشاش',
    employeeId: 'NB-1004',
    department: 'Grid Engineering',
    departmentAr: 'هندسة الشبكة',
    phone: '+966 50 000 1004',
    locale: 'en',
    roleKey: 'engineer',
  },
  {
    email: 'maintenance@nabdh.sa',
    name: 'Ayman Hashash',
    nameAr: 'أيمن حشاش',
    employeeId: 'NB-1005',
    department: 'Asset Maintenance',
    departmentAr: 'صيانة الأصول',
    phone: '+966 50 000 1005',
    locale: 'ar',
    roleKey: 'maintenance_engineer',
  },
  {
    email: 'analyst@nabdh.sa',
    name: 'Ayman Hashash',
    nameAr: 'أيمن حشاش',
    employeeId: 'NB-1006',
    department: 'Data & Analytics',
    departmentAr: 'البيانات والتحليلات',
    phone: '+966 50 000 1006',
    locale: 'en',
    roleKey: 'analyst',
  },
  {
    email: 'viewer@nabdh.sa',
    name: 'Ayman Hashash',
    nameAr: 'أيمن حشاش',
    employeeId: 'NB-1007',
    department: 'Regional Liaison',
    departmentAr: 'الارتباط الإقليمي',
    phone: '+966 50 000 1007',
    locale: 'ar',
    roleKey: 'viewer',
  },
]
