package com.palmnest.service.lingling.manager;

import com.alibaba.fastjson.JSONObject;
import com.palmnest.application.bean.AppResultDto;
import com.palmnest.application.bean.Page;
import com.palmnest.application.dto.LinglingPassDto;
import com.palmnest.application.dto.input.LingLingVisitorMachineInputDto;
import com.palmnest.application.dto.input.lingling.QrcodeInsInputDTO;
import com.palmnest.application.dto.output.VisitorInfoVO;
import com.palmnest.application.dto.output.lingling.*;
import com.palmnest.model.User;
import com.palmnest.model.estateserve.AppUser;
import com.palmnest.model.lingling.DevicePermGroup;
import com.palmnest.model.lingling.LingLingCard;
import com.palmnest.model.lingling.LingLingDeveloper;
import com.palmnest.model.lingling.LingLingDevice;
import com.palmnest.model.lingling.LingLingLog;
import com.palmnest.service.GenericManager;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import org.apache.poi.ss.formula.functions.Vlookup;

/**
 * Created by HIAPAD on 2018/12/7.
 */
public interface LingLingManager extends GenericManager<Object, Long> {

	/**
	 * 根据令令设备id查询设备
	 *
	 * @param deviceId 令令设备id
	 * @return 设备实体
	 */
	public LingLingDevice getByDeviceId(Integer deviceId,Integer orgId);

	/**
	 * 根据id查询设备
	 *
	 * @param id
	 * @return
	 */
	public LingLingDevice getById(Long id);

	/**
	 * 添加令令设备
	 *
	 * @param device 设备实体
	 * @return 设备id
	 */
	public AppResultDto saveDevice(LingLingDevice device, String url,LingLingDeveloper developer);
	
	
	public void saveLingLingLog(LingLingLog log);

	/**
	 * 删除/禁用设备
	 *
	 * @param deviceId
	 * @param url
	 * @return
	 */
	public AppResultDto delDevice(Integer deviceId, String url,Integer orgId);

	/**
	 * 更新设备(令令端更新设备)
	 *
	 * @param map
	 * @param url
	 * @return
	 */
	public AppResultDto updateDevice(Map<String, String> map, String url,LingLingDeveloper developer,Integer orgId);

	/**
	 * 查询设备列表
	 *
	 * @param paramMap
	 * @return
	 */
	public Page getDeviceList(Map<String, String> paramMap);

	/**
	 * 根据设备状态查询设备列表
	 *
	 * @param isEnable
	 * @return
	 */
	public List<LingLingDevice> getDeviceList(Integer isEnable, Integer orgId);

	/**
	 * 更新权限组信息
	 *
	 * @param group
	 */
	public void updateDeviceGroup(DevicePermGroup group,Set<LingLingDevice>  setLingLingDevice);
	
	String getDeviceNamesByGroupId(String groupId);

	/**
	 * 查询权限组列表
	 *
	 * @param paramMap
	 * @return
	 */
	public Page getDeviceGroupList(Map<String, String> paramMap);

	/**
	 * 根据id查询权限组
	 *
	 * @param id
	 * @return
	 */
	public DevicePermGroup getDeviceGroupById(Long id);

//    /**
//     * 旧方法
//     * 更新 权限组-用户关联关系
//     * @param group
//     */
//    public void updateUserPerm(DevicePermGroup group);

	/**
	 * 新方法
	 * 更新 权限组-用户关联关系
	 *
	 * @param groupId
	 */
	public void updateUserPerm(String groupId, String userIds);


	/**
	 * 新方法
	 * 更新 权限组-用户关联关系
	 *
	 * @param groupId
	 */
	public void updateUserPermNew(String groupId, String userIds, boolean isInsert,int methedType,Integer orgId);

	/**
	 * 获取该项目下的权限组
	 *
	 * @param orgId     项目id
	 * @param groupType 权限组类别 1 员工；2 访客
	 * @return
	 */
	public List<DevicePermGroup> getDevicePermGroupByOrgId(Integer orgId, Integer groupType);
	
	void savePermGroupDevice(Long devicePermGroupId, Long deviceId);

	/**
	 * 发卡
	 *
	 * @param cardCode
	 * @param userId
	 * @return
	 */
	public AppResultDto provideCard(String cardCode, String userId);

	/**
	 * 收卡
	 *
	 * @param cardId
	 * @return
	 */
	public AppResultDto recycleCard(String cardId, String cardCode,int methedType,LingLingDeveloper developer);

	/**
	 * 删除权限组
	 *
	 * @param groupId
	 * @return
	 */
	String delDeviceGroup(String groupId);

	/**
	 * 设备实体转换
	 *
	 * @param byDeviceId
	 * @return
	 */
	public LingLingDeviceOutDto convertDeviceDto(LingLingDevice byDeviceId);

	/**
	 * 获取权限组下的用户列表
	 *
	 * @param groupId
	 */
	public List<Map<String, Object>> getGroupUser(String groupId);

	/**
	 * 生成设备sdkkey
	 *
	 * @param devices
	 * @return
	 */
	List<String> makeSdkKey(Collection<LingLingDevice> devices);

	/**
	 * 生成员工二维码
	 *
	 * @param appUser
	 * @return
	 */
	public AppResultDto createQrCode(AppUser appUser,Long groupId);

	/**
	 * 令令开门日志回调处理
	 *
	 * @param noticeMsg
	 */
	public void uploadLogMsg(JSONObject noticeMsg);

	/**
	 * 获取通行记录列表
	 *
	 * @param params
	 * @return
	 */
	Page getPassHistory(Map<String, String> params);

	/**
	 * 根据权限组id和设备状态获取设备列表
	 *
	 * @param groupId
	 * @param isEnable
	 * @return
	 */
	public List<LingLingDevice> getDevicesByGroup(Long groupId, Integer isEnable);

	/**
	 * 批量删除用户权限
	 *
	 * @param userIds 用户id串:1,2,3
	 */
	void deleteUserGroupByUserIds(String userIds);

	/**
	 * 新增/修改访客机配置
	 *
	 * @param visitorMachine
	 * @param user
	 * @return
	 */
	boolean addUpdateVisitorMachine(LingLingVisitorMachineInputDto visitorMachine, User user);

	LingLingVisitorMachineInputDto getVisitorMachine(Integer orgId);
	LingLingVisitorMachineInputDto getVisitorMachineByDeviceCode(String deviceCode);

	LoginWinVO getVisitorMachineByOrgId(Integer orgId);

	/**
	 * 根据访客手机号或身份证号查询访客信息
	 *
	 * @param telephone  手机号
	 * @param idenNumber 身份证号
	 * @return
	 */
	SelectVisitorVO getVisitorInfo(String telephone, String idenNumber);
	NewSelectVisitorVO getNewVisitorInfo(String telephone, String idenNumber);

	/**
	 * 提交生成访客机二维码
	 *
	 * @param inputDTO
	 * @return
	 */
	QrcodeInsVo createVisitorMachineQrCode(QrcodeInsInputDTO inputDTO,int methedType);

	void uploadPhoto(String photo, String photoName, String photoType) throws Exception;

	List<GetCompanyVO> getCompanyList(Integer orgId);
	List<GetNewCompanyVO> getNewCompanyList(Integer orgId);

	/**
	 * 发送访客短信
	 *
	 * @param telephone
	 * @param codeId
	 */
	void sendQRCode(String telephone, String codeId,int methedType,Integer orgId) throws Exception;

	VisitorInfoVO getVisitorInfo(Integer visitorId);

	/**
	 * 根据访客人获取访客人所对应的权限组是否设置了可用时段限制
	 *
	 * @param orgId
	 * @return
	 */
	DevicePermGroup getByUserInfo(Integer orgId);

	/**
	 * 获取到访日期
	 *
	 * @param orgId
	 * @return
	 */
	List<String> getDateInfoByOrgId(Integer orgId);
	
	public LingLingDevice getByDeviceCode(String deviceCode);
	
	public int getMethedType(String orgId);
	
	/**
	 * 新方法  20210308加入企业时给用户分配权限组
	 * 更新 权限组-用户关联关系
	 *
	 * @param groupId
	 */
	public String updateUserPermNextNew(String userIds,Integer addUserId);
	
	LingLingDeveloper findByOrgId(Integer orgId);
	
	void saveDeviceSdk(LingLingDevice device);
	
	String saveUserPerm(Integer groupId,String lingLingIds,Integer orgId,int cardType);
	
	String getLinglingIdsByGroupId(Long groupId);
	
	/**
	 * tr_perm_group_user 表的数据
	 * @param userId
	 * @return
	 */
	Map<String, Object> getUserGroupInfo(Integer userId);
	
	DevicePermGroup getGroupByUserId(Integer userId);
	
	LingLingCard getCardByUserId(Integer userId);
	


	void saveUserPermAsync(DevicePermGroup group);
	
	int updatePermGroupUser(Long groupId,String userIds,int type);
	
	String getDeviceIdsByGroupId(Integer groupId);
	/**
	 * 导出通行记录
	 * @param params
	 * @return
	 */
	AppResultDto exportPassHistory(Map<String, String> params);
	/**
	 * 获取通行趋势报表
	 * @param orgId
	 * @param type
	 * @param model
	 * @param date
	 * @param orgName
	 * @return
	 */
	List<LinglingPassDto> getPassList(Integer orgId,Integer type,Integer model,String date,String orgName);
	/**
	 * 导出通行趋势报表
	 * @param orgId
	 * @param type
	 * @param model
	 * @param date
	 * @param orgName
	 * @return
	 */
	AppResultDto exportPassList(Integer orgId,Integer type,Integer model,String date,String orgName);
}
