package com.sptg.estate.biz.service;

import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.IService;
import com.sptg.common.core.beans.PageBean;
import com.sptg.common.core.beans.ResultBean;
import com.sptg.estate.api.dto.SimpleUserDto;
import com.sptg.estate.api.dto.UserDto;
import com.sptg.estate.api.entity.Member;
import com.sptg.estate.api.entity.User;
import com.sptg.estate.api.vo.DevicesAccessPushVO;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * title: UserServiceInterface
 * package: com.sptg.estate.biz.security
 * description: 住户 服务层接口
 *
 *
 *
 */
public interface UserServiceInterface extends IService<User> {

    /**
     * 功能描述:用户列表查询
     * @param userDto 住户业务对象（含分页及查询条件）
     * @return ResultBean<Page<User>>
     *
     *
     */
    ResultBean<Page<User>> showUserList(UserDto userDto);

    /**
     * 功能描述:根据住户ID查询列表
     * @param userDto 住户业务对象（含分页及查询条件）
     * @return ResultBean<Page<User>>
     */
    ResultBean<Page<User>> pagingByUserIds(UserDto userDto);

    /**
     * 功能描述:新增住户
     * @param userDto 住户业务对象
     * @return ResultBean<Boolean>
     *
     *
     */
    ResultBean<Boolean> addUser(UserDto userDto);

    /**
     * 功能描述:根据Id查住户
     * @param id 必填
     * @return User
     *
     *
     */
    User findUserById(Long id);

    User byTelAndName(UserDto userDto);

    /**
     * 功能描述:编辑住户
     * @param userDto 住户业务对象
     * @return ResultBean<Boolean>
     *
     *
     */
    ResultBean<Boolean> updateUser(UserDto userDto);

    /**
     * 功能描述:删除住户
     * @param userDto 住户业务对象
     * @return ResultBean<Boolean>
     *
     *
     */
    ResultBean<Boolean> deleteUser(UserDto userDto);

    /**
     * 功能描述:住户放入垃圾箱
     * @param userDto 住户业务对象
     * @return ResultBean<Boolean>
     *
     *
     */
    ResultBean<Boolean> trashOrRecover(UserDto userDto);

    /**
     * 功能描述:根据Id集合批量删除住户
     * @param userDto 住户业务对象
     * @throws Exception
     * @return ResultBean<Boolean>
     *
     *
     */
    ResultBean<Boolean> deleteUserList(UserDto userDto) throws Exception;

    /**
     * 功能描述:根据位置查找住户
     * @param userDto 住户业务对象
     * @return ResultBean<User>
     *
     *
     */
    ResultBean<User> findListByPosition(UserDto userDto);

    /**
     * 功能描述:更新用户审核状态
     * @param userDto 住户业务对象
     * @return ResultBean<Boolean>
     *
     *
     */
    ResultBean<Boolean> updateUserCheckState(UserDto userDto);

    /**
     * 功能描述:根据id获取住户名字
     * @param id
     * @return String
     *
     *
     */
    String getUserNameById(Serializable id);
    /**
     * 功能描述:统计 总住户数(userTotalCount)，上月新增住户数(lastMonthNewUserCount)，租客数(tenantUserCount)，已认证小程序住户数(weiXinUserCount)
     * @param userDto
     * @return Map<String,Object>
     *
     *
     */
    Map<String,Object> statisticsUserCount(UserDto userDto);

    /**
     * 功能描述:导入住户
     * @param userDto 住户业务传输对象
     * @return ResultBean<Boolean>
     *
     *
     */
    ResultBean<Boolean> importUserList(UserDto userDto);

    /**
     * 功能描述:根据名字和号码查询用户
     * @param member
     * @return
     *
     *
     */
    List<User> getUserByTelAndName(Member member);

    /**
     * 功能描述:根据位置查询住户数量
     * @param userDto
     * {
     *    orgPosition : 位置信息
     *    isAllType : 查询类型
     * }
     * @return int
     *
     *
     */
    int getUserAccount(UserDto userDto);

    /**
     * 功能描述:添加或者更新（含删除）住户人脸图片（并下发人脸到用户所住区域的所有设备，包括特定授权设备）
     * @param userDto 住户业务传输对象
     * @return ResultBean<Boolean>
     *
     *
     */
    ResultBean<Boolean> addOrUpdateUserFaceImage(UserDto userDto);

    /**
     * 功能描述:仅进行保存人脸图片操作
     * @param userDto 住户业务传输对象
     * @return ResultBean<Boolean>
     *
     *
     */
    ResultBean<Boolean> simpleAddOrUpdateUserFaceImage(UserDto userDto);

    /**
     * 功能描述:只执行下发人脸（启用或者禁用）
     * @param userDto 住户业务传输对象
     * @return ResultBean<Boolean>
     *文祥添加，下发人脸
     *
     */
    ResultBean<Boolean> sendUserFaceImage(UserDto userDto);

    /**
     * 功能描述:批量禁用人脸
     * @param ids 住户ids
     * @return ResultBean<Boolean>
     *
     */
    ResultBean<Boolean> deleteUserFaceImageBatch(List<Long> ids);

    /**
     * 功能描述:批量设置并下发人脸
     * @param simpleUserDtoList simpleUserDtoList
     * @return ResultBean<Boolean>
     *
     */
    ResultBean<Boolean> issueUserFaceImageBatch(List<SimpleUserDto> simpleUserDtoList);

    /**
     * 功能描述:批量禁用门禁卡
     * @param ids 住户ids
     * @return ResultBean<Boolean>
     *
     */
    ResultBean<Boolean> deleteUserCardBatch(List<Long> ids);

    /**
     * 功能描述:
     * @param devicesAccessPushVO 住户业务传输对象
     * @return ResultBean<Boolean>
     *文祥添加，下发人脸
     *
     */
    ResultBean<Boolean> accessDevicesManualPush(DevicesAccessPushVO devicesAccessPushVO);

    /**
     * 功能描述:根据名字和房间查询user
     * @param name
     * @param roomId
     * @return
     *
     *
     */
    User getUserByNameAndRoomId(String name, Long roomId);
    /**
     * 功能描述:根据房间id查询房间下的user
     * @param roomIds
     * @return
     *
     *
     */
    List<User> getListByRoomId(List<Long> roomIds);

    /**
     * 功能描述:根据房间id查询房间下的user-分页
     * @param userDto
     * @return
     *
     *
     */
    Page<User> pagingByRoomId(UserDto userDto);

    /**
     * 功能描述:根据机构查询用户不同类型的数量
     * @param dto
     * @return Map<String,Object>
     *
     *
     */
    Map<String,Object> userCountForType(UserDto dto);

    /**
     * 功能描述:根据机构查询用户不同来源类型的数量
     * @param dto
     * @return Map<String,Object>
     *
     *
     */
    Map<String,Object> userCountForCreateType(UserDto dto);

    /**
     * 功能描述:根据userId查询user
     * @param userIds
     * @return List<User>
     *
     *
     */
    List<User> getListByUserId(List<Long> userIds);

    /**
     * 功能描述:删除住户,且删除会员与住户的关系（app接口特用）
     * @param userDto{
     *       id         :   住户id,
     *       memberId   :   会员id
     * }
     * @return  ResultBean<Boolean>
     *
     *
     */
    ResultBean<Boolean> deleteUserAndRelationship(UserDto userDto);

    /**
     * 功能描述:删除住户,且删除会员与住户的关系（app接口特用）
     * @param userDto{
     *       name         :   住户名字,
     *       roomId       :   房间id
     * }
     * @return  ResultBean<Boolean>
     *
     *
     */
    ResultBean<Boolean> checkByNameAndRoomId(UserDto userDto);

    /**
     * 功能描述:根据条件查询住户
     * @param userDto 住户业务对象
     * @return User
     *
     *
     */
    User findUserByCondition(UserDto userDto);

    /**
     * 功能描述:查找小区住户总数
     * @param userDto{
     *     residentialId:小区Id 必填
     * }
     * @return int
     *
     *
     */
    int findUserTotalCount(UserDto userDto);

    /**
     * 功能描述:分页获取小区住户
     * @param pageBean 查询条件
     * @return  ResultBean<Page<User>>
     *
     *
     */
    ResultBean<Page> getUserPage(PageBean<User, UserDto> pageBean);

    ResultBean<Boolean> enableUserCardBatch(List<Long> cardIds);

    List<User> getListByCondition(UserDto dto);
}
