/**
 * @zync/modules — Module manifest & registry.
 *
 * The dependency graph lives in code (not the DB) because module relationships
 * are release-time knowledge. Schema migrations are not required when deps change.
 */

export type ModuleId =
  | 'system'
  | 'crm'
  | 'customers'
  | 'time_management'
  | 'projects'
  | 'tasks'
  | 'invoices'
  | 'expenses'
  | 'billing'
  | 'calendar'
  | 'marketing'
  | 'reports'
  | 'kb'
  | 'contractor_payouts'
  | 'ai_assistant'
  | 'today'
  | 'notifications'
  | 'settings'

export type DependencyKind = 'hard' | 'soft'

export interface ModuleDependency {
  moduleId: ModuleId
  kind: DependencyKind
  /** Human-readable description of what breaks / is degraded */
  impactDescription: string
}

export interface ModuleDefinition {
  id: ModuleId
  displayName: string
  /** i18n key: modules.<id>.description */
  descriptionKey: string
  /** Lucide icon component name */
  icon: string
  navGroup: 'workspace' | 'business' | 'financials' | 'resources' | 'global' | null
  dependencies: ModuleDependency[]
  /** true only for 'system' — never shown to users, never toggled */
  alwaysOn: boolean
  /** Always-available desktop app; never included in module enablement. */
  osApp?: true
  os?: ZyncModuleOs
}

export interface ZyncModuleOs {
  desktop: { minWidth: number; minHeight: number; supportsMultipleInstances: boolean }
  mobile: { presentation: 'fullscreen' }
  routing: { routePrefixes: string[]; defaultRoute: string }
  quickActions: readonly { id: string; label: string; route: string }[]
  badge?: { badgeId: string }
  widgets?: readonly { id: string; title: string }[]
  search?: { provider: 'route' | 'module' }
}

export const MODULE_MANIFEST: ModuleDefinition[] = [
  {
    id: 'system',
    displayName: 'System',
    descriptionKey: 'modules.system.description',
    icon: 'Settings2',
    navGroup: null,
    alwaysOn: true,
    dependencies: [],
  },
  {
    id: 'tasks',
    displayName: 'Tasks',
    descriptionKey: 'modules.tasks.description',
    icon: 'CheckSquare',
    navGroup: 'workspace',
    alwaysOn: false,
    dependencies: [],
    os: {
      desktop: { minWidth: 640, minHeight: 480, supportsMultipleInstances: false },
      mobile: { presentation: 'fullscreen' },
      routing: { routePrefixes: ['/tasks'], defaultRoute: '/tasks' },
      quickActions: [{ id: 'new-task', label: 'New task', route: '/tasks/new' }],
      badge: { badgeId: 'tasks' }, search: { provider: 'module' },
    },
  },
  {
    id: 'projects',
    displayName: 'Projects',
    descriptionKey: 'modules.projects.description',
    icon: 'FolderKanban',
    navGroup: 'workspace',
    alwaysOn: false,
    dependencies: [
      {
        moduleId: 'customers',
        kind: 'soft',
        impactDescription: 'Customer assignment field will be hidden on projects.',
      },
      {
        moduleId: 'tasks',
        kind: 'soft',
        impactDescription: 'Subtask panel will be hidden in project detail.',
      },
    ],
    os: {
      desktop: { minWidth: 640, minHeight: 480, supportsMultipleInstances: false },
      mobile: { presentation: 'fullscreen' },
      routing: { routePrefixes: ['/projects'], defaultRoute: '/projects' },
      quickActions: [], search: { provider: 'module' },
    },
  },
  {
    id: 'time_management',
    displayName: 'Time Tracking',
    descriptionKey: 'modules.time_management.description',
    icon: 'Clock',
    navGroup: 'workspace',
    alwaysOn: false,
    dependencies: [
      {
        moduleId: 'tasks',
        kind: 'hard',
        impactDescription: 'Time entries cannot be created without tasks.',
      },
    ],
    os: {
      desktop: { minWidth: 560, minHeight: 420, supportsMultipleInstances: false },
      mobile: { presentation: 'fullscreen' },
      routing: { routePrefixes: ['/time-track', '/time/approvals'], defaultRoute: '/time-track' },
      quickActions: [], search: { provider: 'module' },
    },
  },
  {
    id: 'calendar',
    displayName: 'Calendar',
    descriptionKey: 'modules.calendar.description',
    icon: 'Calendar',
    navGroup: 'workspace',
    alwaysOn: false,
    dependencies: [],
    os: {
      desktop: { minWidth: 640, minHeight: 480, supportsMultipleInstances: false },
      mobile: { presentation: 'fullscreen' },
      routing: { routePrefixes: ['/calendar'], defaultRoute: '/calendar' },
      quickActions: [], search: { provider: 'module' },
    },
  },
  {
    id: 'customers',
    displayName: 'Customers',
    descriptionKey: 'modules.customers.description',
    icon: 'Users',
    navGroup: 'business',
    alwaysOn: false,
    dependencies: [],
    os: {
      desktop: { minWidth: 720, minHeight: 480, supportsMultipleInstances: true },
      mobile: { presentation: 'fullscreen' },
      routing: { routePrefixes: ['/customers'], defaultRoute: '/customers' },
      quickActions: [{ id: 'new-customer', label: 'New customer', route: '/customers/new' }],
      badge: { badgeId: 'customers' }, search: { provider: 'module' },
    },
  },
  {
    id: 'crm',
    displayName: 'Support Center',
    descriptionKey: 'modules.crm.description',
    icon: 'HeadphonesIcon',
    navGroup: 'business',
    alwaysOn: false,
    dependencies: [
      {
        moduleId: 'customers',
        kind: 'soft',
        impactDescription: 'Customer context panel hidden on ticket detail.',
      },
    ],
    os: {
      desktop: { minWidth: 640, minHeight: 480, supportsMultipleInstances: false },
      mobile: { presentation: 'fullscreen' },
      routing: { routePrefixes: ['/crm'], defaultRoute: '/crm' },
      quickActions: [], search: { provider: 'module' },
    },
  },
  {
    id: 'marketing',
    displayName: 'Marketing',
    descriptionKey: 'modules.marketing.description',
    icon: 'Megaphone',
    navGroup: 'business',
    alwaysOn: false,
    dependencies: [
      {
        moduleId: 'customers',
        kind: 'soft',
        impactDescription: 'Lead-to-customer conversion unavailable.',
      },
      {
        moduleId: 'calendar',
        kind: 'soft',
        impactDescription: 'Booking/scheduling integration unavailable.',
      },
      {
        moduleId: 'invoices',
        kind: 'soft',
        impactDescription: 'Mini-ecommerce checkout unavailable.',
      },
    ],
    os: {
      desktop: { minWidth: 640, minHeight: 480, supportsMultipleInstances: false },
      mobile: { presentation: 'fullscreen' },
      routing: { routePrefixes: ['/marketing', '/proposals', '/contracts'], defaultRoute: '/marketing' },
      quickActions: [], search: { provider: 'module' },
    },
  },
  {
    id: 'invoices',
    displayName: 'Invoices',
    descriptionKey: 'modules.invoices.description',
    icon: 'FileText',
    navGroup: 'financials',
    alwaysOn: false,
    dependencies: [
      {
        moduleId: 'customers',
        kind: 'soft',
        impactDescription: 'Recipient autocomplete hidden; free-text name entry still works.',
      },
    ],
    os: {
      desktop: { minWidth: 640, minHeight: 480, supportsMultipleInstances: false },
      mobile: { presentation: 'fullscreen' },
      routing: { routePrefixes: ['/invoices', '/receipts', '/payments'], defaultRoute: '/invoices' },
      quickActions: [], search: { provider: 'module' },
    },
  },
  {
    id: 'billing',
    displayName: 'Billing',
    descriptionKey: 'modules.billing.description',
    icon: 'CreditCard',
    navGroup: 'financials',
    alwaysOn: false,
    dependencies: [
      {
        moduleId: 'invoices',
        kind: 'hard',
        impactDescription: 'Recurring billing cannot generate invoices.',
      },
      {
        moduleId: 'customers',
        kind: 'soft',
        impactDescription: 'Subscription customer link hidden.',
      },
    ],
    os: {
      desktop: { minWidth: 640, minHeight: 480, supportsMultipleInstances: false },
      mobile: { presentation: 'fullscreen' },
      routing: { routePrefixes: [], defaultRoute: '/settings/billing' },
      quickActions: [], search: { provider: 'module' },
    },
  },
  {
    id: 'expenses',
    displayName: 'Expenses',
    descriptionKey: 'modules.expenses.description',
    icon: 'Receipt',
    navGroup: 'financials',
    alwaysOn: false,
    dependencies: [],
    os: {
      desktop: { minWidth: 640, minHeight: 480, supportsMultipleInstances: false },
      mobile: { presentation: 'fullscreen' },
      routing: { routePrefixes: ['/expenses', '/vendors'], defaultRoute: '/expenses' },
      quickActions: [], search: { provider: 'module' },
    },
  },
  {
    id: 'contractor_payouts',
    displayName: 'Contractor Payouts',
    descriptionKey: 'modules.contractor_payouts.description',
    icon: 'Wallet',
    navGroup: 'financials',
    alwaysOn: false,
    dependencies: [
      {
        moduleId: 'time_management',
        kind: 'hard',
        impactDescription:
          'Payouts cannot be computed without approved time entries.',
      },
    ],
    os: {
      desktop: { minWidth: 640, minHeight: 480, supportsMultipleInstances: false },
      mobile: { presentation: 'fullscreen' },
      routing: { routePrefixes: ['/contractors', '/payouts'], defaultRoute: '/payouts' },
      quickActions: [], search: { provider: 'module' },
    },
  },
  {
    id: 'reports',
    displayName: 'Reports',
    descriptionKey: 'modules.reports.description',
    icon: 'BarChart3',
    navGroup: 'resources',
    alwaysOn: false,
    dependencies: [
      {
        moduleId: 'invoices',
        kind: 'soft',
        impactDescription: 'Revenue and tax reports unavailable.',
      },
      {
        moduleId: 'expenses',
        kind: 'soft',
        impactDescription: 'Expense reports unavailable.',
      },
      {
        moduleId: 'time_management',
        kind: 'soft',
        impactDescription: 'Utilization and billable-hours reports unavailable.',
      },
    ],
    os: {
      desktop: { minWidth: 640, minHeight: 480, supportsMultipleInstances: false },
      mobile: { presentation: 'fullscreen' },
      routing: { routePrefixes: ['/reports', '/analytics'], defaultRoute: '/reports' },
      quickActions: [], search: { provider: 'module' },
    },
  },
  {
    id: 'kb',
    displayName: 'Knowledge Base',
    descriptionKey: 'modules.kb.description',
    icon: 'BookOpen',
    navGroup: 'resources',
    alwaysOn: false,
    dependencies: [],
    os: {
      desktop: { minWidth: 640, minHeight: 480, supportsMultipleInstances: false },
      mobile: { presentation: 'fullscreen' },
      routing: { routePrefixes: ['/kb'], defaultRoute: '/kb' },
      quickActions: [], search: { provider: 'module' },
    },
  },
  {
    id: 'ai_assistant',
    displayName: 'AI Assistant',
    descriptionKey: 'modules.ai_assistant.description',
    icon: 'Sparkles',
    navGroup: 'global',
    alwaysOn: false,
    dependencies: [
      {
        moduleId: 'tasks',
        kind: 'soft',
        impactDescription: 'AI features for Tasks context will be unavailable.',
      },
      {
        moduleId: 'customers',
        kind: 'soft',
        impactDescription: 'AI features for Customers context will be unavailable.',
      },
      {
        moduleId: 'invoices',
        kind: 'soft',
        impactDescription: 'AI features for Invoices context will be unavailable.',
      },
      {
        moduleId: 'time_management',
        kind: 'soft',
        impactDescription: 'AI features for Time Tracking context will be unavailable.',
      },
      {
        moduleId: 'calendar',
        kind: 'soft',
        impactDescription: 'AI features for Calendar context will be unavailable.',
      },
      {
        moduleId: 'expenses',
        kind: 'soft',
        impactDescription: 'AI features for Expenses context will be unavailable.',
      },
      {
        moduleId: 'projects',
        kind: 'soft',
        impactDescription: 'AI features for Projects context will be unavailable.',
      },
    ],
    os: {
      desktop: { minWidth: 560, minHeight: 480, supportsMultipleInstances: false },
      mobile: { presentation: 'fullscreen' },
      routing: { routePrefixes: ['/settings/ai', '/admin/ai'], defaultRoute: '/settings/ai' },
      quickActions: [], search: { provider: 'route' },
    },
  },
  {
    id: 'today', displayName: 'Today', descriptionKey: 'modules.today.description', icon: 'LayoutDashboard', navGroup: 'global', alwaysOn: false, osApp: true, dependencies: [],
    os: { desktop: { minWidth: 560, minHeight: 420, supportsMultipleInstances: false }, mobile: { presentation: 'fullscreen' }, routing: { routePrefixes: ['/', '/dashboard', '/my-work'], defaultRoute: '/dashboard' }, quickActions: [], widgets: [{ id: 'today', title: 'Today' }], search: { provider: 'route' } },
  },
  {
    id: 'notifications', displayName: 'Notifications', descriptionKey: 'modules.notifications.description', icon: 'Bell', navGroup: 'global', alwaysOn: false, osApp: true, dependencies: [],
    os: { desktop: { minWidth: 480, minHeight: 400, supportsMultipleInstances: false }, mobile: { presentation: 'fullscreen' }, routing: { routePrefixes: ['/notifications'], defaultRoute: '/notifications' }, quickActions: [], badge: { badgeId: 'notifications' }, search: { provider: 'route' } },
  },
  {
    id: 'settings', displayName: 'Settings', descriptionKey: 'modules.settings.description', icon: 'Settings', navGroup: 'global', alwaysOn: false, osApp: true, dependencies: [],
    os: { desktop: { minWidth: 640, minHeight: 480, supportsMultipleInstances: false }, mobile: { presentation: 'fullscreen' }, routing: { routePrefixes: ['/integrations', '/profile', '/settings'], defaultRoute: '/settings' }, quickActions: [], search: { provider: 'route' } },
  },
]

/** Lookup map by module ID */
export const MODULE_BY_ID: Record<ModuleId, ModuleDefinition> = Object.fromEntries(
  MODULE_MANIFEST.map((m) => [m.id, m]),
) as Record<ModuleId, ModuleDefinition>

/** All toggleable modules — excludes 'system' (14 total) */
export const TOGGLEABLE_MODULE_IDS: ModuleId[] = MODULE_MANIFEST.filter(
  (m) => !m.alwaysOn && !m.osApp,
).map((m) => m.id)

/**
 * Canonical card display order for /settings/modules:
 * Tasks, Projects, Time Tracking, Calendar, Customers, CRM, Marketing,
 * Invoices, Billing, Expenses, Contractor Payouts, Reports, Knowledge Base, AI Assistant
 */
export const MODULE_CARD_ORDER: ModuleId[] = [
  'tasks',
  'projects',
  'time_management',
  'calendar',
  'customers',
  'crm',
  'marketing',
  'invoices',
  'billing',
  'expenses',
  'contractor_payouts',
  'reports',
  'kb',
  'ai_assistant',
]

/** Modules intentionally deferred from OS registry ownership until their migration task. */
export const UNOWNED_MODULE_IDS: readonly ModuleId[] = [
  'system',
]
