'use client';

import { create } from 'zustand';

/**
 * 工作台跨栏同步 — 极简事件总线:seq 自增触发订阅;消费方按 planId patch 对应行
 * (不重拉、不丢滚动)。**双向**:
 *   · 详情(右)→ 列表(左):`notify` —— 提交执行后同步行状态 / outcome 角标
 *   · 列表(左)→ 详情(右):`notifyClaim` —— 认领 / 返池后同步认领人,
 *     让详情页的认领闸即时解锁或上锁。认领入口只在列表页,没这条反向通道的话,
 *     刚认领完回详情点操作仍会被拦(要等重拉才生效)。
 */
interface PlanSyncState {
  seq: number;
  planId: string | null;
  /** 新状态(submitExecution 回的 planStatus 等);null = 只提示"该行变了"(消费方自行 refresh) */
  status: string | null;
  /** 本次提交的执行 outcome(左栏「成功/不成功/保持」角标即时反映);null = 未变 */
  outcome: string | null;
  /** 新认领人(认领=userId / 返池=null)。
   *  ⚠️ `undefined` = 本次事件跟认领无关,消费方**不要动**自己的认领态 ——
   *  不能用 null 表达"无关",那会被当成"已返池"而误上锁。 */
  assigneeUserId: string | null | undefined;
  notify: (planId: string, status?: string, outcome?: string) => void;
  /** 列表页认领 / 返池后调用(反向通道) */
  notifyClaim: (planId: string, assigneeUserId: string | null) => void;
  /** 当前工作台正在看的患者(详情页 ready 时发布;右下角助手按它出场景化开场建议) */
  /**
   * 详情页当前开着的那位。
   * ⚠️ `patientId` 2026-08-15 补 —— 原来只有 `planId` + 姓名，够界面用，
   *   但**助手要的是 id**：他说「这个患者」「这通电话」而没点名时，
   *   模型此前根本不知道是谁（姓名只被拿去预填例句文字，从没发给过它）。
   */
  current: { planId: string; patientId: string; patientName: string } | null;
  setCurrent: (
    current: { planId: string; patientId: string; patientName: string } | null,
  ) => void;
}

export const usePlanSyncStore = create<PlanSyncState>((set) => ({
  seq: 0,
  planId: null,
  status: null,
  outcome: null,
  assigneeUserId: undefined,
  notify: (planId, status, outcome) =>
    set((s) => ({
      seq: s.seq + 1,
      planId,
      status: status ?? null,
      outcome: outcome ?? null,
      // 执行类事件不表态认领人 → undefined,详情页据此跳过认领态更新
      assigneeUserId: undefined,
    })),
  notifyClaim: (planId, assigneeUserId) =>
    set((s) => ({
      seq: s.seq + 1,
      planId,
      status: assigneeUserId ? 'assigned' : 'active',
      outcome: null,
      assigneeUserId,
    })),
  current: null,
  setCurrent: (current) => set({ current }),
}));
