import { requestClient } from '#/api/request';

export namespace ImPrivateMessageApi {
  /** 私聊消息 Response VO */
  export interface PrivateMessageRespVO {
    id: number; // 消息编号
    clientMessageId: string; // 客户端消息编号
    senderId: number; // 发送人编号
    receiverId: number; // 接收人编号
    type: number; // 内容类型
    content: string; // 消息内容（JSON 格式）
    status: number; // 消息状态（正常 / 已撤回）
    receiptStatus?: number; // 回执状态（不需要 / 待完成 / 已完成），对齐 ImMessageReceiptStatus
    sendTime: string; // 发送时间
  }

  /** 私聊消息发送 Request VO */
  export interface PrivateMessageSendReqVO {
    clientMessageId: string; // 客户端消息编号
    receiverId: number; // 接收人编号
    type: number; // 内容类型
    content: string; // 消息内容（JSON 格式）
    receipt?: boolean; // 是否需要回执；不传后端默认 true（普通私聊用户消息）
  }

  /** 私聊历史消息列表 Request VO */
  export interface PrivateMessageListReqVO {
    receiverId: number | string; // 接收人编号（对方）
    maxId?: number | string; // 起始消息编号（不含），为空则从最新消息开始
    limit: number; // 拉取数量（1 ~ 200）
  }
}


/** 发送私聊消息 */
export function sendPrivateMessage(data: ImPrivateMessageApi.PrivateMessageSendReqVO) {
  return requestClient.post<ImPrivateMessageApi.PrivateMessageRespVO>(
    '/im/message/private/send',
    data,
  );
}

/** 拉取私聊消息（增量） */
export function pullPrivateMessageList(
  params: { minId: number | string; size: number },
  signal?: AbortSignal,
) {
  return requestClient.get<ImPrivateMessageApi.PrivateMessageRespVO[]>(
    '/im/message/private/pull',
    { params, signal },
  );
}

/** 查询私聊历史消息 */
export function getPrivateMessageList(params: ImPrivateMessageApi.PrivateMessageListReqVO) {
  return requestClient.get<ImPrivateMessageApi.PrivateMessageRespVO[]>(
    '/im/message/private/list',
    { params },
  );
}

/** 标记私聊消息已读 */
export function readPrivateMessages(
  receiverId: number | string,
  messageId: number | string,
) {
  return requestClient.put<boolean>('/im/message/private/read', undefined, {
    params: { receiverId, messageId },
  });
}

/** 查询对方已读到我发的最大消息 id（多端 / 离线后用于补齐已读状态） */
export function getPrivateMaxReadMessageId(
  peerId: number | string,
  signal?: AbortSignal,
) {
  return requestClient.get<null | number>(
    '/im/message/private/max-read-message-id',
    { params: { peerId }, signal },
  );
}

/** 撤回私聊消息 */
export function recallPrivateMessage(id: number | string) {
  return requestClient.delete<ImPrivateMessageApi.PrivateMessageRespVO>(
    '/im/message/private/recall',
    { params: { id } },
  );
}
