package ink.wgink.service.user.service;

import ink.wgink.interfaces.user.IUserBaseService;
import ink.wgink.interfaces.user.IUserCheckService;
import ink.wgink.pojo.result.UploadExcelResultDTO;
import ink.wgink.pojo.vos.UpdatePasswordVO;
import ink.wgink.service.user.enums.UserStateEnum;
import ink.wgink.service.user.enums.UserTypeEnum;
import ink.wgink.service.user.pojo.dtos.AppUserDTO;
import ink.wgink.service.user.pojo.pos.UserPO;
import ink.wgink.service.user.pojo.vos.*;
import ink.wgink.util.ReflectUtil;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
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/25 3:06 下午
 * @Version: 1.0
 */
public interface IUserService extends IUserBaseService, IUserCheckService {

    /**
     * 密码验证
     */
    String PASSWORD_VALIDITY_CUSTOM = "custom";
    String PASSWORD_VALIDITY_NONE = "none";
    String PASSWORD_VALIDITY = "passwordValidity";
    /**
     * 密码强度
     */
    String PASSWORD_STRENGTH = "passwordStrength";
    String PASSWORD_STRENGTH_WEAK = "weak";
    String PASSWORD_STRENGTH_MIDDLE = "middle";
    String PASSWORD_STRENGTH_STRONG = "strong";
    /**
     * 第一次登陆修改密码
     */
    String FIRST_LOGIN_CHANGE_PASSWORD = "firstLoginChangePassword";
    String FIRST_LOGIN_CHANGE_PASSWORD_OPEN = "open";
    String FIRST_LOGIN_CHANGE_PASSWORD_CLOSE = "close";
    /**
     * 密码有效期
     */
    String PASSWORD_VALIDITY_DAYS = "passwordValidityDays";
    /**
     * 密码提醒时间
     */
    String CHANGE_PASSWORD_NOTICE_DAYS = "changePasswordNoticeDays";
    String PASSWORD_OK = "ok";
    String PASSWORD_CHANGE = "change";
    String PASSWORD_REMIND = "remind";

    /**
     * 保存用户
     *
     * @param userVO
     * @return
     */
    void save(UserVO userVO);

    /**
     * 保存用户
     *
     * @param userVO
     * @param isRegister
     * @return
     */
    String saveAndReturnId(UserVO userVO, boolean isRegister);

    /**
     * 注册用户
     *
     * @param userVO
     * @return
     */
    void register(UserVO userVO);

    /**
     * 删除用户
     *
     * @param ids id数组
     * @return
     */
    void remove(List<String> ids);

    /**
     * 删除用户
     *
     * @param ids
     */
    void delete(List<String> ids);

    /**
     * 注销用户
     *
     * @param token
     */
    void deleteByToken(String token);


    /**
     * 修改用户
     *
     * @param userId 用户ID
     * @param userVO 用户内容
     * @return
     */
    void update(String userId, UserVO userVO);

    /**
     * 修改用户，不包含密码，返回新token
     *
     * @param token
     * @param updateUserVO
     * @return
     * @throws Exception
     */
    String updateInfo(String token, UpdateUserVO updateUserVO) throws Exception;

    /**
     * 重置用户密码
     *
     * @param userId         用户ID
     * @param restPasswordVO 重置密码
     * @return
     */
    void resetPassword(String userId, RestPasswordVO restPasswordVO);

    /**
     * 修改用户名
     *
     * @param userId           用户ID
     * @param updateUsernameVO 更新用户名
     */
    void updateUsername(String userId, UpdateUsernameVO updateUsernameVO);

    /**
     * 修改用户名
     *
     * @param userId           用户ID
     * @param updateUsernameVO 更新用户名
     * @param updateAdjustment 是否添加日志
     */
    void updateUsername(String userId, UpdateUsernameVO updateUsernameVO, boolean updateAdjustment);

    /**
     * 修改密码
     *
     * @param updatePasswordVO
     * @return
     */
    void updatePassword(UpdatePasswordVO updatePasswordVO);

    /**
     * 修改密码
     *
     * @param token
     * @param updatePasswordVO
     * @throws ReflectUtil.ReflectException
     */
    void updatePassword(String token, UpdatePasswordVO updatePasswordVO) throws ReflectUtil.ReflectException;

    /**
     * 修改密码
     *
     * @param userId           用户ID
     * @param updatePasswordVO 修改的密码
     * @throws ReflectUtil.ReflectException
     */
    void updatePasswordByUserId(String userId, UpdatePasswordVO updatePasswordVO);

    /**
     * 修改密码
     *
     * @param userId           用户ID
     * @param updatePasswordVO 修改的密码
     * @param isPasswordMd5    密码是否已用MD5加密
     */
    void updatePasswordByUserId(String userId, UpdatePasswordVO updatePasswordVO, boolean isPasswordMd5);

    /**
     * 修改密码
     *
     * @param username    用户名
     * @param newPassword 新密码
     */
    void updatePasswordByUsername(String username, String newPassword);

    /**
     * 更新过期时间
     *
     * @param userId
     * @param updateExpiredDateVO
     */
    void updateExpiredDate(String userId, UpdateExpiredDateVO updateExpiredDateVO);

    /**
     * 更新用户状态通过
     *
     * @param userId
     */
    void updateUserStatePass(String userId);

    /**
     * 更新用户状态通过
     *
     * @param userIds
     */
    void updateUserStatePass(List<String> userIds);

    /**
     * 更新用户状态不通过
     *
     * @param userId
     */
    void updateUserStateUnPass(String userId);

    /**
     * 更新用户状态不通过
     *
     * @param userIds
     */
    void updateUserStateUnPass(List<String> userIds);

    /**
     * 导入Excel
     *
     * @param excel
     * @return
     * @throws IOException
     */
    UploadExcelResultDTO importExcel(MultipartFile excel) throws IOException;

    /**
     * 用户详情
     *
     * @param userId 用户ID
     * @return
     */
    UserPO getPO(String userId);

    /**
     * 用户详情
     *
     * @param username 用户名
     * @return
     */
    UserPO getPOByUsername(String username);

    /**
     * 用户详情
     *
     * @param phone 用户手机号
     * @return
     */
    UserPO getPOByPhone(String phone);

    /**
     * 用户列表
     *
     * @param params
     * @return
     */
    List<UserPO> listPO(Map<String, Object> params);

    /**
     * 用户列表
     *
     * @param userIds
     * @return
     */
    List<UserPO> listPOByUserIds(List<String> userIds);

    /**
     * 用户列表
     *
     * @param userState
     * @return
     */
    List<UserPO> listPOByUserState(UserStateEnum userState);

    /**
     * 用户列表
     *
     * @param userType
     * @return
     */
    List<UserPO> listPOByUserType(UserTypeEnum userType);

    /**
     * 用户列表
     *
     * @param userState
     * @param userType
     * @return
     */
    List<UserPO> listPOByUserStateAndUserType(UserStateEnum userState, UserTypeEnum userType);


    /**
     * 更新登陆信息
     *
     * @param params
     */
    void updateLoginInfo(Map<String, Object> params);

    /**
     * 统计
     *
     * @param params
     * @return
     */
    Integer count(Map<String, Object> params);

    /**
     * APP用户
     *
     * @param token
     * @return
     * @throws ReflectUtil.ReflectException
     */
    AppUserDTO getAppUser(String token) throws ReflectUtil.ReflectException;

    /**
     * 下载用户头像
     *
     * @param userId
     * @param request
     * @param response
     */
    void downLoadAvatar(String userId, HttpServletRequest request, HttpServletResponse response);

    /**
     * 是否过期
     *
     * @param token
     */
    void isExpiredByToken(String token);

}
