
package com.tmerclub.cloud.user.service;

import cn.hutool.core.date.DateTime;
import com.tmerclub.cloud.api.user.bo.UidAndUserIdBO;
import com.tmerclub.cloud.api.user.vo.MemberOverviewVO;
import com.tmerclub.cloud.api.user.vo.UserApiVO;
import com.tmerclub.cloud.api.user.vo.UserManagerVO;
import com.tmerclub.cloud.common.database.dto.PageDTO;
import com.tmerclub.cloud.common.database.vo.PageVO;
import com.tmerclub.cloud.user.dto.ShopCustomerDTO;
import com.tmerclub.cloud.user.dto.UserDTO;
import com.tmerclub.cloud.user.dto.UserManagerDTO;
import com.tmerclub.cloud.user.model.User;
import com.tmerclub.cloud.user.model.UserExtension;
import com.tmerclub.cloud.user.vo.UserVO;

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

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

    /**
     * 分页获取用户表列表
     *
     * @param pageDTO 分页参数
     * @param userManagerDTO
     * @return 用户表列表分页数据
     */
    PageVO<UserApiVO> page(PageDTO pageDTO, UserManagerDTO userManagerDTO);

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

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

    /**
     * 移除用户信息缓存
     *
     * @param userId 用户id
     */
    void removeUserCacheByUserId(Long userId);

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

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

    /**
     * 根据用户id获取用户详细信息
     *
     * @param userId 用户id
     * @return 用户详细信息
     */
    UserApiVO getUserAndOpenIdsByUserId(Long userId);

    /**
     * 用户注册并绑定第三方账号
     *
     * @param mobile   手机号
     * @param password 密码
     * @param tempUid  用来找到openid进行关联
     * @return
     */
    UidAndUserIdBO save(String mobile, String password, String tempUid);

    /**
     * 修改用户手机号
     *
     * @param userId 用户id
     * @param mobile 手机号
     */
    void updateUserMobile(Long userId, String mobile);

    /**
     * 获取会员信息
     *
     * @param pageDTO        分页参数
     * @param userManagerDTO 会员信息
     * @return
     */
    PageVO<UserManagerVO> getUserInfoPage(PageDTO pageDTO, UserManagerDTO userManagerDTO);

    /**
     * 获取会员信息列表
     *
     * @param pageDTO        分页参数
     * @param userManagerDTO 会员信息
     * @return 用户信息列表
     */
    List<UserManagerVO> getUserInfoList(PageDTO pageDTO, UserManagerDTO userManagerDTO);


    /**
     * 获用户信息
     *
     * @param userId 用户id
     * @param shopId
     * @return
     */
    UserManagerVO getUserInfo(Long userId, Long shopId);


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

    /**
     * 修改用户昵称、状态
     *
     * @param userDTO
     */
    void updateUserInfo(UserDTO userDTO);

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

    /**
     * 批量保存用户
     *
     * @param userList          用户信息集合
     * @param userExtensionList 用户扩展信息列表
     */
    void batchUser(List<User> userList, List<UserExtension> userExtensionList);

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

    /**
     * 根据结束时间获取客户人数概况
     *
     * @param endTime
     * @return
     */
    MemberOverviewVO getUserCountInfo(Date endTime);

    /**
     * 根据手机号查询用户信息
     *
     * @param mobile 手机号
     * @return 用户信息
     */
    List<UserApiVO> listUserByMobile(String mobile);

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

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

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

    /**
     * 注销账户
     *
     * @param userId
     */
    void destroyUser(Long userId);

    /**
     * 根据参数获取用户列表
     *
     * @param userApiVO
     * @return
     */
    List<UserApiVO> getUserByParam(UserApiVO userApiVO);

    /**
     * 根据参数获取客户列表
     *
     * @param pageDTO
     * @param shopCustomerDTO
     * @return
     */
    PageVO<UserManagerVO> pageShopCustomerByParam(PageDTO pageDTO, ShopCustomerDTO shopCustomerDTO);

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

    /**
     * 更新用户保存的通联信息
     *
     * @return
     */
    void updateUserInfoByAllinpay();

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

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

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