package com.iformall.service;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.github.pagehelper.PageInfo;
import com.iformall.common.ResultData;
import com.iformall.domain.po.MallUserInfo;
import com.iformall.domain.vo.MallUserInfoVo;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Set;

public interface MallUserInfoService {

    //// -------------------- Login ----------------------- ////
    /**
     * 根据用户名查询用户对象
     *
     * @param username
     * @return
     */
    MallUserInfo getByUsername(String username);


    /**
     * 根据phone获得实体
     *
     * @param phone
     * @return
     */
    MallUserInfo getByPhone(String phone, String tenantId);

    /**
     * 根据web_open_id获得展示列表
     *
     * @param webOpenId
     * @return
     */
    List<MallUserInfoVo> getUsersByWebOpenId(String webOpenId);

    /**
     * 根据B端OpenId获得实体
     *
     * @param openId
     * @return
     */
    MallUserInfo getByBOpenId(String openId, String tenantId);


    //// -------------------- Login end ----------------------- ////

    /**
     * 根据实体查询分页列表
     *
     * @param record
     * @param pageIndex
     * @param pageSize
     * @return
     */
    PageInfo<MallUserInfo> listAsPage(MallUserInfo record, Integer pageIndex, Integer pageSize);

    /**
     * 根据实体查询列表
     *
     * @param record
     * @return
     */
    int cntUserList(MallUserInfo record);

    /**
     * 根据Id获得实体
     *
     * @param id
     * @return
     */
    MallUserInfo getById(Long id);

    /**
     * 根据Id获得实体
     *
     * @param ids
     * @return
     */
    List<MallUserInfo> getByIds(Collection<? extends Serializable> ids);

    /**
     *
     * @param queryWrapper
     * @return
     */
    List<MallUserInfo> selectList(Wrapper<MallUserInfo> queryWrapper) ;

    /*
     * 保存或更新实体
     *
     * @param record
     */
    void saveOrUpdate(MallUserInfo record);

    /**
     * 根据Id删除实体
     *
     * @param id
     */
    void deleteById(Long id);

    /**
     * 查询用户名总数，用于校验用户名是否重复
     *
     * @param username
     */
    int cntByUserName(String username);

    /**
     * 查询手机号，用于校验手机号是否重复
     *
     * @param phone
     */
    int cntByUserPhone(String phone);



    /**
     * 删除用户相关数据(用户记录，角色关联)
     *
     * @param id
     */
    void deleteUser(Long id);

    /**
     * 检查用户按钮是否有权限
     *
     * @param userId
     * @param permission
     * @return 是否有权限(true : 有 | false : 没有)
     */
    boolean hasButtonPermission(Long userId, String permission);


    boolean cntByUserName(String username, Long id);

    boolean cntByUserPhone(String phone, Long id);

    ResultData updatepwd(MallUserInfo user, String code);

    boolean checkCodeValid(MallUserInfo user, String code);


    /**
     * 根据phone获得实体列表
     *
     * @param phone
     * @return
     */
    List<MallUserInfoVo> getUserByPhone(String phone);

    void updateBOpenId(MallUserInfo user);

    /**
     * 根据web端OpenId获得实体
     *
     * @param webOpenId
     * @return
     */
    List<MallUserInfo> getByWebOpenId(String webOpenId);

    /**
     * 根据用户名webOpenId查询用户对象
     *
     * @param username
     * @return
     */
    MallUserInfo getByUsernameWebOpenId(String username, String webOpenId);

    void updateWebOpenId(MallUserInfo user);

    void cleanWebOpenId(MallUserInfo user);

    void cleanAllOpenId(MallUserInfo user);

    /**
     * 根据条件用户列表
     *
     * @return
     */
    List<MallUserInfo> findList(MallUserInfo record);

    /**
     * 用户权限获取
     * @param record
     * @return
     */
    Set<String> getUserPermissions(MallUserInfo record);
}
