import { NIMMessage, NIMSceneType } from './Message';
import { NIMError } from './Basic';

/**
 * 系统通知类型
 * - [相关文档](https://dev.yunxin.163.com/docs/interface/即时通讯Web端/NIMSDK-Web/SystemMessage.html#.type)
 */
export const enum NIMSystemMessageType {
  addFriend = 'addFriend',
  applyFriend = 'applyFriend',
  passFriendApply = 'passFriendApply',
  rejectFriendApply = 'rejectFriendApply',
  deleteFriend = 'deleteFriend',
  teamInvite = 'teamInvite',
  rejectTeamInvite = 'rejectTeamInvite',
  applyTeam = 'applyTeam',
  rejectTeamApply = 'rejectTeamApply',
  deleteMsg = 'deleteMsg',
  custom = 'custom',
}

/**
 * 系统通知的种类
 * - [相关文档](https://dev.yunxin.163.com/docs/interface/即时通讯Web端/NIMSDK-Web/SystemMessage.html#.category)
 */
export const enum NIMSystemMessageCategory {
  team = 'team',
  friend = 'friend',
}

/**
 * 系统通知的状态
 * - [相关文档](https://dev.yunxin.163.com/docs/interface/即时通讯Web端/NIMSDK-Web/SystemMessage.html#.state)
 */
export const enum NIMSystemMessageState {
  /** 未处理状态 */
  init = 'init',
  /** 已通过 */
  passed = 'passed',
  /** 已拒绝 */
  rejected = 'rejected',
  /** 错误 */
  error = 'error',
}

/**
 * 系统通知
 * - [相关文档](https://dev.yunxin.163.com/docs/interface/即时通讯Web端/NIMSDK-Web/SystemMessage.html)
 * - 不同类型的系统通知结构都有一些差异!!
 */
export interface NIMSystemMessage {
  /** 时间戳(ms) */
  time: number;
  /** 系统通知类型 */
  type: NIMSystemMessageType;
  /** 系统通知的来源, 账号或者群ID */
  from: string;
  /** 系统通知的目标, 账号或者群ID */
  to: string;
  /** 内建系统通知的 idServer */
  idServer: string;
  /** 内建系统通知是否已读 */
  read?: boolean;
  /** 内建系统通知的种类 */
  category?: NIMSystemMessageCategory;
  /** 内建系统通知的state */
  state?: NIMSystemMessageState;
  error?: NIMError;
  /**
   * 内建系统通知的本地自定义扩展字段
   * - 在支持数据库时可以调用更新本地系统通知来更新此字段, 此字段只会被更新到本地数据库, 不会被更新到服务器上
   */
  localCustom?: string;
  /** 内建系统通知的附言 */
  ps?: string;
  /** 内建系统通知的附加信息, 参考系统通知类型来查看不同类型的系统通知对应的附加信息 */
  attach?: {
    /** 附加消息的扩展字段, 可能没有 */
    custom?: string;
  };
  /** 自定义系系统通知的场景, 参考消息场景 */
  scene?: NIMSceneType;
  /** 自定义系统通知的内容 */
  content?: string;
  /** 是否需要推送 */
  isPushable?: boolean;
  /** 自定义系统通知的推送文案, 仅对接收方为iOS设备有效 */
  apnsText?: string;
  /**
   * 定义系统通知的推送属性
   * - 推荐使用JSON格式构建, 非JSON格式的话, Web端会正常接收, 但是会被其它端丢弃
   */
  pushPayload?: string;
  /** 是否需要推送昵称 */
  needPushNick: boolean;
  /**
   * 自定义系统通知是否只发送给在线用户
   * - `true` 时只发送给在线用户, 适合发送即时通知, 比如正在输入
   * - `false` 时假如目标用户或群不在线, 会在其上线后推送过去。
   * - 该参数只对点对点自定义系统通知有效, 对群自定义系统通知无效, 群自定义系统通知只会发给在线的群成员, 不会存离线。
   */
  sendToOnlineUsersOnly?: boolean;
  /** 自定义系统通知是否抄送 */
  cc?: boolean;
}

/** 对方撤回消息的系统通知 */
export interface NIMSystemMessageDeleteMsg extends NIMSystemMessage {
  type: NIMSystemMessageType.deleteMsg;
  /** 删除消息的 IdClient */
  deletedIdClient: string;
  /** 删除消息的 idServer */
  deletedIdServer: string;
  /** 删除消息的时间 */
  deletedMsgTime: number;
  /** 删除消息的对方名 */
  deletedMsgFromNick: string;
  /** 被删除消息的部分字段 */
  msg: Pick<NIMMessage, 'scene' | 'from' | 'to' | 'idClient' | 'idServer' | 'time' | 'fromNick' | 'target' | 'sessionId' | 'flow'>;
  /** 未知用途 */
  opeAccount: string;
}


