package com.rc.httpcore.client.retrofit;

import com.rc.httpcore.vo.ByNameBean;
import com.rc.httpcore.vo.CommonDataResponse;
import com.rc.httpcore.vo.CommonResponse;
import com.rc.httpcore.vo.CommonRowsResponse;
import com.rc.httpcore.vo.GroupNameBean;
import com.rc.httpcore.vo.request.AccessTokenReq;
import com.rc.httpcore.vo.request.AuthFaceReq;
import com.rc.httpcore.vo.request.FaceCompareReq;
import com.rc.httpcore.vo.request.OnLineUserReq;
import com.rc.httpcore.vo.request.PatrolSignInReq;
import com.rc.httpcore.vo.request.SignInReq;
import com.rc.httpcore.vo.response.AccessTokenResp;
import com.rc.httpcore.vo.response.ApkInfoResp;
import com.rc.httpcore.vo.response.BannerImageBean;
import com.rc.httpcore.vo.response.CheckMachineVo;
import com.rc.httpcore.vo.response.ContentMachineVo;
import com.rc.httpcore.vo.response.DutyPersonVo;
import com.rc.httpcore.vo.response.HazardBook;
import com.rc.httpcore.vo.response.HomeMiddleResp;
import com.rc.httpcore.vo.response.HomeRightResp;
import com.rc.httpcore.vo.response.HomeTopResp;
import com.rc.httpcore.vo.response.LabBulletinBoardVo;
import com.rc.httpcore.vo.response.LabConfig;
import com.rc.httpcore.vo.response.LabHazardVo;
import com.rc.httpcore.vo.response.LabPersonVo;
import com.rc.httpcore.vo.response.LaboratoryVo;
import com.rc.httpcore.vo.response.LotDeviceVo;
import com.rc.httpcore.vo.response.MonitorVo;
import com.rc.httpcore.vo.response.NoticeDetailVo;
import com.rc.httpcore.vo.response.NoticeSummaryVo;
import com.rc.httpcore.vo.response.SafeBook;
import com.rc.httpcore.vo.response.SignInCheckResp;
import com.rc.httpcore.vo.response.SpeakInfo;
import com.rc.httpcore.vo.response.UserFingerVo;
import com.rc.httpcore.vo.response.UserVo;

import java.util.List;
import java.util.Map;

import io.reactivex.Observable;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import retrofit2.http.Body;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Part;
import retrofit2.http.PartMap;
import retrofit2.http.Path;
import retrofit2.http.Query;

public interface ApiService {

    /**
     * 登录获取token
     */
    @POST("auth/one/login")
    Observable<CommonDataResponse<AccessTokenResp>> authOneLogin(@Body AccessTokenReq param);

    /**
     * 查询APK版本
     */
    @GET("laboratory/apkfile/onepcApkDetail/{id}")
    Observable<CommonDataResponse<ApkInfoResp>> apkVersion(@Path("id") String id);

    /**
     * 上传APK更新状态
     *
     * @param state 0:升级失败; 1:升级成功; 2:升级中
     */
    @PUT("laboratory/apkfile/onepcApkUpdate/{id}/{state}")
    Observable<CommonResponse> onepcApkUpdate(@Path("id") String id, @Path("state") String state);

    /**
     * 实验室信息
     */
    @GET("laboratory/onemachine/{id}")
    Observable<CommonDataResponse<LaboratoryVo>> laboratoryInfo(@Path("id") String id);

    /**
     * 危险源信息
     */
    @GET("laboratory/onemachine/{subId}/Hazard/list")
    Observable<CommonRowsResponse<LabHazardVo>> hazardlist(@Path("subId") String subId, @Query("pageNum") int pageNum, @Query("pageSize") int pageSize);

    /**
     * 签到验证（进入）
     */
    @GET("laboratory/onemachine/{subId}/SignInCheck/{username}")
    Observable<CommonDataResponse<SignInCheckResp>> signInCheck(@Path("subId") String subId, @Path("username") String username);

    /**
     * 签到验证（进入）
     */
    @GET("laboratory/onemachine/{subId}/SignInXxpCheck/{userId}")
    Observable<CommonDataResponse<SignInCheckResp>> signInXxpCheck(@Path("subId") String subId, @Path("userId") String userId);

    /**
     * 签到提交-人脸验证
     */
    @POST("laboratory/onemachine/{code}/SignIn2")
    Observable<CommonDataResponse<String>> signInFace(@Path("code") String code, @Body SignInReq data);

    /**
     * 签到-安全准入检测三合一
     */
    @Multipart
    @POST("algorithm/signIn/check/checkInAll")
    Observable<CommonDataResponse<String>> checkInAll(@PartMap Map<String, RequestBody> params, @Part MultipartBody.Part file);

    /**
     * 签到-安全准入检测三合一
     */
    @Multipart
    @POST("algorithm/signIn/check/checkInXxpAll")
    Observable<CommonDataResponse<String>> checkInXxpAll(@PartMap Map<String, RequestBody> params, @Part MultipartBody.Part file);

    /**
     * 签到提交
     */
    @POST("laboratory/onemachine/{id}/SignIn/commit")
    Observable<CommonDataResponse<String>> signIn(@Path("id") String id);

    /**
     * 签到提交-有跳过安全准入检测时使用
     */
    @POST("laboratory/checklog/{id}/jump/{code}")
    Observable<CommonDataResponse<String>> signInJump(@Path("id") String id, @Path("code") String code);

    /**
     * 签到验证（离开）
     */
    @GET("laboratory/onemachine/{subId}/SignOutCheck/{username}")
    Observable<CommonDataResponse<SignInCheckResp>> signOutCheck(@Path("subId") String subId, @Path("username") String username);

    /**
     * 签到验证（离开）
     */
    @GET("laboratory/onemachine/{subId}/SignOutXXpCheck/{userId}")
    Observable<CommonDataResponse<SignInCheckResp>> signOutXXpCheck(@Path("subId") String subId, @Path("userId") String userId);

    /**
     * 离开提交
     */
    @POST("laboratory/onemachine/{code}/SignOut")
    Observable<CommonDataResponse<String>> signOut(@Path("code") String code);

    /**
     * 获取实验室一体机可控制设备
     */
    @GET("laboratory/onemachine/{subId}/controller/list")
    Observable<CommonDataResponse<List<LotDeviceVo>>> controllerList(@Path("subId") String subId);

    /**
     * 控制设备
     */
    @POST("laboratory/subject/manger/control/{id}/{command}")
    Observable<CommonResponse> sendControllerCMD(@Path("id") String id, @Path("command") String command);

    /**
     * 实验室测点功能列表（首页-左侧看板）
     */
    @GET("laboratory/onemachine/{subId}/function/list")
    Observable<CommonDataResponse<List<LabBulletinBoardVo>>> functionList(@Path("subId") String subId);

    /**
     * 实验室预警测点
     */
    @POST("laboratory/onemachine/{subId}/warn")
    Observable<CommonDataResponse<List<LabBulletinBoardVo>>> warnList(@Path("subId") String subId);

    /**
     * 人脸比对
     */
    @POST("{basePath}/faceApi/compare")
    Observable<CommonDataResponse<String>> faceCompare(@Path("basePath") String basePath, @Body FaceCompareReq param);

    /**
     * 心跳
     */
    @PUT("laboratory/subject/manger/{num}/heartbeat")
    Observable<CommonResponse> heartbeat(@Path("num") String num);

    /**
     * 查询实验室安全制度列表
     *
     * @param type 1:学校制度 2:学院制度 3: 中心制度
     */
    @GET("laboratory/safe_book/queryOption")
    Observable<CommonDataResponse<List<SafeBook>>> safeBookList(@Query("type") String type);

    /**
     * 获取实验室安全制度详细信息
     */
    @GET("laboratory/safe_book/{id}")
    Observable<CommonDataResponse<SafeBook>> safeBookDetail(@Path("id") String id);

    /**
     * 一体机查询危化品
     */
    @GET("laboratory/hazard_book/queryOption")
    Observable<CommonDataResponse<List<HazardBook>>> hazardBookList();

    /**
     * 获取危化品安全技术说明书详细信息
     */
    @GET("laboratory/hazard_book/{id}")
    Observable<CommonDataResponse<HazardBook>> hazardBookDetail(@Path("id") String id);

    /**
     * 查询实验室在线人员
     */
    @POST("laboratory/onemachine/sub/online/user")
    Observable<CommonRowsResponse<LabPersonVo>> onlineUser(@Body OnLineUserReq param);

    /**
     * 实验室安全整改信息
     */
    @GET("laboratory/checkMachineMsg/list")
    Observable<CommonDataResponse<List<CheckMachineVo>>> checkMachineMsgList(@Query("subId") String subId);

    /**
     * 实验室通知消息信息
     */
    @GET("laboratory/contentMachineMsg/list")
    Observable<CommonRowsResponse<ContentMachineVo>> contentMachineMsgList(@Query("subId") String subId);

    /**
     * 实验室文化图
     */
    @GET("laboratory/onemachine/rotation/chart")
    Observable<CommonDataResponse<List<BannerImageBean>>> bannerImages(@Query("hardwareNum") String hardwareNum);

    /**
     * 文字转语音
     */
    @GET("{basePath}/speaker/textParseVideo")
    Observable<SpeakInfo> textParseVideo(@Path("basePath") String basePath, @Query("speed") String speed, @Query("volume") String volume, @Query("text") String text);

    /**
     * 物联控制权限验证
     */
    @GET("laboratory/onemachine/{subId}/LotInCheck/{username}")
    Observable<CommonDataResponse<String>> lotInCheck(@Path("subId") String subId, @Path("username") String username);

    /**
     * 查询实验室配置
     */
    @GET("base/app/board/getSubjectIdByNum/{deviceNum}")
    Observable<CommonDataResponse<LabConfig>> queryLabConfig(@Path("deviceNum") String deviceNum);

    /**
     * 查询首页头部信息
     */
    @GET("base/app/board/topInfo")
    Observable<CommonDataResponse<HomeTopResp>> homeTopInfo(@Query("labId") String labId);

    /**
     * 查询首页中部信息
     */
    @GET("base/app/board/middleInfo")
    Observable<CommonDataResponse<HomeMiddleResp>> homeMiddleInfo(@Query("labId") String labId);

    /**
     * 查询首页右侧人员信息
     */
    @GET("base/app/board/rightInfo")
    Observable<CommonDataResponse<HomeRightResp>> homeRightInfo(@Query("labId") String labId);

    /**
     * 实验室介绍
     */
    @GET("base/app/board/labIntro")
    Observable<CommonDataResponse<String>> labIntro(@Query("labId") String labId);

    /**
     * 查询值班人员列表
     */
    @GET("base/app/board/dutyUserList")
    Observable<CommonDataResponse<DutyPersonVo>> dutyUserList(@Query("labId") String labId, @Query("startTime") String startTime);

    /**
     * 查询实验人员列表
     */
    @GET("base/app/board/signUserList")
    Observable<CommonDataResponse<List<LabPersonVo>>> signUserList(@Query("labId") String labId);

    /**
     * 查询准入人员列表
     */
    @GET("base/app/board/securityUserList")
    Observable<CommonDataResponse<List<LabPersonVo>>> securityUserList(@Query("labId") String labId, @Query("pageNumber") int pageNumber, @Query("pageSize") int pageSize);

    /**
     * 查询巡查人员列表
     */
    @GET("base/app/board/inspectUserList")
    Observable<CommonDataResponse<DutyPersonVo>> inspectUserList(@Query("labId") String labId, @Query("startTime") String startTime);

    /**
     * 视频监控
     */
    @GET("base/app/board/cameraBySubjectId")
    Observable<CommonDataResponse<List<MonitorVo>>> cameraBySubjectId(@Query("labId") String labId);

    /**
     * 获取准入人员的指纹信息列表
     */
    @GET("base/app/board/getFingerList")
    Observable<CommonDataResponse<List<UserFingerVo>>> getFingerList(@Query("labId") String labId);

    /**
     * 根据用户查询指纹列表
     */
    @GET("base/app/board/getFingerByUserId")
    Observable<CommonDataResponse<List<UserFingerVo>>> getFingerByUserId(@Query("labId") String labId,
                                                                         @Query("userId") String userId);

    /**
     * 指纹录入
     */
    @POST("base/app/board/addUserFinger")
    Observable<CommonResponse> addUserFinger(@Body UserFingerVo param);

    /**
     * 删除指纹
     */
    @GET("base/app/board/deleteFingerById")
    Observable<CommonResponse> deleteFingerById(@Query("id") String id);

    /**
     * 获取人像特征值
     */
    @Multipart
    @POST("base/app/board/faceFeature")
    Observable<CommonDataResponse<String>> faceFeature(@Part MultipartBody.Part filePart);

    /**
     * 人脸识别
     */
    @POST("base/app/board/multiFaceDetection")
    Observable<CommonDataResponse<UserVo>> multiFaceDetection(@Body AuthFaceReq param);

    /**
     * 刷卡验证
     */
    @GET("base/app/board/cardValidate")
    Observable<CommonDataResponse<UserVo>> cardValidate(@Query("labId") String labId,
                                                        @Query("cardNum") String cardNum);

    /**
     * 密码验证
     */
    @GET("base/app/board/pwdValidate")
    Observable<CommonDataResponse<UserVo>> pwdValidate(@Query("num") String num,
                                                       @Query("labId") String labId,
                                                       @Query("userId") String userId,
                                                       @Query("pwd") String pwd);

    /**
     * 校园卡是否能开启门禁
     */
    @GET("base/app/board/getCardIsOpen")
    Observable<CommonDataResponse<UserVo>> getCardIsOpen(@Query("labId") String labId,
                                                       @Query("cardNum") String cardNum);

    /**
     * 巡查签到
     */
    @POST("base/app/board/XxpInspection/addInspection/signIn")
    Observable<CommonResponse> signInWithPatrol(@Body PatrolSignInReq param);

    /**
     * 巡查签退
     */
    @FormUrlEncoded
    @POST("base/app/board/XxpInspection/addInspection/signOut")
    Observable<CommonResponse> signOutWithPatrol(@Field("labId") String labId,
                                                 @Field("userId") String userId);

    /**
     * 巡查签退/准入签退判断
     *  1-巡查 2-准入
     */
    @FormUrlEncoded
    @POST("base/app/board/XxpInspection/isSignInType")
    Observable<CommonDataResponse<String>> isSignInType(@Field("labId") String labId,
                                                        @Field("userId") String userId);

    /**
     * 巡查签到前置校验
     */
    @FormUrlEncoded
    @POST("base/app/board/XxpInspection/isSignInspection")
    Observable<CommonResponse> signInCheckWithPatrol(@Field("labId") String labId,
                                                     @Field("userId") String userId);

    /**
     * 滚动消息列表
     */
    @GET("laboratory/onemachine/{labId}/newMsgGroup")
    Observable<CommonDataResponse<List<NoticeSummaryVo>>> newMsgGroup(@Path("labId") String labId);

    /**
     * 气瓶列表  //http://192.168.1.17:8080/airbottle/stock/groupName?subjectId=241 get
     */
    @GET("airbottle/stock/groupName")
    Observable<CommonDataResponse<List<GroupNameBean>>> getGroupNameList(@Query("subjectId") String subjectId);

    /**
     * 查询实验室下的气体列表
     * http://192.168.1.17:8080/airbottle/stock/getListByName?subjectId=241&gasName=三氧化硫  get
     */
    @GET("airbottle/stock/getListByName")
    Observable<CommonDataResponse<List<ByNameBean>>> getListByName(@Query("subjectId") String subjectId, @Query("gasName")String gasName,@Query("remark")String remark,@Query("flg")String flg);


    /**
     * 通知消息列表
     */
    @GET("laboratory/onemachine/{labId}/newMsg")
    Observable<CommonRowsResponse<NoticeDetailVo>> newMsg(@Path("labId") String labId,
                                                          @Query("pageNum") int pageNum,
                                                          @Query("pageSize") int pageSize);

    /**
     * 整改消息列表
     */
    @GET("laboratory/onemachine/{labId}/checkNewMsg")
    Observable<CommonRowsResponse<NoticeDetailVo>> checkNewMsg(@Path("labId") String labId,
                                                               @Query("pageNum") int pageNum,
                                                               @Query("pageSize") int pageSize);

}
