package com.jpsoft.shinestar.modules.uniview.service;

import com.alibaba.fastjson.JSONObject;
import com.jpsoft.shinestar.modules.base.entity.DeviceInfo;
import com.jpsoft.shinestar.modules.base.entity.PersonInfo;
import com.jpsoft.shinestar.modules.pacs.dto.PacsMsgResult;
import com.jpsoft.shinestar.modules.pacs.dto.PacsResult;
import com.jpsoft.shinestar.modules.uniview.dto.DataServersDTO;
import com.jpsoft.shinestar.modules.pacs.dto.IsPersonExistVo;

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

/**
 * @author 墨鱼_mo
 * @date 2020-3-15 9:36
 */
public interface ILapiService {

    /**
     * 通过ip和port查看门禁设备，有设备信息返回为正常
     * @param ipAddress
     * @param port
     * @return
     * @throws Exception
     */
    DeviceInfo findByIpAddressAndPort(String ipAddress, String port) throws Exception;

    /**
     * 根据设备id查看设备在线状态
     * @param id 设备id
     * @return
     */
    Boolean keepAlive(String id) throws Exception;

    /**
     * 单人单设备人脸数据上传
     * @param id
     * @param deviceId
     * @return
     * @throws Exception
     */
    PacsResult addPersonToDevice(Long id, String deviceId) throws Exception;

    /**
     * 根据公司名称获取人脸库
     * @param companyName
     * @return
     */
    String getFaceDbId(DeviceInfo deviceInfo, String companyName) throws Exception;

    /**
     * 根据设备ID和人员id删除数据
     * @param id 人员id
     * @param deviceId 设备id
     * @return
     * @throws Exception
     */
    PacsMsgResult deletePersonFromDevice(Long id, String deviceId) throws Exception;

    /**
     * 远程手机开门
     * @param deviceId
     * @return
     * @throws Exception
     */
    PacsMsgResult remoteOpen(String deviceId) throws Exception;

    /**
     * 重启设备
     * @param deviceId 设备id
     * @return
     */
    Boolean reboot(String deviceId) throws Exception;

    /**
     * 添加公司照片库
     * @param companyInfoId 公司id
     * @param deviceInfoIds 设备id
     * @return
     * @throws Exception
     */
    List<PacsResult> addCompanyLib(String companyInfoId, String deviceInfoIds) throws Exception;

    /**
     * 删除公司人脸库
     * @param deviceInfoId 设备id
     * @param libraryId 人脸库id
     * @return
     * @throws Exception
     */
    PacsResult deleteCompanyLib(String deviceInfoId, String libraryId) throws Exception;

    /**
     * 更新公司人脸库名称
     * @param companyId  公司id
     * @param deviceInfoId
     * @param libraryId
     * @return
     * @throws Exception
     */
    PacsResult updateCompanyLib(String companyId, String deviceInfoId, String libraryId) throws Exception;

    /**
     * 删除设备上的所有人脸库
     * @param deviceInfoId
     * @return
     * @throws Exception
     */
    List<PacsResult> deleteDeviceAllCompanyLib(String deviceInfoId) throws Exception;

    /**
     * 人员是否成功写入设备
     * @param
     * @return
     */
    Boolean isSuccessAddPerson(PersonInfo personInfo, DeviceInfo deviceInfo, String faceDbId);

    /**
     * 人员照片是否存在设备
     * @param
     * @return
     */
    Boolean isPersonImageExist(PersonInfo personInfo, DeviceInfo deviceInfo, String faceDbId);

    /**
     * 获取设备的验证规则
     * @param deviceInfoId
     * @return
     * @throws Exception
     */
    Map<String,Object> getDeviceRule(String deviceInfoId) throws Exception;

    /**
     * 设置设备的验证规则
     * @param deviceInfoId 设备id
     * @param needCap 安全帽验证 （0：不验证，1：验证）
     * @param needMask 口罩验证 （0：不验证，1：验证）
     * @param measureTemperature 测温验证 （0：不验证，1：验证）
     * @param type 测试验证类型 （0：测额温，1：测腕温）
     * @param minTemper 温度下限
     * @param maxTemper 温度上限
     * @param preAlarmEnabled 体温预告警开关
     * @param preAlarmOffset 体温预告警偏移值
     * @param alarmThreshold 报警温度
     * @return
     * @throws Exception
     */
    Boolean setDeviceRule(String deviceInfoId, Integer needCap, Integer needMask,
                          Integer measureTemperature, Integer type, BigDecimal minTemper, BigDecimal maxTemper,
                          Integer preAlarmEnabled,BigDecimal preAlarmOffset,BigDecimal alarmThreshold) throws Exception;

    /**
     * 修改设备的服务器ip端口
     * @param deviceInfo 设备
     * @param newAddress   新ip
     * @param newPort 新端口
     * @throws Exception
     */
    void updateDeviceServerConfig(DeviceInfo deviceInfo, String newAddress, String newPort) throws Exception;

    /**
     * 获取设备的服务器信息
     * @param deviceNo
     * @return
     */
    DataServersDTO getDeviceDateServer(String deviceNo) throws Exception;


    /**
     * 获取设备的校验方式
     * @param deviceInfoId
     * @return
     * @throws Exception
     */
    Map<String,Object> getOpenDoorMode(String deviceInfoId) throws Exception;

    /**
     * 修改设备的校验方式
     * @param deviceInfoId
     * @param type （0：校验通过，1：刷脸，2：远程）
     * @return
     * @throws Exception
     */
    Boolean setOpenDoorMode(String deviceInfoId, String type) throws Exception;

    /**
     * 批量查询学生对应的id是否在设备中，不对照片是否存在进行验证
     * @param personIdList
     * @param deviceInfo
     * @return
     * @throws Exception
     */
    List<IsPersonExistVo> existPersonInDevice(List<Long> personIdList, DeviceInfo deviceInfo) throws Exception;

    void sendGUIShowInfo(String deviceNo,String personName, String passTime, int resultCode, String resultMsg);

    void setLongConnectionInfo(String deviceNo,int recordResponseEnable, int keepAliveInterval);

    JSONObject getFaceDetectionRule(String deviceInfoId) throws Exception;
    JSONObject setFaceDetectionRule(String deviceInfoId,JSONObject requestBody) throws Exception;

    JSONObject getPeopleLibPermission(String deviceId, String libId) throws Exception;
    JSONObject setPeopleLibPermission(String deviceId, String libId, JSONObject data) throws Exception;
}
