/**
 * 议程能力 v1.0 API service
 *
 * 覆盖：议程查看 / 段 CRUD / 项 CRUD / 段或项 reorder
 * 端点编号：[100] – [108]（详见 docs/modules/meeting-attendance/07-api.md）
 *
 * 沿用 services/api/meeting-attendance.ts 的 `api` axios 实例（统一 401 跳登录）。
 */

import { api } from '@/lib/api';

const BASE_URL = '/meeting-attendance';

// ─── 类型 ────────────────────────────────────────────────────────────────

export type UploadTaskStatus = 'PENDING' | 'UPLOADED' | 'CANCELLED';

export interface UserBrief {
  id: string;
  displayName: string;
  email: string;
}

export interface MeetingAgendaItemUploadTask {
  id: string;
  agendaItemId: string;
  assigneeUserId: string;
  assignee: UserBrief;
  assignedById: string;
  assignedBy: UserBrief;
  status: UploadTaskStatus;
  dueAt?: string | null;
  assignedAt: string;
  completedAt?: string | null;
}

export interface MeetingAgendaItemAttachment {
  id: string;
  agendaItemId: string;
  uploadedById: string;
  uploadedBy: UserBrief;
  filename: string;
  mimeType: string;
  /** 字节数（BigInt 序列化后是字符串） */
  size: string;
  uploadedAt: string;
}

export interface MeetingAgendaItem {
  id: string;
  sectionId: string;
  order: number;
  title: string;
  /** 单栏段使用 */
  description?: string | null;
  /** 多栏段使用：与所在段 columnLabels 等长 */
  columnDescriptions: string[];
  code?: string | null;
  timeMinutes?: number | null;
  presenterUserId?: string | null;
  presenter?: UserBrief | null;
  uploadTasks: MeetingAgendaItemUploadTask[];
  attachments: MeetingAgendaItemAttachment[];
  createdAt: string;
  updatedAt: string;
}

export interface MeetingAgendaSection {
  id: string;
  meetingId: string;
  order: number;
  title: string;
  /** [] = 单栏；非空数组每元素是列标题 */
  columnLabels: string[];
  items: MeetingAgendaItem[];
  createdAt: string;
  updatedAt: string;
}

export interface AgendaTree {
  sections: MeetingAgendaSection[];
}

// ─── API helpers ─────────────────────────────────────────────────────────

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>;

// ─── 议程查看与段 CRUD（[100]–[104]）─────────────────────────────────────

/** [100] 拉取议程（段 → 项 → 任务 / 资料聚合） */
export function getMeetingAgenda(meetingId: string) {
  return apiGet<AgendaTree>(`${BASE_URL}/meetings/${meetingId}/agenda`);
}

/** [101] 新建议程段 */
export function createAgendaSection(
  meetingId: string,
  payload: { title: string; order?: number; columnLabels?: string[] },
) {
  return apiPost<{ section: MeetingAgendaSection }>(
    `${BASE_URL}/meetings/${meetingId}/agenda/sections`,
    payload,
  );
}

/** [102] 修改议程段标题或位置 */
export function updateAgendaSection(
  meetingId: string,
  sectionId: string,
  payload: { title?: string; order?: number; columnLabels?: string[] },
) {
  return apiPatch<{ section: MeetingAgendaSection }>(
    `${BASE_URL}/meetings/${meetingId}/agenda/sections/${sectionId}`,
    payload,
  );
}

/** [103] 软删议程段（cascade 段下 item / task / attachment） */
export function deleteAgendaSection(meetingId: string, sectionId: string) {
  return apiDelete<void>(
    `${BASE_URL}/meetings/${meetingId}/agenda/sections/${sectionId}`,
  );
}

/** [104] 整批重排段顺序 */
export function reorderAgendaSections(meetingId: string, ids: string[]) {
  return apiPatch<{ meetingId: string; sections: MeetingAgendaSection[] }>(
    `${BASE_URL}/meetings/${meetingId}/agenda/sections/reorder`,
    { ids },
  );
}

// ─── 议程项 CRUD（[105]–[108]）────────────────────────────────────────────

export interface CreateAgendaItemPayload {
  title: string;
  description?: string;
  columnDescriptions?: string[];
  code?: string;
  timeMinutes?: number;
  presenterUserId?: string;
  order?: number;
}

/** [105] 新建议程项 */
export function createAgendaItem(sectionId: string, payload: CreateAgendaItemPayload) {
  return apiPost<{ item: MeetingAgendaItem }>(
    `${BASE_URL}/agenda-sections/${sectionId}/items`,
    payload,
  );
}

export interface UpdateAgendaItemPayload {
  title?: string;
  description?: string | null;
  columnDescriptions?: string[];
  code?: string | null;
  timeMinutes?: number | null;
  presenterUserId?: string | null;
  order?: number;
}

/** [106] 修改议程项 */
export function updateAgendaItem(
  sectionId: string,
  itemId: string,
  payload: UpdateAgendaItemPayload,
) {
  return apiPatch<{ item: MeetingAgendaItem }>(
    `${BASE_URL}/agenda-sections/${sectionId}/items/${itemId}`,
    payload,
  );
}

/** [107] 软删议程项（cascade task / attachment） */
export function deleteAgendaItem(sectionId: string, itemId: string) {
  return apiDelete<void>(`${BASE_URL}/agenda-sections/${sectionId}/items/${itemId}`);
}

/** [108] 整批重排段内项顺序 */
export function reorderAgendaItems(sectionId: string, ids: string[]) {
  return apiPatch<{ sectionId: string; items: MeetingAgendaItem[] }>(
    `${BASE_URL}/agenda-sections/${sectionId}/items/reorder`,
    { ids },
  );
}

export const agendaApi = {
  getMeetingAgenda,
  createAgendaSection,
  updateAgendaSection,
  deleteAgendaSection,
  reorderAgendaSections,
  createAgendaItem,
  updateAgendaItem,
  deleteAgendaItem,
  reorderAgendaItems,
};
