export type Scope = 'Platform' | 'RCSMonitor'

/**
 * 启动后实际运行模式（由后端在登录响应中告知，仅作展示用）。
 * - `WebEnabled`：SimpleLite 同时启动了 LocalTerminal（本地桌面窗口）+ WebTerminal（浏览器端）。
 * - `WebOnly`：SimpleLite 只启动了 WebTerminal，没有本地桌面窗口，全程浏览器使用。
 * - `Detached`：会话 N+1 增量字段。Platform.Server 未能拉起 SimpleLite（appsettings 关闭 / exe 找不到 /
 *   Process.Start 失败 / 启动异常），前端应该提示「SimpleLite 未连接」并降级 /api/sl/* 调用。
 */
export type RunMode = 'WebOnly' | 'WebEnabled' | 'Detached'

/**
 * 登录时用户在登录页选择的「启动模式」(请求字段)。
 * - `DesktopAndWeb`：希望本地桌面窗口 + Web 都启动（功能最完整）。
 * - `WebOnly`：希望只起 Web，不要弹本地桌面窗口（远程办公 / 服务器部署）。
 *
 * 与 RunMode 的区别：LaunchMode 是「期望」（前端 → 后端），RunMode 是「事实」（后端 → 前端）。
 * 正常情况下二者一一映射：DesktopAndWeb → WebEnabled，WebOnly → WebOnly。
 */
export type LaunchMode = 'DesktopAndWeb' | 'WebOnly'

export type WidgetVisibility = 'hidden' | 'readonly' | 'interactive'

export interface WidgetGrant {
  widgetId: string
  visibility: WidgetVisibility
}

export interface EffectivePermissions {
  userId: string
  version: number
  allowedOps: string[]
  visibleWidgets: WidgetGrant[]
  /**
   * 当前 scope 下可访问的「权限页面」Key 集合（与 vue-router route.name 对齐）。
   * 由后端按用户角色的并集计算并下发；菜单渲染与路由守卫据此放行。
   * 后端通常已把通配展开为具体 Key；前端仍兼容 '*' 通配（mock / 历史数据）。
   */
  allowedPages: string[]
}

export interface AuthUser {
  id: string
  username: string
  displayName: string
  email?: string
  roles: string[]
}

export interface LoginRequest {
  username: string
  password: string
  scope: Scope
  /** 会话 N+1：可选；不传时后端按 DesktopAndWeb 处理（向后兼容历史前端）。 */
  launchMode?: LaunchMode
}

export interface LoginResponse {
  token: string
  user: AuthUser
  scope: Scope
  effectivePermissions: EffectivePermissions
  runMode: RunMode
  /**
   * 会话 N+1 增量字段：SimpleLiteLauncher.LaunchResult.Status 字符串枚举。
   * 可能值：Disabled / AlreadyRunning / ReusingExisting / PortOccupied / Ready / StartedButNotReady /
   *         ExecutableNotFound / ProcessStartFailed / Exception。
   * 字段缺失说明后端没有附带该字段（兼容旧后端）。
   */
  launchStatus?: string
  /**
   * 会话 N+1 增量字段：可选告警文本。非空时前端应该用消息条提示用户
   * （比如「检测到 SimpleLite 已经在端口上运行，本次选择的启动模式未生效」）。
   */
  launchWarning?: string
  /**
   * 部署配置向导是否待完成（后端 deployment.Configured=false）。
   * true 时路由守卫会把用户导向 /wizard 完成平台选型（导航方式 / 模块 / 功能）。
   * 字段缺失（旧后端 / mock）按 false 处理。
   */
  needsWizard?: boolean
}

/**
 * GET /api/auth/me 响应：用本地 token 让后端实校一次身份，并刷新 user/scope/runMode/perm。
 * 不带 token 字段（client 已有），不带 LaunchStatus/Warning（那是登录时一次性结果）。
 */
export interface MeResponse {
  user: AuthUser
  scope: Scope
  runMode: RunMode
  effectivePermissions: EffectivePermissions
  /** 部署配置向导是否待完成（与 LoginResponse.needsWizard 同义）。 */
  needsWizard?: boolean
}
