package com.hzs.activity.pick.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hzs.activity.pick.param.AcPickQueryParam;
import com.hzs.activity.pick.param.AcPickSaveParam;
import com.hzs.activity.pick.vo.ApiPickListVO;
import com.hzs.common.domain.activity.pick.AcPick;
import com.hzs.common.domain.activity.pick.AcPickMemberLog;
import com.hzs.common.domain.activity.pick.ext.AcPickExt;
import com.hzs.system.sys.dto.ApprovalBusinessResultDTO;
import com.hzs.system.sys.dto.LoginUser;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 提货基础表 服务类
 */
public interface IAcPickService extends IService<AcPick> {

    /**
     * 添加提货数据
     *
     * @param pkMember       添加会员ID
     * @param pickType       提货类型（保持与EPickType枚举值一样）
     * @param pkBaseConfig   活动配置ID（非必传）
     * @param pkDataId       对应数据ID（产品为产品ID，活动为规则ID）
     * @param usableQuantity 可提数量
     * @param pickCover      提货封面
     * @param receiveTime    领取截止时间（为空传null）
     * @param pkPostage      邮费模板（包邮传null）
     * @param pkCreator      创建人
     * @param pkCountry      所属国家
     * @param pkBaseId       活动ID（活动必填，非活动可传null）
     * @param specsNameId    规格ID
     * @param specsName      规格名称
     * @return
     */
    boolean addPickByActivity(Long pkMember, Integer pickType, Long pkBaseConfig, Long pkDataId,
                              Integer usableQuantity, String pickCover, Date receiveTime, Integer pkPostage,
                              Long pkCreator, Integer pkCountry, Long pkBaseId, String specsNameId, String specsName);

    /**
     * 根据会员和类型回退使用数量
     *
     * @param pkMember     会员ID
     * @param pickType     提货类型
     * @param pkBaseConfig 活动配置ID（产品时为0） -- 可为null
     * @param pkDataId     数据ID（产品为产品ID，活动为活动ID） -- 可为null
     * @param quantity     数量
     * @param pkModified   操作人
     * @return
     */
    int updatePickUsableByMember(Long pkMember, Integer pickType, Long pkBaseConfig,
                                 Long pkDataId, Integer quantity, Long pkModified);


    /**
     * 根据会员和活动类型回退使用数量
     *
     * @param pkMember     会员ID
     * @param pickType     提货类型
     * @param pkBaseConfig 活动配置ID（产品时为0） -- 可为null
     * @param pkDataId     数据ID（产品为产品ID，活动为活动ID） -- 可为null
     * @param quantity     数量
     * @param pkModified   操作人
     * @return
     */
    int updatePickUsableByMemberAndActivityType(Long pkMember, Integer pickType, Long pkBaseConfig,
                                                Long pkDataId, Integer quantity, Long pkModified);

    /*
     * @description: 更新提货单
     **/
    boolean updatePickUse(List<AcPickExt> acPickExtList, Integer signSource, List<AcPickMemberLog> acPickMemberLogList);

    /*
     * @description: 更新提货单
     **/
    boolean updatePickUse(List<AcPickExt> acPickExtList, List<AcPickMemberLog> acPickMemberLogList);

    /**
     * 查询提货列表
     *
     * @param param     查询参数
     * @param pkCountry 所属国家
     * @return
     */
    List<AcPickExt> queryList(AcPickQueryParam param, Integer pkCountry);

    /**
     * 查询提货ID
     *
     * @param pkId 提货ID
     * @param pkId 所属国家
     * @return
     */
    AcPickExt queryDetail(Long pkId, Integer pkCountry);

    /**
     * 提货变动提交
     *
     * @param param     提货入参
     * @param loginUser 当前用户
     * @return
     */
    String pickSubmit(AcPickSaveParam param, LoginUser loginUser);

    /**
     * @description: 删除充值提货卡发起签呈
     **/
    boolean delPick(AcPickSaveParam anpParam);

    /**
     * 提货变动审批通过
     *
     * @param resultDTO
     * @return
     */
    String pickApprovalAgree(ApprovalBusinessResultDTO resultDTO);

    /**
     * @description: 审核删除充值提货卡
     **/
    String delpickApprovalAgree(ApprovalBusinessResultDTO resultDTO);

    /**
     * 提货变动审批驳回
     *
     * @param resultDTO
     * @return
     */
    String pickApprovalReject(ApprovalBusinessResultDTO resultDTO);

    /**
     * 会员提货列表
     *
     * @param pkMember  会员ID
     * @param pkCountry 所属国家
     * @return
     */
    List<ApiPickListVO> pickList(Long pkMember, Integer pkCountry);

    /**
     * 提货订单回调处理
     *
     * @param pkMember  会员ID
     * @param orderCode 订单编号
     * @return
     */
    boolean callbackPickOrder(Long pkMember, String orderCode);

    /**
     * 取消提货订单（退还提货数量）
     *
     * @param orderCode 订单编号
     * @param userId    会员ID
     * @return
     */
    boolean cancelPickOrder(String orderCode, Long userId);

    /**
     * 邮费处理
     *
     * @param acPick      提货基础表
     * @param quantity    数量
     * @param recProvince 省
     * @param recCity     市
     * @param pkCountry   所属国家
     * @return
     */
    BigDecimal postageHandle(AcPick acPick, Integer quantity, Integer recProvince, Integer recCity, Integer pkCountry);

    /**
     * 撤单扣减乐学代金券
     *
     * @param pkMember
     * @param pkOrder
     * @return
     */
    int deductionsCouponByOrder(Long pkMember, Long pkOrder);

}
