/**
 * Chat 状态机：State 形状 + 初始值
 *
 * 注：GuestChatQuota 仍位于 chat-machine.ts（属于业务常量，与上下文配对紧密）。
 *
 * 新增 `wsConnected: boolean`（仅 userSession 期间 true）：
 *   - WS 已连 → 消息发送走 WS，不消耗次数
 *   - WS 未连 → 消息发送走 HTTP，消耗次数
 *   - `ChatWebSocketConnected` 事件 → true
 *   - `userSession.exit` → false（WS actor cleanup 时也会跑 exit）
 */
import type { UiMessage } from "@/data/dto/chat";

export interface ChatState {
  messages: UiMessage[];
  isReplyingAI: boolean;
  /**
   * WebSocket 连接状态（仅 userSession 期间 true）
   * - 决定消息发送路径（WS / HTTP）和是否消耗次数
   * - true：走 WS，不消耗次数
   * - false：走 HTTP，消耗次数
   */
  wsConnected: boolean;
  /** 游客剩余配额（次/天）—— 仅游客业务展示用
   */
  guestRemainingQuota: number;
  /** 游客总配额（仅游客展示用） */
  guestTotalQuota: number;
  quotaExceededTrigger: number;
  isLoadingMore: boolean;
  hasMore: boolean;
  historyOffset: number;
  /** 游客配额加载完成标志（仅 guestSession 期间） —— default false
   * - guestSession.initializing 走 always barrier：`quotaLoaded && historyLoaded` 才进 ready
   * - userSession 永不为 true（不调 loadQuota）—— OK，不影响 barrier
   */
  quotaLoaded: boolean;
  /** history 加载完成标志（initial load —— local → network → save 跑完）
   * - guestSession.initializing / userSession.initializing 走 always barrier
   * - 不被 `loadMoreHistoryActor` 设置（翻页是另一码事）
   */
  historyLoaded: boolean;
}

export const initialState: ChatState = {
  messages: [],
  isReplyingAI: false,
  wsConnected: false,
  guestRemainingQuota: 0,
  guestTotalQuota: 0,
  quotaExceededTrigger: 0,
  isLoadingMore: false,
  hasMore: true,
  historyOffset: 0,
  quotaLoaded: false,
  historyLoaded: false,
};
