/** 商品类型枚举 */
export enum GoodsType {
  NORMAL = "normal", // 普通商品
  WEIGHT = "weight", // 称重商品
  GIFT = "gift", // 赠菜（继承普通商品逻辑，标记用）
  EMPTY = "", // 空字符串类型（后端未返回时默认归类为普通商品）
  PACKAGE = "package", // 打包商品（如套餐/预打包商品，按普通商品逻辑处理，可扩展特殊规则）
}

/** 优惠券计算结果类型（新增细分字段） */
export interface CouponResult {
  deductionAmount: number; // 抵扣金额
  excludedProductIds: string[]; // 不适用商品ID列表（注意：是商品ID，非购物车ID）
  usedCoupon: Coupon | undefined; // 实际使用的优惠券
  productCouponDeduction: number; // 新增：商品优惠券抵扣（兑换券等）
  fullCouponDeduction: number; // 新增：满减优惠券抵扣
}

/** 兑换券计算结果类型（新增细分字段） */
export interface ExchangeCalculationResult {
  deductionAmount: number;
  excludedProductIds: string[]; // 不适用商品ID列表（商品ID）
  productCouponDeduction: number; // 新增：兑换券属于商品券，同步记录
}

export interface CouponTypes {
  1: "满减券";
  2: "商品券";
  3: "折扣券";
  4: "第二件半价券";
  5: "消费送券";
  6: "买一送一券";
  7: "固定价格券";
  8: "免配送费券";
}

/** 优惠券类型枚举 */
export enum CouponType {
  FULL_REDUCTION = "full_reduction", // 满减券
  DISCOUNT = "discount", // 折扣券
  SECOND_HALF = "second_half", // 第二件半价券
  BUY_ONE_GET_ONE = "buy_one_get_one", // 买一送一券
  EXCHANGE = "exchange", // 商品兑换券
}

/** 后端返回的优惠券原始字段类型 */
export interface BackendCoupon {
  id?: number; // 自增主键（int64）
  shopId?: number; // 店铺ID（int64）
  syncId?: number; // 同步Id（int64）
  type?: number; // 优惠券类型：1-满减券，2-商品兑换券，3-折扣券，4-第二件半价券，5-消费送券，6-买一送一券，7-固定价格券，8-免配送费券
  name?: string; // 券名称
  useShopType?: string; // 可用门店类型：only-仅本店；all-所有门店，custom-指定门店
  useShops?: string; // 可用门店（逗号分隔字符串，如"1,2,3"）
  useType?: string; // 可使用类型：dine堂食/pickup自取/deliv配送/express快递
  validType?: string; // 有效期类型：fixed（固定时间），custom（自定义时间）
  validDays?: number; // 有效期(天)
  validStartTime?: string; // 有效期开始时间（如"2024-01-01 00:00:00"）
  validEndTime?: string; // 有效期结束时间
  daysToTakeEffect?: number; // 隔天生效
  useDays?: string; // 可用周期（如"周一,周二"）
  useTimeType?: string; // 可用时间段类型：all-全时段，custom-指定时段
  useStartTime?: string; // 可用开始时间（每日）
  useEndTime?: string; // 可用结束时间（每日）
  getType?: string; // 发放设置：不可自行领取/no，可领取/yes
  getMode?: string; // 用户领取方式
  giveNum?: number; // 总发放数量，-10086为不限量
  getUserType?: string; // 可领取用户：全部/all，新用户一次/new，仅会员/vip
  getLimit?: number; // 每人领取限量，-10086为不限量
  useLimit?: number; // 每人每日使用限量，-10086为不限量
  discountShare?: number; // 与限时折扣同享：0-否，1-是
  vipPriceShare?: number; // 与会员价同享：0-否，1-是
  ruleDetails?: string; // 附加规则说明
  status?: number; // 状态：0-禁用，1-启用
  useNum?: number; // 已使用数量
  leftNum?: number; // 剩余数量
  foods?: string; // 指定门槛商品（逗号分隔字符串，如"101,102"，此处为商品ID）
  fullAmount?: number; // 使用门槛：满多少金额（元）
  discountAmount?: number; // 使用门槛：减多少金额（元）
  discountRate?: number; // 折扣%（如90=9折）
  maxDiscountAmount?: number; // 可抵扣最大金额（元）
  useRule?: string; // 使用规则：price_asc-价格低到高，price_desc-高到低
  discountNum?: number; // 抵扣数量
  otherCouponShare?: number; // 与其它优惠共享：0-否，1-是
  createTime?: string; // 创建时间
  updateTime?: string; // 更新时间
}

/** 营销活动类型枚举 */
export enum ActivityType {
  TIME_LIMIT_DISCOUNT = "time_limit_discount", // 限时折扣
}

/** 基础购物车商品项（核心修正：新增product_id，明确各ID含义） */
export interface BaseCartItem {
  id: string | number; // 购物车ID（唯一标识购物车中的条目，如购物车项主键）
  product_id: string | number; // 商品ID（唯一标识商品，用于优惠券/活动匹配，必选）
  productId?: string | number; // 商品ID
  salePrice: number; // 商品原价（元）
  number: number; // 商品数量
  num?: number; // 商品数量
  isTimeDiscount?: boolean; // 是否限时折扣商品（默认false）
  is_time_discount?: boolean; // 是否限时折扣商品（默认false）
  product_type: GoodsType; // 商品类型
  is_temporary?: boolean; // 是否临时菜（默认false）
  isTemporary?: boolean; // 是否临时菜（默认false）
  is_gift?: boolean; // 是否赠菜（默认false）
  isGift?: boolean; // 是否赠菜（默认false）
  returnNum?: number; // 退货数量（历史订单用，默认0）
  memberPrice: number; // 商品会员价（元，优先级：商品会员价 > 会员折扣）
  discountSaleAmount?: number; // 商家改价后单价（元，优先级最高）
  discount_sale_amount?: number; // 商家改价后单价（元，优先级最高）
  packFee?: number; // 单份打包费（元，默认0）
  packNumber?: number; // 堂食打包数量（默认0）
  activityInfo?: {
    // 商品参与的营销活动（如限时折扣）
    type: ActivityType;
    discountRate: number; // 折扣率（如0.8=8折）
    vipPriceShare: boolean; // 是否与会员优惠同享（默认false）
  };
  skuData?: {
    // SKU扩展数据（可选）
    id: string | number; // SKU ID（唯一标识商品规格，如颜色/尺寸）
    memberPrice: number; // SKU会员价
    salePrice?: number; // SKU原价
  };
  skuId?: string | number; // SKU ID（唯一标识商品规格，如颜色/尺寸）
  couponType?: number; // 优惠券类型：1-满减券，2-商品兑换券，3-折扣券，4-第二件半价券，5-消费送券，6-买一送一券，7-固定价格券，8-免配送费券
}

export interface CouponFoods {
  id: string;
  name: string;
  images: string;
}

/** 基础优惠券接口（所有券类型继承，包含统一门槛商品字段） */
export interface BaseCoupon {
  otherCouponShare?: number; // 与其它优惠共享：0-否，1-是
  id: string | number; // 优惠券ID
  type: number; // 工具库字符串枚举（由后端couponType转换）
  name: string; // 对应后端title
  available: boolean; // 基于BackendCoupon字段计算的可用性
  useShopType?: string; // only-仅本店；all-所有门店，custom-指定门店
  useShops: string[]; // 可用门店ID列表
  discountShare: boolean; // 与限时折扣同享：0-否，1-是（后端字段转换为布尔值）
  vipPriceShare: boolean; // 与会员价同享：0-否，1-是（后端字段转换为布尔值）
  useType?: string[]; // 可使用类型：dine堂食/pickup自取/deliv配送/express快递
  isValid: boolean; // 是否在有效期内
  discountAmount?: number; // 减免金额 (满减券有)
  fullAmount?: number; // 使用门槛：满多少金额
  maxDiscountAmount?: number; // 可抵扣最大金额 元
  use: boolean;
  discountNum?: number; // 抵扣数量
  useRule?: string; // 使用规则：price_asc-价格低到高，price_desc-高到低
  discountRate?: number; // 折扣%（如90=9折）
  noUseRestrictions?: boolean; // 是不可用原因
  thresholdFoods: CouponFoods[]; // 门槛商品ID列表（空数组=全部商品，非空=指定商品ID）
  useFoods: CouponFoods[]; // 可用商品ID列表（空数组=全部商品，非空=指定商品ID）
}
export interface couponDiscount {
  discountPrice: number;
  hasDiscountGoodsArr: BaseCartItem[];
}
/** 满减券（适配后端字段） */
export interface FullReductionCoupon extends BaseCoupon {
  fullAmount: number; // 对应后端fullAmount（满减门槛）
  discountAmount: number; // 对应后端discountAmount（减免金额）
  maxDiscountAmount?: number; // 对应后端maxDiscountAmount（最大减免）
  discount?: couponDiscount;
}

/** 折扣券（适配后端字段） */
export interface DiscountCoupon extends BaseCoupon {
  discountRate: number; // 后端discountRate（%）转小数（如90→0.9）
  maxDiscountAmount: number; // 对应后端maxDiscountAmount（最大减免）
  discount?: couponDiscount;
}

/** 第二件半价券（适配后端字段） */
export interface SecondHalfPriceCoupon extends BaseCoupon {
  maxUseCountPerOrder?: number; // 对应后端useLimit（-10086=不限）
  discount?: couponDiscount;
}

/** 买一送一券（适配后端字段） */
export interface BuyOneGetOneCoupon extends BaseCoupon {
  maxUseCountPerOrder?: number; // 对应后端useLimit（-10086=不限）
  discount?: couponDiscount;
}

/** 商品兑换券（适配后端字段） */
export interface ExchangeCoupon extends BaseCoupon {
  deductCount: number; // 对应后端discountNum（抵扣数量）
  sortRule: "low_price_first" | "high_price_first"; // 后端useRule转换
  discount?: couponDiscount;
}

/** 所有优惠券类型联合 */
export type Coupon =
  | FullReductionCoupon
  | DiscountCoupon
  | SecondHalfPriceCoupon
  | BuyOneGetOneCoupon
  | ExchangeCoupon;

/** 营销活动配置（如限时折扣，applicableProductIds为商品ID列表） */
export interface ActivityConfig {
  type: ActivityType;
  applicableProductIds?: string[]; // 适用商品ID列表（与BaseCartItem.product_id匹配）
  discountRate: number; // 折扣率（如0.8=8折）
  vipPriceShare: boolean; // 是否与会员优惠同享
}

/** 积分抵扣规则 */
export interface PointDeductionRule {
  pointsPerYuan: number; // X积分=1元（如100=100积分抵1元）
  maxDeductionAmount?: number; // 最大抵扣金额（元，默认不限）
}

/** 餐位费配置 */
export interface SeatFeeConfig {
  pricePerPerson: number; // 每人餐位费（元）
  personCount: number; // 用餐人数（默认1）
  isEnabled: boolean; // 是否启用餐位费（默认false）
}
/** 商家减免类型枚举 */
export enum MerchantReductionType {
  FIXED_AMOUNT = "fixed_amount", // 固定金额减免（如直接减 10 元）
  DISCOUNT_RATE = "discount_rate", // 比例折扣减免（如打 9 折，即减免 10%）
}

/** 商家减免配置（新增，替代原单一金额字段） */
export interface MerchantReductionConfig {
  type: MerchantReductionType; // 减免类型（二选一）
  fixedAmount?: number; // 固定减免金额（元，仅 FIXED_AMOUNT 生效，≥0）
  discountRate?: number; // 折扣率（%，仅 DISCOUNT_RATE 生效，0-100，如 90 代表 9 折）
}
/**商家霸王餐配置 */
export interface FreeDineConfig {
  enable: boolean; //是否开启
  rechargeThreshold: number; //订单满多少元可以使用
  rechargeTimes: number; //充值多少倍免单
  withCoupon: boolean; //与优惠券同享
  withPoints: boolean; //与积分同享
  useType?: string[]; //使用类型 dine-in店内 takeout 自取 post快递，takeaway外卖
  useShopType?: string; //all 全部 part部分
  shopIdList?: number[]; //可用门店id
}

//限时折扣配置
export interface TimeLimitDiscountConfig {
  /**
   * 折扣优先级 limit-time/vip-price
   */
  discountPriority: string;
  /**
   * 折扣% 范围1-99
   */
  discountRate: number;
  /**
   * 参与商品
   */
  foods: string;
  /**
   * 参与商品 1全部 2部分
   */
  foodType: number;
  /**
   * 自增主键
   */
  id: number;
  /**
   * 店铺ID
   */
  shopId: number;
  /**
   * 可使用类型：堂食 dine-in  外带 take-out 外卖 take-away 配送 post
   */
  useType: string;
  [property: string]: any;
}

//用户信息
export interface ShopUserInfo {
  isVip: number | null; //是否会员
  discount: number | null; //用户折扣
  isMemberPrice: number | null; //会员折扣与会员价是否同时使用
  id?: number; //用户ID
}
/** 订单额外费用配置 */
export interface OrderExtraConfig {
  // merchantReduction: number;        // 商家减免金额（元，默认0）
  // 替换原单一金额字段，支持两种减免形式
  merchantReduction: MerchantReductionConfig;
  additionalFee: number; // 附加费（元，如余额充值、券包，默认0）
  pointDeductionRule: PointDeductionRule; // 积分抵扣规则
  seatFeeConfig: SeatFeeConfig; // 餐位费配置
  currentStoreId: string; // 当前门店ID（用于验证优惠券适用门店）
  userPoints: number; // 用户当前积分（用于积分抵扣）
  isMember: boolean; // 用户是否会员（用于会员优惠）
  memberDiscountRate?: number; // 会员折扣率（如0.95=95折，无会员价时用）
  newUserDiscount?: number; // 新用户减免金额（元，默认0）
  fullReductionActivities: FullReductionActivity[]; // 当前店铺的满减活动列表（后端返回结构）
  currentDinnerType: "dine-in" | "take-out" | "take-away" | "post"; // 当前就餐类型（匹配useType）
  isFreeDine?: boolean; //是否霸王餐
  freeDineConfig?: FreeDineConfig;
  limitTimeDiscount?: TimeLimitDiscountConfig; //限时折扣
  shopUserInfo: ShopUserInfo; // 用户信息
}

/** 订单费用汇总（修改：补充商家减免类型和明细） */
export interface OrderCostSummary {
  goodsList: BaseCartItem[];
  // 商品总件数
  goodsTotal: number;
  totalDiscountAmount: number;
  goodsRealAmount: number; // 商品真实原价总和
  goodsOriginalAmount: number; // 商品原价总和
  goodsDiscountAmount: number; // 商品折扣金额
  couponDeductionAmount: number; // 优惠券总抵扣
  productCouponDeduction: number; // 商品优惠券抵扣
  fullCouponDeduction: number; // 满减优惠券抵扣
  pointDeductionAmount: number; // 积分抵扣金额
  seatFee: number; // 餐位费
  packFee: number; // 打包费
  scoreMaxMoney: number; // 积分最大可抵扣金额
  // 新增：商家减免明细
  merchantReduction: {
    type: MerchantReductionType; // 实际使用的减免类型
    originalConfig: MerchantReductionConfig; // 原始配置（便于前端展示）
    actualAmount: number; // 实际减免金额（计算后的值，≥0）
  };
  additionalFee: number; // 附加费
  finalPayAmount: number; // 最终实付金额
  couponUsed?: Coupon; // 实际使用的优惠券
  pointUsed: number; // 实际使用的积分
  newUserDiscount: number; // 新用户减免金额（元，默认0）
  dinnerType?: "dine-in" | "take-out"; // 就餐类型（堂食/自取/配送/快递）
  config: OrderExtraConfig; // 订单额外费用配置
  //满减活动
  fullReduction: {
    usedFullReductionActivityFullAmount: number; // 计算出的满减活动的门槛金额
    usedActivity?: FullReductionActivity; // 实际使用的满减活动
    usedThreshold?: FullReductionThreshold; // 实际使用的满减阈值（多门槛中选最优）
    actualAmount: number; // 满减实际减免金额（元）
  };
  vipDiscountAmount: number; //会员折扣减免金额
  // 订单原支付金额
  orderOriginFinalPayAmount: number; //订单原金额（包含打包费+餐位费）
}

/** 满减活动阈值（单条满减规则：满X减Y）- 对应 MkDiscountThresholdInsertGroupDefaultGroup */
export interface FullReductionThreshold {
  activityId?: number; // 关联满减活动ID
  fullAmount?: number; // 满多少金额（元，必填）
  discountAmount?: number; // 减多少金额（元，必填）
}

/** 满减活动主表 - 对应 Request 接口（后端真实字段） */
export interface FullReductionActivity {
  id?: number; // 自增主键（后端字段：id）
  shopId?: number; // 店铺ID（后端字段：shopId）
  status?: number; // 活动状态：1=未开始，2=进行中，3=已结束（后端字段：status）
  sort?: number; // 排序值（越大优先级越高，后端字段：sort）
  createTime?: string; // 创建时间（后端字段：createTime，格式如"2025-10-14 13:56:07"）
  updateTime?: string; // 最新修改时间（后端字段：updateTime，用于优先级排序）
  validStartTime?: string; // 有效期开始时间（后端字段：validStartTime，格式如"2025-10-14"）
  validEndTime?: string; // 有效期结束时间（后端字段：validEndTime，格式如"2025-12-14"）
  useType?: string; // 可使用类型（后端字段：useType，如"dine,pickup,deliv,express"）
  useDays?: string; // 可用周期（后端字段：useDays，如"周一,周二,周三,周四,周五,周六,周日"）
  useTimeType?: string; // 可用时间段类型（后端字段：useTimeType，all=全时段，custom=指定时段）
  useStartTime?: string; // 每日可用开始时间（后端字段：useStartTime，如"09:00:00"，仅custom时有效）
  useEndTime?: string; // 每日可用结束时间（后端字段：useEndTime，如"22:00:00"，仅custom时有效）
  couponShare?: number; // 与优惠券同享：0=否，1=是（后端字段：couponShare）
  discountShare?: number; // 与限时折扣同享：0=否，1=是（后端字段：discountShare）
  vipPriceShare?: number; // 与会员价同享：0=否，1=是（后端字段：vipPriceShare）
  pointsShare?: number; // 与积分抵扣同享：0=否，1=是（后端字段：pointsShare）
  thresholds?: FullReductionThreshold[]; // 满减阈值列表（多门槛，后端字段：thresholds）
  isDel?: boolean; // 是否删除：0=否，1=是（后端字段：isDel，默认false）
}

// 辅助枚举：星期映射（用于useDays校验）
export const WEEKDAY_MAP = {
  周一: 1,
  周二: 2,
  周三: 3,
  周四: 4,
  周五: 5,
  周六: 6,
  周日: 0, // JS中getDay()返回0=周日
};

export interface ShopInfo {
  isMemberPrice: number; // 是否开启会员价 1是开启
  [property: string]: any;
}

export interface couponCalcParams {
  canDikouGoodsArr: BaseCartItem[];
  coupon: Coupon;
  user: ShopUserInfo;
  shopInfo: ShopInfo;
  selCoupon: Coupon[];
  goodsOrderPrice: number; //商品订单总价
  isMemberPrice: number; // 是否开启会员价 1是开启
  limitTimeDiscount?: TimeLimitDiscountConfig | null | undefined;
}
export interface CanDikouGoodsArrArgs {
  canDikouGoodsArr: BaseCartItem[];
  selCoupon: Coupon[];
  user: ShopUserInfo;
  shopInfo: ShopInfo;
  limitTimeDiscount?: TimeLimitDiscountConfig | null | undefined;
}
export interface returnPriceArgs {
  goods: BaseCartItem;
  selCoupon: Coupon[];
  user: ShopUserInfo;
  shopInfo: ShopInfo;
  shopUserInfo: ShopUserInfo;
  limitTimeDiscountRes?: TimeLimitDiscountConfig | null | undefined;
  idKey?: keyof BaseCartItem;
}


export interface CanReturnMemberPriceArgs {
  shopInfo?: ShopInfo;
  shopUserInfo: ShopUserInfo;
}
