
package com.tmerclub.cloud.user.mapper;

import cn.hutool.core.date.DateTime;
import com.tmerclub.cloud.api.user.vo.*;
import com.tmerclub.cloud.common.database.util.PageAdapter;
import com.tmerclub.cloud.user.dto.UserManagerDTO;
import com.tmerclub.cloud.user.model.User;
import com.tmerclub.cloud.user.vo.UserVO;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 用户表
 *
 * @author YXF
 * @date 2020-12-08 11:18:04
 */
public interface UserMapper {

    /**
     * 获取用户表列表
     * @param userManagerDTO
     * @return 用户表列表
     */
    List<UserVO> list(@Param("userManagerDTO") UserManagerDTO userManagerDTO);

    /**
     * 根据用户表id获取用户表
     *
     * @param userId 用户表id
     * @return 用户表
     */
    UserApiVO getByUserId(@Param("userId") Long userId);

    /**
     * 保存用户表
     *
     * @param user 用户表
     */
    void save(@Param("user") User user);

    /**
     * 更新用户表
     *
     * @param user 用户表
     */
    void update(@Param("user") User user);

    /**
     * 删除用户
     *
     * @param userId 用户Id
     */
    void deleteById(@Param("userId") Long userId);


    /**
     * 根据成长值范围，更新普通用户的等级
     *
     * @param level     更新至该等级
     * @param minGrowth 最小成长值
     * @param maxGrowth 最大成长值
     */
    void updateUserLevel(@Param("level") Integer level, @Param("minGrowth") int minGrowth, @Param("maxGrowth") Integer maxGrowth);

    /**
     * 根据用户id列表，获取用户信息
     *
     * @param userIds
     * @return
     */
    List<UserApiVO> getUserByUserIds(@Param("userIds") List<Long> userIds);


    /**
     * 根据查询用户的条件，查询用户数量
     *
     * @param userManagerDTO 用户查询条件
     * @return 数量
     */
    Long countUserPageByParam(@Param("userManagerDTO") UserManagerDTO userManagerDTO);

    /**
     * 根据查询条件，获取会员信息
     *
     * @param userManagerDTO 用户查询条件
     * @param pageAdapter
     * @return 会员管理的会员信息列表
     */
    List<UserManagerVO> listUserByParam(@Param("userManagerDTO") UserManagerDTO userManagerDTO, @Param("pageAdapter") PageAdapter pageAdapter);

    /**
     * 将用户等级从用户扩展表同步到用户表里面
     *
     * @param userIds
     */
    void updateUserLevelByUserExtensionAndUserIds(@Param("userIds") List<Long> userIds);

    /**
     * 更新用户等级，通过购买会员
     *
     * @param userId     用户id
     * @param afterLevel 购买后的等级
     * @param date       会员过期时间
     */
    void updateUserLevelByBuyVip(@Param("userId") Long userId, @Param("afterLevel") Integer afterLevel, @Param("date") Date date);

    /**
     * 通过用户手机号查询多个用户信息
     *
     * @param phones 手机号列表
     * @return 用户信息列表
     */
    List<UserVO> getUserListByPhones(@Param("phones") List<String> phones);

    /**
     * 过滤已存在的客户
     * @param users
     * @return
     */
    List<User> filterExistUsers(@Param("users") List<User> users);

    /**
     * 批量保存用户
     *
     * @param users 用户列表
     * @return 影响行数
     */
    int saveBatch(@Param("users") List<User> users);

    /**
     * 获取时间端类注册的用户
     *
     * @param status    用户状态
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 用户列表
     */
    List<UserVO> getUserByCreateTimeRange(@Param("status") Integer status, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 根据时间范围获取会员人数统计信息
     *
     * @param startTime
     * @param endTime
     * @return
     */
    MemberOverviewVO getUserCountInfo(@Param("startTime") Date startTime, @Param("endTime") Date endTime);


    /**
     * 根据等级查询属于该等级的用户数
     *
     * @param level     等级
     * @param levelType 类型
     * @return 用户数
     */
    int countUserByLevel(@Param("level") Integer level, @Param("levelType") Integer levelType);

    /**
     * 获取截至日期之前的所有付费会员信息
     *
     * @param endOfDay 截至日期
     * @return
     */
    List<UserVO> selectMemberByEndTime(@Param("endOfDay") DateTime endOfDay);

    /**
     * 将会员的类型以及等级，重用户扩展表同步掉user表
     *
     * @param userIds 用ids
     * @return
     */
    int updateUserTypeLevelByUserExtensionAndUserIds(@Param("userIds") List<Long> userIds);

    /**
     * 获取指定等级类型的用户id
     *
     * @param levelType
     * @return
     */
    List<Long> getUserIdListByLevel(@Param("levelType") Integer levelType);

    /**
     * 根据搜索条件获取用户列表
     *
     * @param userApiVO
     * @return
     */
    List<UserApiVO> getUserByParam(@Param("userApiVO") UserApiVO userApiVO);

    /**
     * 统计时间段内的新增用户数量
     *
     * @param startTime
     * @param endTime
     * @return
     */
    Integer countNewUserByTime(@Param("startTime") Date startTime, @Param("endTime") Date endTime);


    /**
     * 获取时间段内的新增用户id列表
     *
     * @param startTime
     * @param endTime
     * @return
     */
    List<Long> listNewUserIdByTime(@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 获取指定用户列表
     *
     * @param userIds
     * @return
     */
    List<UserVO> listUserByUserIds(@Param("userIds") List<Long> userIds);

    /**
     * 获取用户信息列表
     * @param userManagerDTO
     * @return
     */
    List<User> listUser(@Param("userManagerDTO") UserManagerDTO userManagerDTO);

    /**
     * 统计会员数量（普通会员、付费会员）
     * @param startTime
     * @return
     */
    MemberTrendRespVO countUserNumByType(@Param("startTime") Date startTime);

    /**
     * 统计累计用户数、新增用户数、付费会员数
     * @param startTime
     * @param endTime
     * @return
     */
    MemberCountVO statisticsUserNum(@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 获取第一个用户的注册时间
     * @return
     */
    Date getInitialRegistrationTime();

    /**
     * 根据手机号获取用户列表
     * @param mobile
     * @return
     */
    List<UserApiVO> listUserByMobile(@Param("mobile") String mobile);

    /**
     * 统计手机号对应的用户数量
     *
     * @param phone 手机号
     * @return
     */
    int countUserByPhone(@Param("phone") String phone);
}
