package ink.wgink.interfaces.user;

import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.dtos.user.UserDTO;
import ink.wgink.pojo.result.SuccessResultData;
import ink.wgink.pojo.result.SuccessResultList;

import java.util.List;
import java.util.Map;

/**
 * When you feel like quitting. Think about why you started
 * 当你想要放弃的时候，想想当初你为何开始
 *
 * @ClassName: IUserService
 * @Description: 用户
 * @Author: WangGeng
 * @Date: 2021/1/24 12:52
 * @Version: 1.0
 **/
public interface IUserBaseService {

    /**
     * 新增默认用户
     *
     * @param userUsername 用户名
     * @param username     昵称
     * @param userState    状态
     * @param userType     类型
     * @return 用户ID
     */
    String saveDefaultUserAndReturnId(String userUsername, String username, Integer userState, Integer userType);

    /**
     * 用户详情
     *
     * @param userId 用户ID
     * @return
     */
    UserDTO get(String userId);

    /**
     * 用户详情
     *
     * @param username 用户名
     * @return
     */
    UserDTO getByUsername(String username);

    /**
     * 用户列表
     *
     * @param userIds 用户ID列表
     * @return
     */
    List<UserDTO> listByUserIds(List<String> userIds);

    /**
     * 用户列表
     *
     * @param usernames 用户名列表
     * @return
     */
    List<UserDTO> listByUsernames(List<String> usernames);

    /**
     * 用户列表
     *
     * @param userState 用户状态
     * @return
     */
    List<UserDTO> listByUserState(Integer userState);

    /**
     * 用户列表
     *
     * @param params 参数
     * @return
     */
    List<UserDTO> list(Map<String, Object> params);

    /**
     * 用户分页列表
     *
     * @param page
     * @return
     */
    SuccessResultList<List<UserDTO>> listPage(ListPage page);

    /**
     * 用户分页列表
     *
     * @param userIds 用户ID列表
     * @param page
     * @return
     */
    SuccessResultList<List<UserDTO>> listPageByIds(List<String> userIds, ListPage page);

    /**
     * 用户分页列表
     *
     * @param userState 用户状态
     * @param page
     * @return
     */
    SuccessResultList<List<UserDTO>> listPageByUserState(Integer userState, ListPage page);

    /**
     * 用户列表
     *
     * @param userIds 用户ID列表
     * @param params
     * @return
     */
    List<UserDTO> listByIds(List<String> userIds, Map<String, Object> params);

    /**
     * 不包含的用户分页列表
     *
     * @param excludeUserIds 不包含的用户ID
     * @param page
     * @return
     */
    SuccessResultList<List<UserDTO>> listPageByExcludeIds(List<String> excludeUserIds, ListPage page);

    /**
     * 不包含与包含的用户分页列表
     *
     * @param excludeUserIds 不包含用户id列表
     * @param includeUserIds 包含的用户id列表
     * @param page
     * @return
     */
    SuccessResultList<List<UserDTO>> listPageByExcludeIdsAndIncludeIds(List<String> excludeUserIds, List<String> includeUserIds, ListPage page);

    /**
     * 不包含的用户分页列表
     *
     * @param excludeUserIds 不包含的用户ID列表
     * @param params
     * @return
     */
    List<UserDTO> listByExcludeIds(List<String> excludeUserIds, Map<String, Object> params);

    /**
     * 不包含和包含的用户分页列表
     *
     * @param excludeUserIds 不包含用户ID列表
     * @param includeUserIds 包含用户ID列表
     * @param params
     * @return
     */
    List<UserDTO> listByExcludeIds(List<String> excludeUserIds, List<String> includeUserIds, Map<String, Object> params);


    /**
     * 用户统计
     *
     * @param startDate 开始日期，yyyy-MM-dd
     * @param endDate   结束日期，yyyy-MM-dd
     * @return
     */
    int countDateRange(String startDate, String endDate);

    /**
     * 用户统计
     *
     * @return
     */
    int count();

    /**
     * 用户统计
     *
     * @param userType，0：系统用户，1：普通用户
     * @return
     */
    int countType(int userType);

    /**
     * 用户统计，错误类型
     *
     * @return
     */
    int countErrorType();

    /**
     * 用户统计
     *
     * @param userState 0：正常用户，1：冻结
     * @return
     */
    Integer countState(int userState);

    /**
     * 获取密码状态
     *
     * @param userId
     * @return
     */
    SuccessResultData<String> getPasswordStatus(String userId);

    /**
     * 用户列表
     *
     * @param keywords 关键字
     * @return
     */
    List<UserDTO> listByKeywords(String keywords);

    /**
     * 用户ID列表
     *
     * @param userDTOs
     * @return
     */
    List<String> listUserIds(List<UserDTO> userDTOs);

    /**
     * 通过手机获取用户
     *
     * @param phones
     * @return
     */
    List<UserDTO> listByUserPhones(List<String> phones);
}
