package com.kxs.product.biz.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.kxs.product.api.dto.kxsapp.GetActivityMachineByIdAndTimeDTO;
import com.kxs.product.api.dto.kxsapp.machine.*;
import com.kxs.product.api.dto.kxsapp.merchant.MerchantListDTO;
import com.kxs.product.api.model.KxsMachine;
import com.kxs.product.api.model.KxsMerchant;
import com.kxs.product.api.vo.kxsapp.machine.*;
import com.kxs.product.api.vo.kxsapp.merchant.MerchantListVO;
import com.kxs.stat.api.dto.statUser.GetActivityStatByIdAndTimeDTO;
import com.kxs.stat.api.vo.GetActivityStatByIdAndTimeVO;
import com.kxs.system.api.vo.kxsapp.RecycleBrandListVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 客小爽机具表(KxsMachine)表数据库访问层
 *
 * @author 系统
 * @since 2023-12-20 10:09:35
 */
@Mapper
public interface KxsMachineMapper extends BaseMapper<KxsMachine> {

    /**
     * app 仓库库存机具列表
     *
     * @param page  页
     * @param param 参数
     * @return {@link IPage}<{@link MachineStoreListVO}>
     */
    IPage<MachineStoreListVO> machineStoreList(Page<MachineStoreListVO> page, @Param("query") MachineStoreListDTO param);

    /**
     * app 可循环机列表
     *
     * @param page    页
     * @param userId
     * @param brandIds
     * @return {@link IPage}<{@link RecycleMachinesVO}>
     */
    IPage<RecycleMachinesVO> recycleMachinesPage(Page<RecycleMachinesVO> page, @Param("userId") Long userId, @Param("brandIds") List<Integer> brandIds);

    /**
     * app 未绑定列表
     *
     * @param page  页
     * @param param 参数
     * @return {@link IPage}<{@link MachineUnBindListVO}>
     */
    IPage<MachineUnBindListVO> machineUnBindListPage(Page<MachineUnBindListVO> page, @Param("query") MachineUserListDTO param);

    /**
     * app 已绑定列表
     *
     * @param page  页
     * @param param 参数
     * @return {@link IPage}<{@link MachineBindListVO}>
     */
    IPage<MachineBindListVO> machineBindList(Page<MachineBindListVO> page, @Param("query") MachineUserListDTO param);

    /**
     * app 全部机具
     *
     * @param page  页
     * @param param 参数
     * @return {@link IPage}<{@link MachineUserListVO}>
     */
    IPage<MachineUserListVO> getByPage(Page<MachineUserListVO> page, @Param("query") MachineUserListDTO param);

    /**
     * app 用户机具和箱具码搜索
     *
     * @param page  页
     * @param param 参数
     * @return {@link IPage}<{@link SearchUserMachineVO}>
     */
    IPage<SearchUserMachineVO> searchUserMachine(Page<SearchUserMachineVO> page, @Param("query") SearchUserMachineDTO param);

    /**
     * 机具可回收列表
     *
     * @param page   页
     * @param query 查询
     * @return {@link IPage}<{@link MachineRecycleListVO}>
     */
    IPage<MachineRecycleListVO> recyclePageList(Page<MachineRecycleListVO> page, @Param("query") RecycleMachineQuery query);

    /**
     * 仓库激活统计
     *
     * @param page  页
     * @param param 参数
     * @return {@link IPage}<{@link StoreActMachineMonthTotalVO}>
     */
    IPage<StoreActMachineMonthTotalVO> activateMachineMonthTotal(Page<StoreActMachineMonthTotalVO> page, @Param("query") StoreActMachineMonthTotalDTO param);

    /**
     * 仓库-激活统计明细
     *
     * @param page  页
     * @param param 参数
     * @return {@link IPage}<{@link StoreActMachineDayDetailVO}>
     */
    IPage<StoreActMachineDayDetailVO> activateMachineMonthTotalDetail(Page<StoreActMachineDayDetailVO> page, @Param("query") StoreActMachineDayDetailDTO param);

    /**
     * 查询循环过期机具，并且扣除没有添加已扣款的机器
     *
     * @param machineQuery 查询
     * @param endDay
     * @return {@link List}<{@link KxsMachine}>
     */
    List<KxsMachine> selectDeductList(@Param("query") KxsMachine machineQuery, @Param("endDay") LocalDateTime endDay);

    /**
     * 查询循环过期指定日期的机具
     *
     * @param endDay 过期时间
     * @return {@link List}<{@link KxsMachine}>
     */
    List<KxsMachine> selectExpireDeductList(LocalDateTime endDay);

    /**
     * 可回收机具品牌列表
     * @param userId 用户id
     * @return 机具可回收列表
     */
    List<RecycleBrandListVO> recycleBrandList(Long userId);

    /**
     * 查询激活和绑定时间在指定区间的机具
     * @param param
     * @param brandId
     * @return
     */
    Integer getActivityMachineByIdAndTime(@Param("param")GetActivityMachineByIdAndTimeDTO param,@Param("brandId") Long brandId);
}

