'use client';

import type {
  CreateAssignmentRequest,
  CreateAssignmentResponse,
  ListAgentsResponse,
  ListAssignmentsResponse,
  AssignmentDetailResponse,
  RevokeAssignmentResponse,
} from '@pac/types';
import { api } from '@/lib/api-client';

/**
 * 批次分配 API。
 *
 * ⚠️ 路径都在 `plans/assignments` 之下 —— **别写成 `/plans/agents`**:
 * 那个路径归 PlanController,会被它的裸 `@Get(':id')` 当成 planId,
 * 报出来是 Prisma 的 uuid 解析错,完全看不出是路由撞了(实测踩过)。
 */
export const assignmentsApi = {
  /**
   * 确认分配 —— **整条生产线唯一的写动作**。
   * ⚠️ `requestId` 必须原样回传服务端在出确认单时铸造的那个(幂等键);
   * 前端自己生成挡不住 SSE 重连与重试。
   */
  create: (body: CreateAssignmentRequest) =>
    api.post<CreateAssignmentResponse>('/pac/v1/plans/assignments', body),

  list: (mine?: boolean) =>
    api.get<ListAssignmentsResponse>(`/pac/v1/plans/assignments${mine ? '?mine=1' : ''}`),

  detail: (id: string) =>
    api.get<AssignmentDetailResponse>(`/pac/v1/plans/assignments/${encodeURIComponent(id)}`),

  /** 在岗客服名册 + 在手负载(一个端点,不拆两个 —— 拆开必然口径漂移) */
  /**
   * 撤销整批(限时 30 分钟)。
   *
   * ⚠️ 语义是「**手滑 / 分错人**的补救」,不是"改主意重新调度" ——
   *   改主意应该走「客服退回」,那条路有完整的原因记录。
   * ⚠️ **几乎总是部分成功**:客服已经打开过的单不会被收回(他可能已经联系了患者),
   *   所以返回 revoked / skippedTouched / alreadyReleased 三个数 —— 界面必须如实显示,
   *   ⛔ 不能只弹一句「已撤销」。
   */
  revoke: (assignmentId: string) =>
    api.post<RevokeAssignmentResponse>(
      `/pac/v1/plans/assignments/${encodeURIComponent(assignmentId)}/revoke`,
      {},
    ),

  agents: (clinicId: string, include?: string[]) =>
    api.get<ListAgentsResponse>(
      `/pac/v1/plans/assignments/agents?clinicId=${encodeURIComponent(clinicId)}` +
        (include?.length ? `&include=${include.map(encodeURIComponent).join(',')}` : ''),
    ),
};
