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

// ============================================
// Types
// ============================================

export enum GroupFieldType {
  TEXT = 'TEXT',
  NUMBER = 'NUMBER',
  DECIMAL = 'DECIMAL',
  BOOLEAN = 'BOOLEAN',
  DATE = 'DATE',
  DATETIME = 'DATETIME',
  SELECT = 'SELECT',
  MULTISELECT = 'MULTISELECT',
  TEXTAREA = 'TEXTAREA',
  URL = 'URL',
  EMAIL = 'EMAIL',
  PHONE = 'PHONE',
}

export interface GroupCustomField {
  id: string;
  groupId: string;
  key: string;
  nameEn: string;  // 英文名称（必填）
  nameCn?: string;  // 中文名称（可选）
  type: GroupFieldType;
  required: boolean;
  visible: boolean;
  editable: boolean;
  searchable: boolean;
  options?: string[];
  validation?: Record<string, any>;
  description?: string;
  placeholder?: string;
  helpText?: string;
  displayOrder: number;
  createdAt: string;
  updatedAt: string;
}

export interface PartGroup {
  id: string;
  name: string;
  description?: string;
  displayOrder: number;
  isActive: boolean;
  partsCount: number;
  fieldsCount: number;
  customFields?: GroupCustomField[];
  createdAt: string;
  updatedAt: string;
}

export interface CreatePartGroupDto {
  name: string;
  description?: string;
  displayOrder?: number;
  isActive?: boolean;
  customFields?: CreateGroupCustomFieldDto[];
}

export interface CreateGroupCustomFieldDto {
  key: string;
  nameEn: string;  // 英文名称（必填）
  nameCn?: string;  // 中文名称（可选）
  type: GroupFieldType;
  required?: boolean;
  visible?: boolean;
  editable?: boolean;
  searchable?: boolean;
  options?: string[];
  validation?: Record<string, any>;
  description?: string;
  placeholder?: string;
  helpText?: string;
  displayOrder?: number;
}

export interface UpdatePartGroupDto {
  name?: string;
  description?: string;
  displayOrder?: number;
  isActive?: boolean;
}

export interface UpdateGroupCustomFieldDto {
  id?: string;
  key?: string;
  nameEn?: string;  // 英文名称
  nameCn?: string;  // 中文名称
  type?: GroupFieldType;
  required?: boolean;
  visible?: boolean;
  editable?: boolean;
  searchable?: boolean;
  options?: string[];
  validation?: Record<string, any>;
  description?: string;
  placeholder?: string;
  helpText?: string;
  displayOrder?: number;
}

export interface QueryPartGroupsDto {
  search?: string;
  isActive?: boolean;
  page?: number;
  limit?: number;
}

export interface AssignPartsToGroupDto {
  partIds: string[];
}

export interface PartGroupsResponse {
  data: PartGroup[];
  total: number;
  page: number;
  limit: number;
}

// ============================================
// API Client
// ============================================

export const partGroupsApi = {
  /**
   * 获取所有分组
   */
  async getGroups(query?: QueryPartGroupsDto): Promise<PartGroupsResponse> {
    const response = await api.get<PartGroupsResponse>('/parts/groups', {
      params: query,
    });
    return response.data;
  },

  /**
   * 获取单个分组详情
   */
  async getGroup(id: string): Promise<PartGroup> {
    const response = await api.get<PartGroup>(`/parts/groups/${id}`);
    return response.data;
  },

  /**
   * 创建分组
   */
  async createGroup(data: CreatePartGroupDto): Promise<PartGroup> {
    const response = await api.post<PartGroup>('/parts/groups', data);
    return response.data;
  },

  /**
   * 更新分组
   */
  async updateGroup(id: string, data: UpdatePartGroupDto): Promise<PartGroup> {
    const response = await api.put<PartGroup>(`/parts/groups/${id}`, data);
    return response.data;
  },

  /**
   * 删除分组
   */
  async deleteGroup(id: string): Promise<void> {
    await api.delete(`/parts/groups/${id}`);
  },

  /**
   * 添加自定义字段到分组
   */
  async addCustomField(
    groupId: string,
    data: CreateGroupCustomFieldDto,
  ): Promise<GroupCustomField> {
    const response = await api.post<GroupCustomField>(
      `/parts/groups/${groupId}/fields`,
      data,
    );
    return response.data;
  },

  /**
   * 更新自定义字段
   */
  async updateCustomField(
    fieldId: string,
    data: UpdateGroupCustomFieldDto,
  ): Promise<GroupCustomField> {
    const response = await api.put<GroupCustomField>(
      `/parts/groups/fields/${fieldId}`,
      data,
    );
    return response.data;
  },

  /**
   * 删除自定义字段
   */
  async deleteCustomField(fieldId: string): Promise<void> {
    await api.delete(`/parts/groups/fields/${fieldId}`);
  },

  /**
   * 将零件分配到分组
   */
  async assignParts(groupId: string, data: AssignPartsToGroupDto): Promise<void> {
    await api.post(`/parts/groups/${groupId}/parts`, data);
  },

  /**
   * 从分组中移除零件
   */
  async removeParts(groupId: string, data: AssignPartsToGroupDto): Promise<void> {
    await api.delete(`/parts/groups/${groupId}/parts`, { data });
  },

  /**
   * 获取分组的所有零件
   */
  async getGroupParts(groupId: string, page = 1, limit = 20): Promise<any> {
    const response = await api.get(`/parts/groups/${groupId}/parts`, {
      params: { page, limit },
    });
    return response.data;
  },
};

