import { request } from './request';

export interface PageResult<T> {
  list: T[];
  total: number;
}

export interface MaterialItem {
  id?: number;
  code: string;
  name: string;
  specification?: string;
  categoryId?: number;
  categoryName?: string;
  unitMeasureId?: number;
  unitMeasureName?: string;
  unitMeasureId2?: number;
  unitMeasureName2?: string;
  unitMeasureRate1?: number;
  unitMeasureId3?: number;
  unitMeasureName3?: string;
  unitMeasureRate2?: number;
  itemType?: number;
  status: number;
  purchasePrice?: number;
  salesPrice?: number;
  costPrice?: number;
  safetyStock?: number;
  minStock?: number;
  maxStock?: number;
  warehouseId?: number;
  warehouseCode?: string;
  warehouseName?: string;
  remark?: string;
  isBatchManaged?: boolean;
  produceDateFlag?: boolean;
  expireDateFlag?: boolean;
  receiptDateFlag?: boolean;
  vendorFlag?: boolean;
  purchaseOrderCodeFlag?: boolean;
  lotNumberFlag?: boolean;
  qualityStatusFlag?: boolean;
  expiryDay?: number;
  syncMes?: boolean;
  syncedMes?: boolean;
}

export interface MaterialCategory {
  id?: number;
  parentId?: number;
  code?: string;
  name?: string;
  itemOrProduct?: string;
  sort?: number;
  status?: number;
  remark?: string;
  children?: MaterialCategory[];
}

export interface MeasureUnit {
  id?: number;
  code: string;
  name: string;
  primaryFlag?: boolean;
  primaryId?: number;
  changeRate?: number;
  status: number;
  remark?: string;
}

function authHeader(accessToken: string) {
  return { Authorization: `Bearer ${accessToken}` };
}

function toQuery(params: Record<string, string | number | boolean | undefined>) {
  const query = Object.keys(params)
    .filter((key) => params[key] !== undefined && params[key] !== '')
    .map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(String(params[key]))}`)
    .join('&');
  return query ? `?${query}` : '';
}

export function getMaterialPage(accessToken: string, params: { pageNo: number; pageSize: number; name?: string; code?: string; status?: number }) {
  return request<PageResult<MaterialItem>>(`/mdm/item/page${toQuery(params)}`, { header: authHeader(accessToken) });
}
export function getMaterial(accessToken: string, id: number) {
  return request<MaterialItem>(`/mdm/item/get${toQuery({ id })}`, { header: authHeader(accessToken) });
}
export function createMaterial(accessToken: string, data: MaterialItem) {
  return request<number>('/mdm/item/create', { method: 'POST', data, header: authHeader(accessToken) });
}
export function updateMaterial(accessToken: string, data: MaterialItem) {
  return request<boolean>('/mdm/item/update', { method: 'PUT', data, header: authHeader(accessToken) });
}
export function deleteMaterial(accessToken: string, id: number) {
  return request<boolean>(`/mdm/item/delete${toQuery({ id })}`, { method: 'DELETE', header: authHeader(accessToken) });
}
export function deleteMaterialList(accessToken: string, ids: number[] | string) {
  return request<boolean>(`/mdm/item/delete-list${toQuery({ ids: Array.isArray(ids) ? ids.join(',') : ids })}`, { method: 'DELETE', header: authHeader(accessToken) });
}
export function updateMaterialStatus(accessToken: string, id: number, status: number) {
  return request<boolean>('/mdm/item/update-status', { method: 'PUT', data: { id, status }, header: authHeader(accessToken) });
}
export function updateMaterialSync(accessToken: string, id: number, sync: boolean) {
  return request<boolean>('/mdm/item/update-sync', { method: 'PUT', data: { id, sync }, header: authHeader(accessToken) });
}

export function getMaterialCategoryList(accessToken: string, params: { name?: string; status?: number } = {}) {
  return request<MaterialCategory[]>(`/mes/md/item-type/list${toQuery(params)}`, { header: authHeader(accessToken) });
}
export function getMaterialCategorySimpleList(accessToken: string) {
  return request<MaterialCategory[]>('/mes/md/item-type/simple-list', { header: authHeader(accessToken) });
}
export function getMaterialCategory(accessToken: string, id: number) {
  return request<MaterialCategory>(`/mes/md/item-type/get${toQuery({ id })}`, { header: authHeader(accessToken) });
}
export function generateMaterialCategoryCode(accessToken: string): Promise<string> {
  return request<string>('/mes/md/auto-code-record/generate', {
    method: 'POST',
    data: { ruleCode: 'MD_ITEM_TYPE_CODE' },
    header: authHeader(accessToken),
  });
}
export function createMaterialCategory(accessToken: string, data: MaterialCategory) {
  return request<number>('/mes/md/item-type/create', { method: 'POST', data, header: authHeader(accessToken) });
}
export function updateMaterialCategory(accessToken: string, data: MaterialCategory) {
  return request<boolean>('/mes/md/item-type/update', { method: 'PUT', data, header: authHeader(accessToken) });
}
export function deleteMaterialCategory(accessToken: string, id: number) {
  return request<boolean>(`/mes/md/item-type/delete${toQuery({ id })}`, { method: 'DELETE', header: authHeader(accessToken) });
}

export function getMeasureUnitPage(accessToken: string, params: { pageNo: number; pageSize: number; name?: string; code?: string; status?: number }) {
  return request<PageResult<MeasureUnit>>(`/mdm/unit/page${toQuery(params)}`, { header: authHeader(accessToken) });
}
/**
 * 计量单位候选列表（下拉/选择器用）。
 * 对齐 web 的 MdUnitMeasureSelect：web 走的就是 `/mdm/unit/page`（pageSize 100），
 * 而不是 `/mes/md/unit-measure/simple-list`（该接口实测恒返回空，见 2026-10-10 日志）。
 */
export async function getMeasureUnitList(accessToken: string) {
  const res = await getMeasureUnitPage(accessToken, { pageNo: 1, pageSize: 100 });
  return res?.list || [];
}
export function getMeasureUnit(accessToken: string, id: number) {
  return request<MeasureUnit>(`/mdm/unit/get${toQuery({ id })}`, { header: authHeader(accessToken) });
}
export function createMeasureUnit(accessToken: string, data: MeasureUnit) {
  return request<number>('/mdm/unit/create', { method: 'POST', data, header: authHeader(accessToken) });
}
export function updateMeasureUnit(accessToken: string, data: MeasureUnit) {
  return request<boolean>('/mdm/unit/update', { method: 'PUT', data, header: authHeader(accessToken) });
}
export function deleteMeasureUnit(accessToken: string, id: number) {
  return request<boolean>(`/mdm/unit/delete${toQuery({ id })}`, { method: 'DELETE', header: authHeader(accessToken) });
}
