import { atom } from 'jotai'
import { V2NIMConversation } from 'nim-web-sdk-ng/dist/v2/NIM_BROWSER_SDK/V2NIMConversationService'
import { V2NIMUser } from 'nim-web-sdk-ng/dist/v2/NIM_BROWSER_SDK/V2NIMUserService'
import { V2NIMMessage } from 'nim-web-sdk-ng/dist/v2/NIM_BROWSER_SDK/V2NIMMessageService'
import { QueueMap } from '@/lib/queue'
import { VipType } from '@/services/wallet'

/**
 * 点赞状态枚举
 */
export enum MessageLikeStatus {
  None = 'none', // 未点赞/踩
  Liked = 'liked', // 已点赞
  Disliked = 'disliked', // 已踩
}

/**
 * 消息服务端扩展字段接口（简化版）
 */
export interface MessageServerExtension {
  [userId: string]: MessageLikeStatus // 用户ID -> 点赞状态的直接映射
}

/**
 * 消息扩展字段接口 (废弃，改用serverExtension)
 * @deprecated 使用 MessageServerExtension 替代
 */
export interface MessageExtension {
  likeStatus?: MessageLikeStatus // 当前用户对该消息的点赞状态
  likeCount?: number // 点赞总数
  dislikeCount?: number // 踩总数
  [key: string]: any // 其他扩展字段
}

/**
 * 扩展消息类型，包含是否为新消息的标识
 */
export interface ExtendedMessage extends V2NIMMessage {
  isNewMessage?: boolean // 标识是否是新收到的消息（需要打字效果）
  isLoadingMessage?: boolean // 标识是否是loading消息
}

/**
 * 解析消息的serverExtension字段
 */
export const parseMessageServerExtension = (serverExtension?: string): MessageServerExtension => {
  if (!serverExtension) return {}
  try {
    return JSON.parse(serverExtension) as MessageServerExtension
  } catch {
    return {}
  }
}

/**
 * 将MessageServerExtension对象序列化为JSON字符串
 */
export const stringifyMessageServerExtension = (extension: MessageServerExtension): string => {
  return JSON.stringify(extension)
}

/**
 * 获取用户对消息的点赞状态
 */
export const getUserLikeStatus = (message: ExtendedMessage, userId: string): MessageLikeStatus => {
  const serverExt = parseMessageServerExtension(message.serverExtension)
  return serverExt[userId] || MessageLikeStatus.None
}

/**
 * 登录状态
 */
export const imSyncedAtom = atom<boolean>(false)

/**
 * IM重连状态
 */
export enum IMReconnectStatus {
  CONNECTED = 'connected', // 已连接
  DISCONNECTED = 'disconnected', // 已断开
  RECONNECTING = 'reconnecting', // 重连中
  FAILED = 'failed', // 重连失败
}

export const imReconnectStatusAtom = atom<IMReconnectStatus>(IMReconnectStatus.DISCONNECTED)

/**
 * 会话列表
 */
export const conversationListAtom = atom<Map<string, V2NIMConversation>>(new Map())

/**
 * 用户信息
 */
export const userListAtom = atom<Map<string, V2NIMUser>>(new Map())

/**
 * 消息列表
 */
export const msgListAtom = atom(new QueueMap<ExtendedMessage>(20, 'rightToLeft'))

/**
 * 选中的会话
 */
export const selectedConversationIdAtom = atom<string | null>(null)

/**
 * 聊天状态管理
 */
export const isWaitingForReplyAtom = atom<boolean>(false) // 是否正在等待AI回复

/**
 * 通话状态管理
 */
export const hasReceivedAiGreetingAtom = atom<boolean>(false) // 是否已收到AI开场白
export const hasStartAICallAtom = atom<boolean>(false) // 是否已开始AI通话

export const isCoinInsufficientAtom = atom<boolean>(false) // 是否钻石不足
export const isChargeDrawerOpenAtom = atom<boolean>(false) // 是否打开充值抽屉
export const isVipDrawerOpenAtom = atom<{ open: boolean; vipType?: VipType }>({
  open: false,
  vipType: undefined,
}) // 是否打开会员抽屉

export const isCallAtom = atom<boolean>(false) // 是否正在通话

/**
 * 已删除消息的会话列表 - 用于控制开场白显示
 */
export const deletedConversationsAtom = atom<Set<string>>(new Set<string>())
