package com.rc.httpcore.client

import com.rc.httpcore.vo.ByNameBean
import com.rc.httpcore.vo.CommonRowsResponse
import com.rc.httpcore.vo.GroupNameBean
import com.rc.httpcore.vo.request.*
import com.rc.httpcore.vo.response.*
import io.reactivex.Observable
import java.io.File

interface LabClient {

    /**
     * 登录获取token
     */
    fun authOneLogin(): Observable<Boolean>

    /**
     * 查询APK版本
     *
     * @param id 设备唯一编码
     */
    fun apkVersion(id: String): Observable<ApkInfoResp>

    /**
     * 上传APK更新状态
     *
     * @param state 0:升级失败; 1:升级成功; 2:升级中
     */
    fun onepcApkUpdate(id: String, state: String): Observable<Boolean>

    /**
     * 实验室信息
     *
     * @param id 设备唯一编码
     */
    fun laboratoryInfo(id: String): Observable<LaboratoryVo>

    /**
     * 危险源信息
     *
     * @param param 实验室Id、分页信息
     */
    fun hazardlist(param: HazardReq): Observable<List<LabHazardVo>>

    /**
     * 签到验证（进入）
     *
     * @param eBoard 是否为电子信息牌
     * @param subId 实验室id
     * @param username 学生卡编号/人员id
     */
    fun signInCheck(eBoard: Boolean, subId: String, username: String): Observable<SignInCheckResp>

    /**
     * 签到提交-人脸验证
     */
    fun signInFace(code: String, faceFeature: SignInReq? = null): Observable<String>

    /**
     * 签到-安全准入检测三合一
     *
     * @param patrolSign 是否为巡查签到
     */
    fun checkInAll(patrolSign: Boolean, param: CheckInAllReq): Observable<Boolean>

    /**
     * 签到提交
     */
    fun signIn(id: String): Observable<Boolean>

    /**
     * 签到提交-有跳过安全准入检测时使用
     */
    fun signInJump(id: String, code: String): Observable<Boolean>

    /**
     * 签到验证（离开）
     *
     * @param eBoard 是否为电子信息牌
     * @param subId 实验室id
     * @param username 学生卡编号/人员id
     */
    fun signOutCheck(eBoard: Boolean, subId: String, username: String): Observable<SignInCheckResp>

    /**
     * 离开提交
     */
    fun signOut(code: String): Observable<Boolean>

    /**
     * 获取实验室一体机可控制设备
     *
     * @param subId 实验室id
     */
    fun controllerList(subId: String): Observable<List<LotDeviceVo>>

    /**
     * 控制设备
     *
     * @param param 设备编号、命令
     */
    fun sendControllerCMD(param: ControllerCMD): Observable<Boolean>

    /**
     * 实验室测点功能列表（首页-左侧看板）
     *
     * @param subId 实验室id
     */
    fun functionList(subId: String): Observable<List<LabBulletinBoardVo>>

    /**
     * 实验室预警测点
     *
     * @param subId 实验室id
     */
    fun warnList(subId: String): Observable<List<LabBulletinBoardVo>>

    /**
     * 人脸比对
     */
    fun faceCompare(param: FaceCompareReq): Observable<Boolean>

    /**
     * 心跳
     *
     * @param num 设备唯一编码
     */
    fun heartbeat(num: String): Observable<Boolean>

    /**
     * 查询实验室安全制度列表
     *
     * @param type 1:学校制度 2:学院制度 3: 中心制度
     */
    fun safeBookList(type: String): Observable<List<SafeBook>>

    /**
     * 获取实验室安全制度详细信息
     */
    fun safeBookDetail(id: String): Observable<SafeBook>

    /**
     * 一体机查询危化品
     */
    fun hazardBookList(): Observable<List<HazardBook>>

    /**
     * 获取危化品安全技术说明书详细信息
     */
    fun hazardBookDetail(id: String): Observable<HazardBook>

    /**
     * 查询实验室在线人员
     */
    fun onlineUser(param: OnLineUserReq): Observable<CommonRowsResponse<LabPersonVo>>

    /**
     * 实验室安全整改信息
     */
    fun checkMachineMsgList(subId: String): Observable<List<CheckMachineVo>>

    /**
     * 实验室通知消息信息
     */
    fun contentMachineMsgList(subId: String): Observable<List<ContentMachineVo>>

    /**
     * 实验室文化图
     *
     * @param id 设备唯一编码
     */
    fun bannerImages(id: String): Observable<List<BannerImageBean>>

    /**
     * 文字转语音
     */
    fun textParseVideo(text: String): Observable<SpeakInfo>

    /**
     * 物联控制权限验证
     */
    fun lotInCheck(subId: String, username: String): Observable<String>

    /**
     * 查询实验室配置
     */
    fun queryLabConfig(deviceNum: String): Observable<LabConfig>

    /**
     * 查询首页头部信息
     */
    fun homeTopInfo(labId: String): Observable<HomeTopResp>

    /**
     * 查询首页中部信息
     */
    fun homeMiddleInfo(labId: String): Observable<HomeMiddleResp>

    /**
     * 查询首页右侧人员信息
     */
    fun homeRightInfo(labId: String): Observable<HomeRightResp>

    /**
     * 实验室介绍
     */
    fun labIntro(labId: String): Observable<String>

    /**
     * 查询值班人员列表
     */
    fun dutyUserList(labId: String, startTime: String): Observable<DutyPersonVo>

    /**
     * 查询实验人员列表
     */
    fun signUserList(labId: String): Observable<List<LabPersonVo>>

    /**
     * 查询准入人员列表
     */
    fun securityUserList(labId: String, pageNumber: Int, pageSize: Int): Observable<List<LabPersonVo>>

    /**
     * 查询巡查人员列表
     */
    fun inspectUserList(labId: String, startTime: String): Observable<DutyPersonVo>

    /**
     * 视频监控
     */
    fun cameraBySubjectId(labId: String): Observable<List<MonitorVo>>

    /**
     * 获取准入人员的指纹信息列表
     */
    fun getFingerList(labId: String): Observable<List<UserFingerVo>>

    /**
     * 根据用户查询指纹列表
     */
    fun getFingerByUserId(labId: String, userId: String): Observable<List<UserFingerVo>>

    /**
     * 指纹录入
     */
    fun addUserFinger(param: UserFingerVo): Observable<Boolean>

    /**
     * 删除指纹
     */
    fun deleteFingerById(id: String): Observable<Boolean>

    /**
     * 获取人像特征值
     */
    fun faceFeature(file: File): Observable<String>

    /**
     * 人脸识别
     */
    fun multiFaceDetection(param: AuthFaceReq): Observable<UserVo>

    /**
     * 刷卡验证
     */
    fun cardValidate(labId: String, cardNum: String): Observable<UserVo>

    /**
     * 密码验证
     */
    fun pwdValidate(param: AuthPwdReq): Observable<UserVo>

    /**
     * 校园卡是否能开启门禁
     */
    fun getCardIsOpen(labId: String, cardNum: String): Observable<UserVo>

    /**
     * 巡查签到
     */
    fun signInWithPatrol(param: PatrolSignInReq): Observable<Boolean>

    /**
     * 巡查签退
     */
    fun signOutWithPatrol(labId: String, userId: String): Observable<Boolean>

    /**
     * 巡查签退/准入签退判断
     *  true-巡查 false-准入
     */
    fun isSignInType(labId: String, userId: String): Observable<Boolean>

    /**
     * 巡查签到前置校验
     */
    fun signInCheckWithPatrol(labId: String, userId: String): Observable<Boolean>

    /**
     * 滚动消息列表
     */
    fun newMsgGroup(labId: String): Observable<List<NoticeSummaryVo>>

    fun getGroupNameList(subjectId: String): Observable<List<GroupNameBean>>

    fun getListByName(subjectId:String,gasName:String,remark:String?,flg:String?): Observable<List<ByNameBean>>

    /**
     * 通知消息列表
     */
    fun newMsg(labId: String, pageNum: Int, pageSize: Int): Observable<List<NoticeDetailVo>>

    /**
     * 整改消息列表
     */
    fun checkNewMsg(labId: String, pageNum: Int, pageSize: Int): Observable<List<NoticeDetailVo>>

}