package com.ys.bdtp.adm.mvvm.model.nt

import com.ys.bdtp.adm.app.fileDownloadInfoUrl
import com.ys.bdtp.adm.app.fileUploadInfoUrl
import com.ys.bdtp.adm.app.tools.file.FileDownloadInfo
import com.ys.bdtp.adm.app.tools.file.FileId
import com.ys.bdtp.adm.app.tools.file.FileInfo
import com.ys.bdtp.adm.app.tools.file.FileUploadInfo
import com.ys.bdtp.adm.mvvm.model.vo.*
import com.ys.bdtp.adm.mvvm.model.vo.request.Account
import com.ys.bdtp.adm.mvvm.model.vo.request.Login
import okhttp3.RequestBody
import retrofit2.http.*

/**
 * 后端API
 *
 * @author bai
 */
interface Api {
    /**
     * 登录接口,登录只获取token
     *
     * @param login 登录参数
     * @return [Model] 返回token
     */
    @POST("auth/account/login")
    suspend fun login(@Body login: Login): Model<String>

    /**
     *  获取账号信息
     */
    @POST("auth/login/loginInfo")
    suspend fun getAccount(): Model<Account>

    /**
     * 获取字典数据
     */
    @POST("adm/dict")
    suspend fun getDict(@Body body: Map<String, String>): Model<Dict>

    /**
     * 获取配置信息
     */
    @POST("adm/config")
    suspend fun getConfig(@Body map: Map<String, String>): Model<Config>

    /**
     * 获取建筑和楼层数据
     */
    @POST("adm/frame")
    suspend fun getBuildingsAndFloors(@Body map: Map<String, String>): Model<BuildingsAndFloors>

    /**
     * 下载任务数据
     */
    //@Headers("Content-Encoding: gzip")
    @POST("adm/download")
    suspend fun getMission(@Body map: Map<String, String>): Model<Mission>

    /**
     * 上传任务数据
     */
    //@Headers("Content-Encoding: gzip")
    @POST("adm/upload")
    suspend fun uploadMission(@Body mission: Mission)

    /**
     * 获取关系数据
     */
    @POST("adm/downloadObjRel")
    suspend fun getRelation(@Body map: Map<String, String>): Model<Relation>

    /**
     * 判断是否有需要更新的数据
     */
    @POST("adm/hasUpdate")
    suspend fun hasUpdate(): Model<Boolean>

    /**
     * 下载地图
     */
    @POST("adm/downloadMap")
    suspend fun downloadFile()

    /**
     * 获取文件上传接口
     *
     * @param param 查询参数, appId userId groupCode projectId
     * @param fileInfo 文件信息
     */
    @POST(fileUploadInfoUrl)
    suspend fun getFileUploadInfo(
        @QueryMap param: Map<String, String>,
        @Body fileInfo: FileInfo
    ): Model<FileUploadInfo>

    /**
     * 上传文件
     */
    @PUT
    suspend fun uploadFile(@Url url: String, @Body file: RequestBody): String

    /**
     * 文件下载
     */
    @POST(fileDownloadInfoUrl)
    suspend fun getFileDownloadInfo(
        @QueryMap param: Map<String, String>,
        @Body fileId: FileId
    ): Model<FileDownloadInfo>

    /**
     * 返回地图
     */
    @Streaming
    @GET
    suspend fun downloadFile(@Url url: String): ByteArray?

}