/**
 * GraphClient interface — 抽象 Microsoft Graph 调用
 *
 * 抽象目的：让 sync service 可以注入 fake/stub 实现，
 * 用于本地开发（OPS_CENTER_M365_STUB=true）和 L1 集成测试。
 */

export interface GraphSubscribedSku {
  skuId: string;
  skuPartNumber: string;
}

export interface GraphAssignedLicense {
  skuId: string;
}

export interface GraphSignInActivity {
  lastSignInDateTime?: string | null;
  lastNonInteractiveSignInDateTime?: string | null;
}

export interface GraphUser {
  id: string;
  userPrincipalName: string;
  displayName?: string | null;
  mail?: string | null;
  department?: string | null;
  jobTitle?: string | null;
  accountEnabled: boolean;
  createdDateTime?: string | null;
  signInActivity?: GraphSignInActivity | null;
  assignedLicenses?: GraphAssignedLicense[] | null;
}

/**
 * 4 份活动报告类型（period 固定 D180）
 */
export type ActivityReportName =
  | 'EmailActivity'
  | 'OneDriveActivity'
  | 'TeamsUserActivity'
  | 'SharePointActivity';

/**
 * 解析后的活动报告条目
 *
 * UPN 已经 lowercase 处理，可直接 JOIN。
 * 检测到脱敏（UPN 不含 @）时由实现方抛 ReportsObfuscatedException。
 */
export interface ActivityReportEntry {
  userPrincipalNameLower: string;
  lastActivityDate: Date | null;
}

export interface GraphClient {
  /**
   * 列出本租户已订阅的 SKU（用于建立 skuId → 显示名映射）
   */
  listSubscribedSkus(): Promise<GraphSubscribedSku[]>;

  /**
   * 列出所有用户（含 signInActivity + assignedLicenses），自动翻页处理 @odata.nextLink
   */
  listUsers(): Promise<GraphUser[]>;

  /**
   * 拉取指定服务活动报告（D180）；返回 lowercase UPN 映射
   */
  getActivityReport(report: ActivityReportName): Promise<ActivityReportEntry[]>;
}

export const GRAPH_CLIENT_TOKEN = Symbol('GRAPH_CLIENT');
