package com.ruoyi.ss.user.service;

import com.ruoyi.common.core.domain.entity.SmUser;
import com.ruoyi.common.enums.UserType;
import com.ruoyi.ss.recordBalance.domain.enums.RecordBalanceBstType;
import com.ruoyi.ss.riskInfo.domain.RiskInfoVO;
import com.ruoyi.ss.user.domain.SmUserQuery;
import com.ruoyi.ss.user.domain.SmUserVO;
import com.ruoyi.ss.user.domain.dto.UserRealNameDTO;
import com.ruoyi.ss.user.domain.vo.UserRealNameVO;
import com.ruoyi.ss.user.domain.vo.UserRealRefreshVO;

import java.math.BigDecimal;
import java.util.List;

/**
 * 普通用户信息Service接口
 *
 * @author qzz
 * @date 2024-01-24
 */
public interface ISmUserService
{
    /**
     * 查询普通用户信息
     *
     * @param userId 普通用户信息主键
     * @return 普通用户信息
     */
    public SmUserVO selectSmUserByUserId(Long userId);

    /**
     * 查询普通用户信息列表
     *
     * @param smUser 普通用户信息
     * @return 普通用户信息集合
     */
    public List<SmUserVO> selectSmUserList(SmUserQuery smUser);

    /**
     * 新增普通用户信息
     *
     * @param smUser 普通用户信息
     * @return 结果
     */
    public int insertSmUser(SmUser smUser);

    /**
     * 修改普通用户信息
     *
     * @param smUser 普通用户信息
     * @return 结果
     */
    public int updateSmUser(SmUser smUser);

    /**
     * 批量删除普通用户信息
     *
     * @param userIds 需要删除的普通用户信息主键集合
     * @return 结果
     */
    public int deleteSmUserByUserIds(Long[] userIds);

    /**
     * 删除普通用户信息信息
     *
     * @param userId 普通用户信息主键
     * @return 结果
     */
    public int deleteSmUserByUserId(Long userId);

    /**
     * 通过用户名查询用户
     * @param username
     * @return
     */
    SmUserVO selectUserByUserName(String username);

    /**
     * 数据脱敏
     * @param list 用户列表
     */
    void desensitization(List<SmUserVO> list);

    /**
     * 查询用户总数
     * @param dto
     * @return
     */
    int selectCount(SmUserQuery dto);

    /**
     * 根据手机号查询用户
     * @param phoneNumber
     * @return
     */
    SmUserVO selectUserByPhone(String phoneNumber);

    /**
     * 更换用户类型
     *
     * @param userType 类型
     * @return
     */
    int changeType(Long userId, UserType userType);

    /**
     * 增加余额
     *
     * @param userId  用户id
     * @param amount  金额
     * @param reason
     * @param bstType
     * @param bstId
     */
    int addBalance(Long userId, BigDecimal amount, String reason, RecordBalanceBstType bstType, Long bstId);

    /**
     * 减少余额
     *
     * @param userId  用户id
     * @param amount  金额
     * @param reason
     * @param bstType
     * @param bstId
     */
    default void subtractBalance(Long userId, BigDecimal amount, String reason, RecordBalanceBstType bstType, Long bstId) {
        subtractBalance(userId, amount, true, reason, bstType, bstId);
    }

    /**
     * 减少余额
     *
     * @param userId  用户id
     * @param amount  金额
     * @param check   是否校验余额是否充足
     * @param reason  原因
     * @param bstType
     * @param bstId
     * @return
     */
    int subtractBalance(Long userId, BigDecimal amount, boolean check, String reason, RecordBalanceBstType bstType, Long bstId);

    /**
     * 修改微信OpenId
     * @param userId
     * @param openid
     */
    void updateWxOpenId(Long userId, String openid);

    /**
     * 查询单表数据（不允许联表）
     * @param userId 用户id
     * @return 用户信息
     */
    SmUserVO selectSimpleById(Long userId);

    /**
     * 逻辑删除
     * @param userIds
     * @return
     */
    boolean logicDel(List<Long> userIds);

    /**
     * 用户是否存在
     * @param userIds
     * @return
     */
    boolean isExistUsers(List<Long> userIds);

    /**
     * 通过用户微信openId查询列表
     * @param openid 微信openId
     */
    SmUserVO selectSmUserByWxOpenId(String openid);

    /**
     * 修改密码
     * @param userId 用户id
     * @param password 密码
     */
    boolean updatePassword(Long userId, String password);

    /**
     * ids查询列表
     */
    List<SmUserVO> selectByIds(List<Long> ids);

    /**
     * 将用户设置为商家
     */
    int setMch(Long userId);

    /**
     * 更新用户服务费
     * @param data
     * @return
     */
    int updateServiceRate(SmUser data);

    /**
     * 重置用户服务费
     */
    int resetService(Long userId);

    /**
     * 查询用户总余额
     */
    BigDecimal selectSumOfBalance(SmUserQuery smUserQuery);

    /**
     * 实名认证
     */
    UserRealNameVO realName(UserRealNameDTO dto);

    /**
     * 标记已读商户协议
     */
    int readMchLicence(Long userId);

    /**
     * 添加一次风险次数
     */
    int addRiskCount(Long userId, int count);

    /**
     * 刷新实名认证结果
     *
     * @param userId 用户ID
     * @return 认证结果，是否成功
     */
    UserRealRefreshVO refreshRealName(Long userId);

    /**
     * 根据用户ID列表查询
     */
    List<SmUserVO> selectByUserIds(List<Long> userIds);

    /**
     * 获取用户修改手机号的旧手机短信验证码
     */
    boolean getChangeMobileCodeOld(Long userId);

    /**
     * 更新手机号
     */
    int updateMobile(Long userId, String mobile);

    /**
     * 绑定微信手机号
     *
     * @param userId
     * @param mobileCode 微信手机号临时授权码
     */
    int bindWxMobile(Long userId, String mobileCode);

    /**
     * 风控实名认证
     *
     * @param info @return
     */
    UserRealNameVO riskRealName(RiskInfoVO info);

    /**
     *
     * @param openId
     * @return
     */
    SmUserVO selectSmUserByAliOpenId(String openId);

    /**
     * 注册支付宝账号
     */
    SmUserVO registerAli(String openId, String mobile);

    /**
     * 注册微信账号
     * @param openId
     * @param mobile
     * @return
     */
    SmUserVO registerWx(String openId, String mobile);

    /**
     * 绑定支付宝手机号
     * @param userId 用户ID
     * @param ciphertext 支付宝手机号密文
     */
    int bindAliMobile(Long userId, String ciphertext);

    /**
     * 重置实名认证
     */
    int resetRealName(Long userId);
}
