/**
 * 文件职责：费用设置模块 API 与 DTO 定义。
 * 1. 维护起送/配送费、包装费、其他费用类型。
 * 2. 提供查询、保存与复制费用设置接口。
 */
import { requestClient } from '#/api/request';

/** 包装费模式 */
export type PackagingFeeMode = 'item' | 'order';

/** 按订单包装费模式 */
export type OrderPackagingFeeMode = 'fixed' | 'tiered';

/** 其他费用类型 */
export type AdditionalFeeType = 'cutlery' | 'rush';

/** 阶梯包装费条目 */
export interface PackagingFeeTierDto {
  /** 单档费用 */
  fee: number;
  /** 主键 */
  id: string;
  /** 起始订单金额（含） */
  minAmount: number;
  /** 结束订单金额（空值表示无上限） */
  maxAmount: null | number;
  /** 排序号 */
  sort: number;
}

/** 单项其他费用 */
export interface AdditionalFeeItemDto {
  /** 费用金额 */
  amount: number;
  /** 是否启用 */
  enabled: boolean;
}

/** 其他费用聚合 */
export interface StoreOtherFeesDto {
  cutlery: AdditionalFeeItemDto;
  rush: AdditionalFeeItemDto;
}

/** 门店费用设置聚合 */
export interface StoreFeesSettingsDto {
  /** 基础配送费 */
  baseDeliveryFee: number;
  /** 平台服务费率（%） */
  platformServiceRate: number;
  /** 固定包装费 */
  fixedPackagingFee: number;
  /** 免配送费门槛，空值表示关闭 */
  freeDeliveryThreshold: null | number;
  /** 起送金额 */
  minimumOrderAmount: number;
  /** 其他费用 */
  otherFees: StoreOtherFeesDto;
  /** 按订单包装费模式 */
  orderPackagingFeeMode: OrderPackagingFeeMode;
  /** 包装费模式 */
  packagingFeeMode: PackagingFeeMode;
  /** 包装费阶梯 */
  packagingFeeTiers: PackagingFeeTierDto[];
  /** 是否已配置 */
  isConfigured: boolean;
  /** 门店 ID */
  storeId: string;
}

/** 保存费用设置参数 */
export interface SaveStoreFeesSettingsParams {
  /** 基础配送费 */
  baseDeliveryFee: number;
  /** 平台服务费率（%） */
  platformServiceRate: number;
  /** 固定包装费 */
  fixedPackagingFee: number;
  /** 免配送费门槛，空值表示关闭 */
  freeDeliveryThreshold: null | number;
  /** 起送金额 */
  minimumOrderAmount: number;
  /** 其他费用 */
  otherFees: StoreOtherFeesDto;
  /** 按订单包装费模式 */
  orderPackagingFeeMode: OrderPackagingFeeMode;
  /** 包装费模式 */
  packagingFeeMode: PackagingFeeMode;
  /** 包装费阶梯 */
  packagingFeeTiers: PackagingFeeTierDto[];
  /** 门店 ID */
  storeId: string;
}

/** 保存包装费收取方式参数 */
export interface SaveStoreFeesModeParams {
  /** 包装费模式 */
  packagingFeeMode: PackagingFeeMode;
  /** 门店 ID */
  storeId: string;
}

/** 复制费用设置参数 */
export interface CopyStoreFeesSettingsParams {
  sourceStoreId: string;
  targetStoreIds: string[];
}

/** 获取门店费用设置 */
export async function getStoreFeesSettingsApi(storeId: string) {
  return requestClient.get<StoreFeesSettingsDto>('/store/fees', {
    params: { storeId },
  });
}

/** 保存门店费用设置 */
export async function saveStoreFeesSettingsApi(
  data: SaveStoreFeesSettingsParams,
) {
  return requestClient.post<StoreFeesSettingsDto>('/store/fees/save', data);
}

/** 保存包装费收取方式 */
export async function saveStoreFeesModeApi(data: SaveStoreFeesModeParams) {
  return requestClient.post('/store/fees/mode/save', data);
}

/** 复制费用设置到其他门店 */
export async function copyStoreFeesSettingsApi(
  data: CopyStoreFeesSettingsParams,
) {
  return requestClient.post('/store/fees/copy', data);
}
