package com.sptg.estate.biz.service;

import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.IService;
import com.sptg.common.core.beans.ResultBean;
import com.sptg.common.core.beans.ResultEnum;
import com.sptg.device.api.dto.AccessCardSimpleDto;
import com.sptg.device.api.vo.AccessUserCardPushDevicesTask;
import com.sptg.device.api.vo.ManualPushDevicesTask;
import com.sptg.estate.api.dto.AccessCardDto;
import com.sptg.estate.api.dto.AccessRecordsDto;
import com.sptg.estate.api.entity.AccessCard;
import com.sptg.estate.api.entity.AccessRecords;
import com.sptg.estate.api.vo.DevicesAccessPushVO;

import java.util.List;

/**
 * title: AccessCardServiceInterface
 * package: com.sptg.estate.biz.security
 * description: 门禁卡 服务层接口
 *
 *
 *
 */
public interface AccessCardServiceInterface extends IService<AccessCard> {

    /**
     * 功能描述:门禁卡查询列表
     * @param accessCardDto 门禁卡业务对象（含分页及查询条件）
     * @return ResultBean<Page<AccessCard>>
     *
     *
     */
    ResultBean<Page<AccessCard>> showAccessCardList(AccessCardDto accessCardDto);

    /**
     * 门禁卡列表
     * @param accessCardDto
     * @return
     */
    ResultBean<Page<AccessCard>> showCardList(AccessCardDto accessCardDto);

    /**
     * 功能描述:新增:门禁卡
     * @param accessCardDto 门禁卡业务对象
     * @return ResultBean<Boolean>
     *
     *
     */
    ResultBean<Boolean> addAccessCard(AccessCardDto accessCardDto);

    /**
     * 功能描述:批量新增:门禁卡
     * @param accessCardDtoList 门禁卡业务对象集合
     * @return ResultBean<Boolean>
     *
     *
     */
    ResultBean<Boolean> pushAccessCardBatch(List<AccessCardDto> accessCardDtoList);

    /**
     * 功能描述:新增:门禁卡（但不下发到设备上）
     * @param accessCardDto 门禁卡业务对象
     * @return ResultBean<Boolean>
     *
     *
     */
    ResultBean<AccessCard> simpleAddAccessCard(AccessCardDto accessCardDto);


    /**
     * 功能描述:只执行下发用户门禁卡（启用或者禁用）
     * @param devicesAccessPushVO 住户门禁卡业务对象
     * @return ResultBean<Boolean>
     *
     *
     */
    ResultBean<Boolean> sendAccessUserCard(DevicesAccessPushVO devicesAccessPushVO);


    /**
     * 功能描述:根据Id查找门禁卡
     * @param id 必填
     * @return AccessCard
     *
     *
     */
    AccessCard findAccessCardById(Long id);

    /**
     * 功能描述:编辑门禁卡
     * @param accessCardDto :门禁卡业务对象
     * @return ResultBean<Boolean>
     *
     *
     */
    ResultBean<Boolean> updateAccessCard(AccessCardDto accessCardDto);

    /**
     * 功能描述:编辑门禁卡（但不下发到设备）
     * @param accessCardDto :门禁卡业务对象
     * @return ResultBean<Boolean>
     *
     *
     */
    ResultBean<Boolean> simpleUpdateAccessCard(AccessCardDto accessCardDto);

    /**
     * 功能描述:删除门禁卡
     * @param accessCardDto 门禁卡业务对象
     * @return ResultBean<Boolean>
     *
     *
     */
    ResultBean<Boolean> deleteAccessCard(AccessCardDto accessCardDto);

    /**
     * 功能描述:批量删除门禁卡
     * @param accessCardDto 门禁卡业务对象
     * @return ResultBean<Boolean>
     *
     *
     */
    ResultBean<Boolean> deleteCardList(AccessCardDto accessCardDto) throws Exception;

    /**
     * 功能描述:根据条件查找门禁卡
     * @param accessCardDto 门禁卡业务对象
     * @return List<AccessCard>
     *
     *
     */
    List<AccessCard> findAccessCardByCondition(AccessCardDto accessCardDto);

    /**
     * 根据卡号查询卡信息
     * @param accessCardDto
     * @return
     */
    List<AccessCard> getAccessCardListByCardNo(AccessCardDto accessCardDto);

    /**
     * 功能描述:根据条件获取门禁卡信息
     * @param userId  住户id，服务人员id
     * @param type 类型
     * @return AccessCard
     *
     *
     */
    List<AccessCard> getAccessCardByUserIdAndType(String userId,int type);

    /**
     * 功能描述:根据条件删除门禁卡信息
     * @param userId 住户id，服务人员id
     * @param type 类型
     * @return boolean
     *
     *
     */
    boolean deleteAccessCardByUserIdAndType(String userId, int type);

    /**
     * 获取门禁卡信息
     * @param cardNo 卡号
     * @param xqId 小区Id
     * @return AccessCard
     */
    AccessCard getByCardNoAndXqId(String cardNo,Long xqId);

    /**
     * 功能描述:新增或更新（含删除）住户门禁卡
     * @param accessCardDto 门禁卡业务对象
     * @return ResultBean<Boolean>
     *
     *
     */
    ResultBean<Boolean> addOrUpdateUserCard(AccessCardDto accessCardDto);

    /**
     * 功能描述:新增或更新（含删除）住户门禁卡（但不下发卡到设备上）
     * @param accessCardDto 门禁卡业务对象
     * @return ResultBean<Boolean>
     *
     *
     */
    ResultBean<AccessCardDto> simpleAddOrUpdateUserCard(AccessCardDto accessCardDto);

    /**
     * 功能描述:根据位置信息查询卡管理
     * @param accessCardDto
     * @return ResultBean<AccessCard>
     *
     *
     */
    ResultBean<AccessCard> findListByPosition(AccessCardDto accessCardDto);

    /**
     * 功能描述:批量导入
     * @param list 导入对象集合
     * @return ResultBean<Boolean>
     *
     *
     */
    ResultBean<Boolean> importAccessCardList(List<AccessCard> list);

    /**
     * 功能描述:根据条件查询门禁卡信息
     * @param id 房间/小区/单元id
     * @param type 类型
     * @return AccessCard
     *
     *
     */
    List<AccessCard> getAccessCardByIdAndType(long id, int type);

    /**
     * 功能描述:根据条件删除门禁卡信息
     * @param id 房间/小区/单元id
     * @param type 类型
     * @return boolean
     *
     *
     */
    boolean deleteAccessCardByIdAndType(long id, int type);

    /**
     * 功能描述:新增或更新（含删除）服务人员门禁卡
     * @param accessCardDto :门禁卡业务对象
     * @return ResultBean<Boolean>
     *
     *
     */
    ResultBean<Boolean> addOrUpdateServerUserCard(AccessCardDto accessCardDto);


    /**
     * 功能描述:删除下发卡
     * @param accessCard
     * @return
     *
     *
     */
    void sendRemoveCard(AccessCard accessCard);

    /**
     * 功能描述:批量删除下发卡
     * @param cardIdList 卡号ID集合
     * @return
     *
     *
     */
    void sendRemoveCardBatch(List<AccessCardSimpleDto> accessCardSimpleDtoList);

    /**
     * 功能描述:下发卡
     * @param accessCard
     * @return
     *
     *
     */
    void sendPushCard(AccessCard accessCard);

    /**
     * 功能描述:下发卡
     * @param accessCardDtoList
     * @return
     *
     *
     */
    void pushCardBatch(List<AccessCardDto> accessCardDtoList);

    /**
     * 功能描述:下发卡，并指定是下发到那种位置的设备，
     * @param accessCard
     * @return
     *
     *
     */
    ResultBean<Boolean> sendPushCard(AccessCard accessCard, Integer deviceAccessType, Integer operType);

    /**
     * 功能描述:手动下发卡到设备上
     * @param task
     * @return
     *
     *
     */
    void manualSendPushCardToDevices(ManualPushDevicesTask task);

    /**
     * 把门禁卡修改为黑名单
     * @param id
     * @return
     */
    ResultBean<Boolean> updateBlackCard(Long id);

    /**
     * 把门禁卡取消黑名单
     * @param id
     * @return
     */
    ResultBean<Boolean> cancelBlackCard(Long id);

    /**
     * 更新数据
     * @param accessCard
     * @return
     */
    ResultBean<Boolean> updateAccessCardById(AccessCard accessCard);

    /**
     * 批量更新数据
     * @param accessCardList
     * @return
     */
    ResultBean<Boolean> updateAccessCardList(List<AccessCard> accessCardList);


    List<AccessCard> findAccessCardByUserIdAndUserName(String userId, String userName);

}
