package com.iformall.service;

import java.util.*;
import com.github.pagehelper.PageInfo;
import com.iformall.common.ResultData;
import com.iformall.domain.po.WxCoupon;
import com.iformall.domain.vo.WxCouponCVo;
import com.iformall.domain.vo.WxCouponStatisVo;
import org.apache.ibatis.annotations.Param;

public interface WxCouponService {


    ResultData list(WxCoupon wxCoupon, Integer pageNum, Integer pageSize);

	/**
     * 根据实体查询分页列表
     *
     * @param record
     * @param pageIndex
     * @param pageSize
     * @return
     */
	PageInfo<WxCoupon> listAsPage(WxCoupon record, Integer pageIndex, Integer pageSize);

    /**
     * 卡类列表，包括统计
     * @param record
     * @return
     */
    PageInfo<WxCouponStatisVo> findCountData(WxCoupon record, Integer pageNum, Integer pageSize);

    /**
     * 卷列表，包括统计
     * @param record
     * @return
     */
    PageInfo<WxCouponStatisVo> findCouponData(WxCoupon record,Integer pageNum, Integer pageSize);

    /**
     * 砍价列表，包括统计
     * @param record
     * @param pageNum
     * @param pageSize
     * @return
     */
    PageInfo<WxCouponStatisVo> findPressData(WxCoupon record,Integer pageNum, Integer pageSize);

	/**
     * 根据Id获得实体
     *
     * @param id
     * @return
     */
    WxCoupon getById(Long id);


    WxCouponCVo getVoById(Long id);

    WxCouponCVo getVoStatusById(Long id);
    /**
     * 保存或更新实体
     *
     * @param record
     */
    ResultData saveOrUpdate(WxCoupon record);
    /**
     * 更新实体
     *
     * @param record
     */
    void update(WxCoupon record);
    /**
     * 根据Id删除实体
     *
     * @param id
     */
    void deleteById(Long id);


    /**
     * 查询时间段内销售金额
     * @param wxCoupon
     * @return
     */
    List<WxCouponStatisVo> findSaleMoneyByDate(WxCoupon wxCoupon);

    /**
     * 查询时间段内核销金额
     * @param wxCoupon
     * @return
     */
    List<WxCouponStatisVo> findPaymentByDate(WxCoupon wxCoupon);

    /**
     * 查询售出卡数量
     * @return
     */
    Long findSaleCardCount(WxCoupon wxCoupon);

    /**
     * 查询转增数量
     * @return
     */
    Long findTranCardCount(WxCoupon wxCoupon);

    /**
     * 查询补贴金额
     * @return
     */
    String findSubsidyMoney(WxCoupon wxCoupon);

    //----------------卷--------------
    /**
     * 卷发放数量
     * @return
     */
    //List<WxCoupon> findCouponSendCount(WxCoupon wxCoupon);

    /**
     * 卷购买数量
     * @return
     */
    List<WxCouponStatisVo> findCouponOrderCount(WxCoupon wxCoupon);

    /**
     * 卷领取数量
     * @return
     */
    //List<WxCoupon> findCouponGetCount(WxCoupon wxCoupon);

    /**
     * 卷核销数量
     * @return
     */
    List<WxCouponStatisVo> findCouponPaymentCount(WxCoupon wxCoupon);

    /**
     * 有价卷销售数量
     * @return
     */
    List<WxCouponStatisVo> priceCouponSaleCount(WxCoupon wxCoupon);

    /**
     * 有价卷核销数量
     * @return
     */
    List<WxCouponStatisVo> priceCouponPaymentCount(WxCoupon wxCoupon);

    /**
     * 有价卷退款数量
     * @return
     */
    Long priceCouponCancelCount(WxCoupon wxCoupon);

    /**
     * 有价券销售总额
     * @param wxCoupon
     * @return
     */
    String findSumPriceSaleMoney(WxCoupon wxCoupon);
    String findSumPricePayMent(WxCoupon wxCoupon);
    String findSumSubsidyMoney(WxCoupon wxCoupon);


    /**
     * 砍价发起次数走势
     * @return
     */
    List<WxCouponStatisVo> pressSendHistory(WxCoupon wxCoupon);
    /**
     * 砍价成功次数走势
     * @return
     */
    List<WxCouponStatisVo> pressSuccHistory(WxCoupon wxCoupon);
    /**
     * 砍价核销数量走势
     * @return
     */
    List<WxCouponStatisVo> pressPaymentHistory(WxCoupon wxCoupon);
    /**
     * 砍价转化率
     * @return
     */
    String pressSuccRate(WxCoupon wxCoupon);

    /**
     * 砍价参与人数
     * @return
     */
    Long sumJoin(WxCoupon wxCoupon);



    /**
     * 查询售出卡数量历史
     * @return
     */
    List<WxCouponStatisVo> findSaleCardCountHistory(WxCoupon wxCoupon);

    /**
     * 增加库存及修改有效时间
     */
    ResultData updateCouponStockAndEndTime(WxCoupon wxCoupon);

    WxCoupon findById(WxCoupon wxCoupon);

    /**
     * 库存减少
     *
     * @param id              券ID
     * @param number          减少数量
     * @param remainInventory 当前库存
     */
    void reduceRemainInventory(Long id, Integer number, Integer remainInventory);

    /**
     * 库存退回
     *
     * @param id              券ID
     * @param number          回退数量
     * @param remainInventory 当前库存
     */
    void backRemainInventory(Long id, Integer number, Integer remainInventory);

}
