/**
 * 开发管理模块 API 服务
 * 模块: platform_devtracker
 */
import apiClient from '@/lib/api-client';

// ==================== 枚举定义 ====================

export enum DevItemStatus {
  DRAFT = 'DRAFT',
  REVIEWED = 'REVIEWED',
  IN_DEVELOPMENT = 'IN_DEVELOPMENT',
  IN_TESTING = 'IN_TESTING',
  USER_TESTING = 'USER_TESTING',
  DONE = 'DONE',
  CANCELLED = 'CANCELLED',
  ARCHIVED = 'ARCHIVED',
}

export enum DevItemType {
  MODULE = 'MODULE',
  FEATURE = 'FEATURE',
  BUG = 'BUG',
}

export enum DevItemPriority {
  P0 = 'P0',
  P1 = 'P1',
  P2 = 'P2',
  P3 = 'P3',
}

export enum DevItemSeverity {
  S1 = 'S1',
  S2 = 'S2',
  S3 = 'S3',
  S4 = 'S4',
}

// ==================== 类型定义 ====================

export interface DevItem {
  id: string;
  code: string;
  title: string;
  description?: string;
  itemType: DevItemType;
  status: DevItemStatus;
  priority: DevItemPriority;
  severity?: DevItemSeverity;
  moduleKey?: string;
  parentId?: string;
  ownerId: string;
  reporterId: string;
  reviewerId?: string;
  reviewedAt?: string;
  startAt?: string;
  devEtaAt?: string;
  testEtaAt?: string;
  etaAt?: string;
  devCompletedAt?: string;
  testCompletedAt?: string;
  completedAt?: string;
  content?: Record<string, unknown>;
  labels?: string[];
  createdAt: string;
  updatedAt: string;
}

export interface Pagination {
  page: number;
  pageSize: number;
  total: number;
  totalPages: number;
}

export interface PaginatedResult<T> {
  items: T[];
  pagination: Pagination;
}

export interface DevItemListQuery {
  page?: number;
  pageSize?: number;
  itemType?: DevItemType;
  status?: DevItemStatus;
  ownerId?: string;
  parentId?: string;
  priority?: DevItemPriority;
  keyword?: string;
}

export interface ReleaseNote {
  id: string;
  version: string;
  title: string;
  content?: Record<string, unknown>;
  releasedAt: string;
  createdBy: string;
  createdAt: string;
  updatedAt: string;
}

export interface ReleaseNoteListQuery {
  page?: number;
  pageSize?: number;
  keyword?: string;
}

export interface CreateDevItemParams {
  title: string;
  description?: string;
  itemType: DevItemType;
  priority: DevItemPriority;
  severity?: DevItemSeverity;
  moduleKey?: string;
  parentId?: string;
  ownerId: string;
  devEtaAt?: string;
  testEtaAt?: string;
  etaAt?: string;
  content?: Record<string, unknown>;
  labels?: string[];
}

export interface UpdateDevItemParams {
  title?: string;
  description?: string;
  priority?: DevItemPriority;
  severity?: DevItemSeverity;
  ownerId?: string;
  startAt?: string;
  devEtaAt?: string;
  testEtaAt?: string;
  etaAt?: string;
  content?: Record<string, unknown>;
  labels?: string[];
}

export interface CreateReleaseNoteParams {
  version: string;
  title: string;
  content?: Record<string, unknown>;
  releasedAt: string;
}

export interface UpdateDevItemStatusParams {
  status: DevItemStatus;
}

// ==================== API 函数 ====================

const BASE_URL = '/devtracker';

export async function getDevItems(
  params?: DevItemListQuery,
): Promise<PaginatedResult<DevItem>> {
  return apiClient.get(`${BASE_URL}/items`, { params });
}

export async function getDevItemById(id: string): Promise<DevItem> {
  return apiClient.get(`${BASE_URL}/items/${id}`);
}

export async function createDevItem(
  payload: CreateDevItemParams,
): Promise<DevItem> {
  return apiClient.post(`${BASE_URL}/items`, payload);
}

export async function updateDevItem(
  id: string,
  payload: UpdateDevItemParams,
): Promise<DevItem> {
  return apiClient.put(`${BASE_URL}/items/${id}`, payload);
}

export async function updateDevItemStatus(
  id: string,
  payload: UpdateDevItemStatusParams,
): Promise<DevItem> {
  return apiClient.patch(`${BASE_URL}/items/${id}/status`, payload);
}

export async function deleteDevItem(id: string): Promise<DevItem> {
  return apiClient.delete(`${BASE_URL}/items/${id}`);
}

export async function getReleaseNotes(
  params?: ReleaseNoteListQuery,
): Promise<PaginatedResult<ReleaseNote>> {
  return apiClient.get(`${BASE_URL}/release-notes`, { params });
}

export async function createReleaseNote(
  payload: CreateReleaseNoteParams,
): Promise<ReleaseNote> {
  return apiClient.post(`${BASE_URL}/release-notes`, payload);
}
