/**
 * 议程项上传任务 + 我的待办 API service
 *
 * 端点编号：[109]–[113]（详见 docs/modules/meeting-attendance/07-api.md）
 */

import { api } from '@/lib/api';
import type {
  MeetingAgendaItemUploadTask,
  UploadTaskStatus,
  UserBrief,
} from './agenda';

const BASE_URL = '/meeting-attendance';

const apiGet = <T = any>(url: string, config?: Record<string, any>) =>
  api.get(url, config) as Promise<T>;
const apiPost = <T = any>(url: string, payload?: any, config?: Record<string, any>) =>
  api.post(url, payload, config) as Promise<T>;
const apiPatch = <T = any>(url: string, payload?: any, config?: Record<string, any>) =>
  api.patch(url, payload, config) as Promise<T>;
const apiDelete = <T = any>(url: string, config?: Record<string, any>) =>
  api.delete(url, config) as Promise<T>;

/** 我的待办列表里的任务（带 agendaItem / meeting 上下文） */
export interface MyUploadTask extends MeetingAgendaItemUploadTask {
  agendaItem: {
    id: string;
    title: string;
    sectionTitle: string;
    meeting: { id: string; title: string; startTime: string; endTime: string };
  };
}

export interface MyUploadTasksQuery {
  status?: UploadTaskStatus | 'ALL';
  sort?: 'dueAt_asc' | 'assignedAt_desc';
  limit?: number;
  cursor?: string;
}

export interface MyUploadTasksResponse {
  items: MyUploadTask[];
  nextCursor?: string;
}

/** [109] 批量派发议程项上传任务 */
export function assignUploadTasks(
  itemId: string,
  payload: { assigneeUserIds: string[]; dueAt?: string | null },
) {
  return apiPost<{
    created: MeetingAgendaItemUploadTask[];
    skippedExistingUserIds: string[];
  }>(`${BASE_URL}/agenda-items/${itemId}/upload-tasks`, payload);
}

/** [110] 拉取议程项下任务列表 */
export function listAgendaItemUploadTasks(
  itemId: string,
  params?: { status?: UploadTaskStatus },
) {
  return apiGet<{ items: MeetingAgendaItemUploadTask[] }>(
    `${BASE_URL}/agenda-items/${itemId}/upload-tasks`,
    { params },
  );
}

/** [111] 修改任务（dueAt 或显式置 CANCELLED） */
export function updateUploadTask(
  itemId: string,
  taskId: string,
  payload: { status?: 'CANCELLED'; dueAt?: string | null },
) {
  return apiPatch<{ task: MeetingAgendaItemUploadTask }>(
    `${BASE_URL}/agenda-items/${itemId}/upload-tasks/${taskId}`,
    payload,
  );
}

/** [112] 软删任务（撤销 = 不再展示，幂等） */
export function deleteUploadTask(itemId: string, taskId: string) {
  return apiDelete<void>(`${BASE_URL}/agenda-items/${itemId}/upload-tasks/${taskId}`);
}

/** [113] 我的待办列表 */
export function listMyUploadTasks(query: MyUploadTasksQuery = {}) {
  const params: Record<string, any> = {};
  if (query.status && query.status !== 'ALL') params.status = query.status;
  if (query.sort) params.sort = query.sort;
  if (query.limit) params.limit = query.limit;
  if (query.cursor) params.cursor = query.cursor;
  return apiGet<MyUploadTasksResponse>(`${BASE_URL}/my-upload-tasks`, { params });
}

export const uploadTaskApi = {
  assignUploadTasks,
  listAgendaItemUploadTasks,
  updateUploadTask,
  deleteUploadTask,
  listMyUploadTasks,
};

export type { UserBrief };
