package com.abbidot.tracker.retrofit2

import com.abbidot.baselibrary.network.base.BaseResponse
import com.abbidot.tracker.bean.ActiveTimeBean
import com.abbidot.tracker.bean.AlipayOrderBean
import com.abbidot.tracker.bean.CommonDataBean
import com.abbidot.tracker.bean.CountryCodeBean
import com.abbidot.tracker.bean.DeviceBean
import com.abbidot.tracker.bean.DeviceDetailBean
import com.abbidot.tracker.bean.FamilyPetBean
import com.abbidot.tracker.bean.FencesBean
import com.abbidot.tracker.bean.FirmwareBean
import com.abbidot.tracker.bean.GetFencesBean
import com.abbidot.tracker.bean.HistoryDataBean
import com.abbidot.tracker.bean.HomeDataBean
import com.abbidot.tracker.bean.InviteInfoBean
import com.abbidot.tracker.bean.LKSimListBean
import com.abbidot.tracker.bean.LiveDataBean
import com.abbidot.tracker.bean.MapDeviceBean
import com.abbidot.tracker.bean.MessageBean
import com.abbidot.tracker.bean.NotificationBean
import com.abbidot.tracker.bean.OrderBean
import com.abbidot.tracker.bean.PackageBean
import com.abbidot.tracker.bean.PackageTypeBean
import com.abbidot.tracker.bean.PayResultBean
import com.abbidot.tracker.bean.PetAllInfoBean
import com.abbidot.tracker.bean.PetBean
import com.abbidot.tracker.bean.RechargeDeviceBean
import com.abbidot.tracker.bean.RechargeHistoryBean
import com.abbidot.tracker.bean.SetMealBean
import com.abbidot.tracker.bean.SleepTimeBean
import com.abbidot.tracker.bean.StripeSubscriptionPriceBean
import com.abbidot.tracker.bean.SubscriptionsOrderBean
import com.abbidot.tracker.bean.UserBean
import com.abbidot.tracker.bean.UserInfoBean
import com.abbidot.tracker.bean.WXPayOrderBean
import com.abbidot.tracker.bean.WiFiZoneListBean
import okhttp3.MultipartBody
import retrofit2.http.Field
import retrofit2.http.FormUrlEncoded
import retrofit2.http.GET
import retrofit2.http.Multipart
import retrofit2.http.POST
import retrofit2.http.Part
import retrofit2.http.Query

interface INetworkService {

    companion object {
        //宠物勋章图片url
        const val BASE_PET_BADGE_URL = "http://162.62.53.38:9998/static/TrackerBadgeImages/"
        private const val IP_SERVER = "https://aws.abbidot.com"
//        private const val IP_SERVER = "https://192.168.0.22"
//        const val BASE_URL = "http://ec2-50-18-65-40.us-west-1.compute.amazonaws.com:8090/abbidot/"
//        const val BASE_URL = "http://ec2-3-101-8-36.us-west-1.compute.amazonaws.com:8090/abbidot/"
//        const val BASE_URL = "http://www.xiaopandev.com:8090/abbidot/"

        //亚马逊服务器(国外ip)
        const val BASE_URL_ABROAD = "https://aws.abbidot.com/abbidot/"
//        const val BASE_URL_ABROAD = "http://192.168.0.220:8080/abbidot/"
//        const val BASE_URL_ABROAD = "$IP_SERVER:8443/abbidotServer/"

        //亚马逊服务器(国内ip)
//        const val BASE_URL_CN = "$IP_SERVER:8443/abbidotServer/"
        const val BASE_URL_CN = BASE_URL_ABROAD

        var BASE_URL = BASE_URL_ABROAD

        const val VERSION_NUMBER = "/v2"
        const val STRIPE_VERSION_NUMBER = "/v2"
        const val SUBSCRIPTIONS_V3 = "/v3"

        //服务器第二路径地址,国内访问(前面加'/'自动覆盖域名后面路径,具体参照retrofit2库用法)
        /*Base URL: http://example.com/
        * Endpoint: https://github.com/square/retrofit/
        * Result: https://github.com/square/retrofit/
        */
//        const val BASE_URL_CN1 = "$SERVER_IP_CN/abbidotServer/"
    }

    /**
     * 获取国家代码号
     */
    @GET("user$VERSION_NUMBER/getCountryCodes")
    suspend fun getCountryCodes(): BaseResponse<MutableList<CountryCodeBean>>

    /**
     * 获取邮箱验证码
     * type验证码类型 1是注册 2是忘记密码
     */
    @FormUrlEncoded
    @POST("user/sendEmail")
    suspend fun getVerificationCode(
        @Field("email") email: String, @Field("type") type: Int
    ): BaseResponse<UserBean>

    /**
     * 验证码验证
     */
    @FormUrlEncoded
    @POST("user/validateCode")
    suspend fun validateCode(
        @Field("email") email: String,
        @Field("emailCode") emailCode: String,
        @Field("type") type: Int
    ): BaseResponse<String>

    /**
     * 用户登陆
     */
    @FormUrlEncoded
    @POST("user/login")
    suspend fun login(
        @Field("email") email: String, @Field("password") password: String
    ): BaseResponse<UserBean>

    /**
     * 注册/创建用户
     */
    @FormUrlEncoded
    @POST("user$VERSION_NUMBER/register")
    suspend fun registerV2(
        @Field("email") email: String,
        @Field("password") password: String,
        @Field("userName") userName: String,
        @Field("countryCode") countryCode: String
    ): BaseResponse<UserBean>

    /**
     * 注册
     */
    @FormUrlEncoded
    @POST("user/register")
    suspend fun register(
        @Field("email") email: String,
        @Field("password") password: String,
        @Field("userName") userName: String
    ): BaseResponse<String>

    /**
     * 获取用户信息
     */
    @GET("user/getUserInfo")
    suspend fun getUserInfo(@Query("userId") userId: String): BaseResponse<UserInfoBean>

    /**
     * 用户注销
     */
    @FormUrlEncoded
    @POST("user/logoff")
    suspend fun logoff(@Field("userId") userId: String): BaseResponse<String>

    /**
     * 图片上传
     */
    @Multipart
    @POST("file/uploadImage")
    suspend fun uploadImage(@Part file: MultipartBody.Part): BaseResponse<String>

    /**
     * 更新用户信息
     */
    @FormUrlEncoded
    @POST("user/updateUser")
    suspend fun updateUser(
        @Field("birthdayDate") birthdayDate: String,
        @Field("email") email: String,
        @Field("gender") gender: Int,
        @Field("id") userId: String,
        @Field("imgurl") imgurl: String,
        @Field("location") location: String,
//        @Field("phone") phone: String,
        @Field("userName") userName: String,
        @Field("countryCode") countryCode: String
    ): BaseResponse<String>

    /**
     * 获取消息列表
     */
    @GET("user/messageList")
    suspend fun getMessageList(
        @Query("userId") userId: String
    ): BaseResponse<MutableList<MessageBean>>

    /**
     * 获取未读消息数量
     */
    @GET("user/getMessageUnReadCount")
    suspend fun getMessageUnReadCount(
        @Query("userId") userId: String
    ): BaseResponse<CommonDataBean>

    /**
     * 获取消息列表(分页显示)
     */
    @GET("user/messageListByPage")
    suspend fun messageListByPage(
        @Query("userId") userId: String, @Query("page") page: Int, @Query("size") size: Int
    ): BaseResponse<MutableList<MessageBean>>

    /**
     *设置单条消息已读
     */
    @FormUrlEncoded
    @POST("user/setMessageIsRead")
    suspend fun setMessageIsRead(@Field("messageId") messageId: String): BaseResponse<String>

    /**
     *设置全部消息已读
     */
    @FormUrlEncoded
    @POST("user/setMessageAllIsRead")
    suspend fun setMessageAllIsRead(@Field("userId") userId: String): BaseResponse<String>

    /**
     *删除消息
     */
    @FormUrlEncoded
    @POST("user/deleteMessage")
    suspend fun deleteMessage(@Field("mesageIds") messageIds: String): BaseResponse<String>

    /**
     *用户意见反馈
     *  type=反馈问题类型 type 1为APP 2为设备 3其它
     */
    @FormUrlEncoded
    @POST("user/feedback")
    suspend fun feedback(
        @Field("type") type: Int,
        @Field("userId") userId: String,
        @Field("content") content: String,
        @Field("imgurls") imgurls: String,
        @Field("email") email: String
    ): BaseResponse<String>

    /**
     *重置密码
     */
    @FormUrlEncoded
    @POST("user/resetPassword")
    suspend fun resetPassword(
        @Field("email") email: String, @Field("password") password: String
    ): BaseResponse<String>

    /**
     *修改单位
     */
    @FormUrlEncoded
    @POST("user/updateMeasurementUnit")
    suspend fun updateMeasureUnit(
        @Field("userId") userId: String, @Field("measurementUnitType") measurementUnit: Int
    ): BaseResponse<String>

    /**
     * 获取蓝牙设备Mac
     */
    @GET("device/getMacId")
    suspend fun getMacId(
        @Query("userId") userId: String, @Query("deviceOutId") deviceOutId: String
    ): BaseResponse<String>

    /**
     * 获取设备iccid
     */
    @GET("device/iccid")
    suspend fun getIccId(
        @Query("deviceOutId") deviceOutId: String
    ): BaseResponse<RechargeDeviceBean>

    /**
     * 获取设备订单状态
     */
    @GET("device/getDeviceOrderStatus")
    suspend fun getDeviceOrderStatus(
        @Query("deviceOutId") deviceOutId: String
    ): BaseResponse<OrderBean>

    /**
     * 上电激活设备，更新状态
     */
    @FormUrlEncoded
    @POST("device/updateStatus")
    suspend fun updateStatus(
        @Field("deviceId") deviceId: String, @Field("addStatus") addStatus: Int//设备添加状态,1 为上电激活成功
    ): BaseResponse<String>

    /**
     * 支付成功后，更新绑定状态
     */
    @FormUrlEncoded
    @POST("device/update/payDeviceSataus")
    suspend fun updatePayDeviceState(
        @Field("deviceId") deviceId: String, @Field("userId") userId: String
    ): BaseResponse<String>

    /**
     * 设备绑定
     */
    @FormUrlEncoded
    @POST("device/bindDevice")
    suspend fun bindDevice(
        @Field("userId") userId: String,
        @Field("deviceOutId") deviceOutId: String,
        @Field("addStatus") addStatus: Int
    ): BaseResponse<DeviceDetailBean>

    /**
     * 解绑删除设备
     */
    @FormUrlEncoded
    @POST("device/unbindDevice")
    suspend fun unbindDevice(
        @Field("userId") userId: String, @Field("deviceId") deviceId: String
    ): BaseResponse<String>

    /**
     * 把Tracker给分配宠物
     */
    @FormUrlEncoded
    @POST("device/assignOtherPetTracker")
    suspend fun assignOtherPetTracker(
        @Field("userId") userId: String,
        @Field("petId") petId: String,
        @Field("originDeviceId") originDeviceId: String,
        @Field("assignDeviceId") assignDeviceId: String
    ): BaseResponse<String>

    /**
     * 给已绑定的设备分配宠物
     */
    @FormUrlEncoded
    @POST("device/assignOtherPet")
    suspend fun assignOtherPet(
        @Field("userId") userId: String,
        @Field("deviceId") deviceId: String,
        @Field("originPetId") originPetId: String,
        @Field("assignPetId") assignPetId: String
    ): BaseResponse<String>

    /**
     * 获取设备列表
     * type=1 是自己的  0是显示授权
     */
    @GET("device/list")
    suspend fun getDeviceList(
        @Query("userId") userId: String, @Query("type") type: Int
    ): BaseResponse<MutableList<DeviceBean>>

    /**
     * 获取未绑定宠物的设备
     */
    @GET("device/getUnboundDevices")
    suspend fun getUnboundDevices(
        @Query("userId") userId: String
    ): BaseResponse<MutableList<DeviceBean>>

    /**
     * 获取设备相关详情
     */
    @GET("device/getPetTrackerInfo")
    suspend fun getPetTrackerInfo(@Query("deviceId") deviceId: String): BaseResponse<MapDeviceBean>

    /**
     * 获取设备详情
     */
    @GET("device/detail")
    suspend fun getDeviceDetail(@Query("deviceId") deviceId: String): BaseResponse<DeviceDetailBean>

    /**
     * 添加圆形围栏
     */
    @FormUrlEncoded
    @POST("device$VERSION_NUMBER/addFence")
    suspend fun addCircleFence(
        @Field("deviceId") deviceId: String,
        @Field("deviceServiceId") deviceServiceId: String,
        @Field("name") name: String,
        @Field("address") address: String,
        @Field("imgurl") imgurl: String,
        @Field("isOn") isOn: Int,
        @Field("radius") radius: Int,
//        @Field("longitude") longitude: Double,
//        @Field("latitude") latitude: Double,
        @Field("fenceType") fenceType: Int,
        @Field("fenceShapeType") fenceShapeType: Int,
        @Field("fenceNameType") fenceNameType: Int,
        @Field("latitudeCenter") latitudeCenter: Double,
        @Field("longitudeCenter") longitudeCenter: Double,
        @Field("ancillaryLatitude") ancillaryLatitude: Double,
        @Field("ancillaryLongitude") ancillaryLongitude: Double,
        @Field("ancillaryOtherLatitude") ancillaryOtherLatitude: Double,
        @Field("ancillaryOtherLongitude") ancillaryOtherLongitude: Double,
        @Field("fenceId") fenceId: String,
        @Field("modeType") modeType: Int
    ): BaseResponse<FencesBean>

    /**
     * 添加矩形围栏
     */
    @FormUrlEncoded
    @POST("device$VERSION_NUMBER/addFence")
    suspend fun addRectFence(
        @Field("deviceId") deviceId: String,
        @Field("deviceServiceId") deviceServiceId: String,
        @Field("name") name: String,
        @Field("address") address: String,
        @Field("imgurl") imgurl: String,
        @Field("isOn") isOn: Int,
//        @Field("radius") radius: Double,
//        @Field("longitude") longitude: Double,
//        @Field("latitude") latitude: Double,
        @Field("fenceType") fenceType: Int,
        @Field("fenceShapeType") fenceShapeType: Int,
        @Field("fenceNameType") fenceNameType: Int,
//        @Field("fenceId") fenceId: String,
        @Field("longitudeA") longitudeA: Double,
        @Field("latitudeA") latitudeA: Double,
        @Field("longitudeB") longitudeB: Double,
        @Field("latitudeB") latitudeB: Double,
        @Field("longitudeC") longitudeC: Double,
        @Field("latitudeC") latitudeC: Double,
        @Field("longitudeD") longitudeD: Double,
        @Field("latitudeD") latitudeD: Double,
        @Field("longitudeCenter") longitudeCenter: Double,
        @Field("latitudeCenter") latitudeCenter: Double,
        @Field("longDistance") longDistance: Int,
        @Field("shortDistance") shortDistance: Int,
        @Field("fenceId") fenceId: String,
        @Field("modeType") modeType: Int
    ): BaseResponse<FencesBean>

    /**
     * 添加矩形围栏
     */
    @FormUrlEncoded
    @POST("device$VERSION_NUMBER/addFence")
    suspend fun addPolygonFence(
        @Field("deviceId") deviceId: String,
        @Field("deviceServiceId") deviceServiceId: String,
        @Field("name") name: String,
        @Field("address") address: String,
        @Field("imgurl") imgurl: String,
        @Field("isOn") isOn: Int,
        @Field("fenceType") fenceType: Int,
        @Field("fenceShapeType") fenceShapeType: Int,
        @Field("fenceNameType") fenceNameType: Int,
        @Field("longitudeA") longitudeA: Double,
        @Field("latitudeA") latitudeA: Double,
        @Field("longitudeB") longitudeB: Double,
        @Field("latitudeB") latitudeB: Double,
        @Field("longitudeC") longitudeC: Double,
        @Field("latitudeC") latitudeC: Double,
        @Field("longitudeD") longitudeD: Double,
        @Field("latitudeD") latitudeD: Double,
        @Field("longitudeE") longitudeE: Double,
        @Field("latitudeE") latitudeE: Double,
        @Field("longitudeF") longitudeF: Double,
        @Field("latitudeF") latitudeF: Double,
        @Field("longitudeCenter") longitudeCenter: Double,
        @Field("latitudeCenter") latitudeCenter: Double,
//        @Field("longDistance") longDistance: Double,
//        @Field("shortDistance") shortDistance: Double
        @Field("fenceId") fenceId: String,
        @Field("modeType") modeType: Int
    ): BaseResponse<FencesBean>

    /**
     * 更新圆形围栏
     */
    @FormUrlEncoded
    @POST("device$VERSION_NUMBER/updateFence")
    suspend fun updateCircleFence(
        @Field("deviceId") deviceId: String,
        @Field("deviceServiceId") deviceServiceId: String,
        @Field("name") name: String,
        @Field("address") address: String,
        @Field("imgurl") imgurl: String,
        @Field("isOn") isOn: Int,
        @Field("radius") radius: Int,
        @Field("longitudeCenter") longitudeCenter: Double,
        @Field("latitudeCenter") latitudeCenter: Double,
        @Field("fenceShapeType") fenceShapeType: Int,
        @Field("fenceType") fenceType: Int,
        @Field("fenceNameType") fenceNameType: Int,
        @Field("fenceId") fenceId: String,
        @Field("ancillaryLatitude") ancillaryLatitude: Double,
        @Field("ancillaryLongitude") ancillaryLongitude: Double,
        @Field("ancillaryOtherLatitude") ancillaryOtherLatitude: Double,
        @Field("ancillaryOtherLongitude") ancillaryOtherLongitude: Double,
        @Field("modeType") modeType: Int
    ): BaseResponse<String>

    /**
     * 更新矩形围栏
     */
    @FormUrlEncoded
    @POST("device$VERSION_NUMBER/updateFence")
    suspend fun updateRectFence(
        @Field("deviceId") deviceId: String,
        @Field("deviceServiceId") deviceServiceId: String,
        @Field("name") name: String,
        @Field("address") address: String,
        @Field("imgurl") imgurl: String,
        @Field("isOn") isOn: Int,
//        @Field("radius") radius: Double,
//        @Field("longitude") longitude: Double,
//        @Field("latitude") latitude: Double,
        @Field("fenceShapeType") fenceShapeType: Int,
        @Field("fenceType") fenceType: Int,
        @Field("fenceNameType") fenceNameType: Int,
        @Field("fenceId") fenceId: String,
        @Field("longitudeA") longitudeA: Double,
        @Field("latitudeA") latitudeA: Double,
        @Field("longitudeB") longitudeB: Double,
        @Field("latitudeB") latitudeB: Double,
        @Field("longitudeC") longitudeC: Double,
        @Field("latitudeC") latitudeC: Double,
        @Field("longitudeD") longitudeD: Double,
        @Field("latitudeD") latitudeD: Double,
        @Field("longitudeCenter") longitudeCenter: Double,
        @Field("latitudeCenter") latitudeCenter: Double,
        @Field("longDistance") longDistance: Int,
        @Field("shortDistance") shortDistance: Int,
        @Field("modeType") modeType: Int
    ): BaseResponse<String>

    /**
     * 更新多边形围栏
     */
    @FormUrlEncoded
    @POST("device$VERSION_NUMBER/updateFence")
    suspend fun updatePolygonFence(
        @Field("deviceId") deviceId: String,
        @Field("deviceServiceId") deviceServiceId: String,
        @Field("fenceId") fenceId: String,
        @Field("name") name: String,
        @Field("address") address: String,
        @Field("imgurl") imgurl: String,
        @Field("isOn") isOn: Int,
        @Field("fenceType") fenceType: Int,
        @Field("fenceShapeType") fenceShapeType: Int,
        @Field("fenceNameType") fenceNameType: Int,
        @Field("longitudeA") longitudeA: Double,
        @Field("latitudeA") latitudeA: Double,
        @Field("longitudeB") longitudeB: Double,
        @Field("latitudeB") latitudeB: Double,
        @Field("longitudeC") longitudeC: Double,
        @Field("latitudeC") latitudeC: Double,
        @Field("longitudeD") longitudeD: Double,
        @Field("latitudeD") latitudeD: Double,
        @Field("longitudeE") longitudeE: Double,
        @Field("latitudeE") latitudeE: Double,
        @Field("longitudeF") longitudeF: Double,
        @Field("latitudeF") latitudeF: Double,
        @Field("longitudeCenter") longitudeCenter: Double,
        @Field("latitudeCenter") latitudeCenter: Double,
        @Field("modeType") modeType: Int
    ): BaseResponse<String>

    /**
     * 获取围栏列表
     */
    @GET("device$VERSION_NUMBER/getFenceList")
    suspend fun getFenceList(
        @Query("deviceId") deviceId: String
    ): BaseResponse<GetFencesBean>

    /**
     * 移除围栏
     */
    @FormUrlEncoded
    @POST("device/removeFence")
    suspend fun removeFence(
        @Field("fenceId") fenceId: String,
        @Field("deviceServiceId") deviceServiceId: String,
        @Field("modeType") modeType: Int
    ): BaseResponse<String>

    /**
     * 获取wifi区域列表
     */
    @GET("wifiZone/getWifiZonelist")
    suspend fun getWifiZoneList(
        @Query("deviceId") deviceId: String
    ): BaseResponse<WiFiZoneListBean>

    /**
     * 添加wifi区域
     */
    @FormUrlEncoded
    @POST("wifiZone/addWifiZone")
    suspend fun addWifiZone(
        @Field("deviceId") deviceId: String,
        @Field("wifiZoneName") wifiZoneName: String,
        @Field("address") address: String,
        @Field("wifiMac") wifiMac: String,
        @Field("wifiName") wifiName: String,
        @Field("longitude") longitude: Double,
        @Field("latitude") latitude: Double,
        @Field("wifiPass") wifiPass: String,
        @Field("wifiAuth") wifiAuth: Int,
        @Field("type") type: Int
    ): BaseResponse<String>

    /**
     * 更新wifi区域
     */
    @FormUrlEncoded
    @POST("wifiZone/updateWifiZone")
    suspend fun updateWifiZone(
        @Field("wifiZoneId") wifiZoneId: String,
        @Field("deviceId") deviceId: String,
        @Field("wifiZoneName") wifiZoneName: String,
        @Field("address") address: String,
        @Field("wifiMac") wifiMac: String,
        @Field("wifiName") wifiName: String,
        @Field("longitude") longitude: Double,
        @Field("latitude") latitude: Double,
        @Field("type") type: Int
    ): BaseResponse<String>

    /**
     * 删除wifi区域
     */
    @FormUrlEncoded
    @POST("wifiZone/removeWifiZone")
    suspend fun removeWifiZone(
        @Field("wifiZoneId") wifiZoneId: String,
    ): BaseResponse<String>

    /**
     * 获取所有的宠物列表
     */
    @GET("pet/petList")
    suspend fun getPetList(
        @Query("userId") userId: String, @Query("type") type: Int
    ): BaseResponse<MutableList<PetBean>>

    /**
     * 获取未绑定的宠物列表
     */
    @GET("pet/unbindPetList")
    suspend fun getUnbindPetList(
        @Query(
            "userId"
        ) userId: String
    ): BaseResponse<MutableList<PetBean>>

    /**
     * 获取首页宠物列表
     */
    @GET("pet/bindPetList")
    suspend fun getHomeBindPetList(
        @Query(
            "userId"
        ) userId: String
    ): BaseResponse<MutableList<PetBean>>

    /**
     * 获取宠物标签
     */
    @GET("pet/labels")
    suspend fun getPetLabels(): BaseResponse<MutableList<String>>

    /**
     * 添加宠物
     */
    @FormUrlEncoded
    @POST("pet/addPet")
    suspend fun addPet(
        @Field("userId") userId: String,
        @Field("petName") petName: String,
        @Field("breed") breed: String,
        @Field("gender") gender: Int,
        @Field("petType") petType: Int,
        @Field("birthdayDate") birthdayDate: String,
        @Field("imgurl") imgurl: String,
        @Field("weight") weight: Float,
        @Field("height") height: Float,
        @Field("labels") labels: String
    ): BaseResponse<PetBean>

    /**
     * 更新宠物信息
     */
    @FormUrlEncoded
    @POST("pet/updatePetInfo")
    suspend fun updatePetInfo(
        @Field("userId") userId: String,
        @Field("petName") petName: String,
        @Field("breed") breed: String,
        @Field("gender") gender: Int,
        @Field("petType") petType: Int,
        @Field("birthdayDate") birthdayDate: String,
        @Field("petId") petId: String,
        @Field("imgurl") imgurl: String,
        @Field("weight") weight: Float,
        @Field("height") height: Float,
        @Field("labels") labels: String
    ): BaseResponse<String>

    /**
     * 解绑宠物
     */
    @FormUrlEncoded
    @POST("pet/unbindPet")
    suspend fun unbindPet(
        @Field("userId") userId: String,
        @Field("deviceId") deviceId: String,
        @Field("petId") petId: String
    ): BaseResponse<String>

    /**
     * 绑定关联宠物
     */
    @FormUrlEncoded
    @POST("pet/bindPet")
    suspend fun bindPet(
        @Field("userId") userId: String,
        @Field("deviceId") deviceId: String,
        @Field("petId") petId: String
    ): BaseResponse<String>

    /**
     * 获取宠物所有信息
     */
    @GET("pet/getPetAllInfo")
    suspend fun getPetAllInfo(@Query("petId") petId: String): BaseResponse<PetAllInfoBean>

    /**
     * 获取宠物信息
     */
    @GET("pet/getPetInfo")
    suspend fun getPetInfo(@Query("petId") petId: String): BaseResponse<PetBean>

    /**
     *获取宠物活动统计
     */
    @GET("pet/getPetActivityDetailInfo")
    suspend fun getPetActivityDetailInfo(
        @Query("petId") petId: String, @Query("deviceId") deviceId: String
    ): BaseResponse<ActiveTimeBean>

    /**
     * 删除宠物
     */
    @FormUrlEncoded
    @POST("pet/deletePet")
    suspend fun deletePet(
        @Field("userId") userId: String, @Field("petId") petId: String
    ): BaseResponse<String>

    /**
     * 获取设备家庭列表
     */
    @GET("device/getFamilies")
    suspend fun getFamilies(@Query("deviceId") deviceId: String): BaseResponse<FamilyPetBean>

    /**
     * 获取设备邀请信息
     */
    @GET("device/getDeviceInviteInfo")
    suspend fun getDeviceInviteInfo(@Query("email") email: String): BaseResponse<InviteInfoBean>

    /**
     * 设备邀请
     */
    @FormUrlEncoded
    @POST("device/invite")
    suspend fun invite(
        @Field("userId") userId: String,
        @Field("userName") userName: String,
        @Field("sendEmail") sendEmail: String,
        @Field("deviceId") deviceId: String,
        @Field("acceptEmail") acceptEmail: String,
        @Field("relation") relation: Int,//关系 1 Family 2 friend 3 love 4 colleague
        @Field("avatar") avatar: Int,//头像 1 男生 2 女生 3 未知
        @Field("petId") petId: String,
        @Field("petName") petName: String
    ): BaseResponse<String>

    /**
     * 国内设备邀请
     */
    @FormUrlEncoded
    @POST("device/invite")
    suspend fun inviteCN(
        @Field("userId") userId: String,
        @Field("userName") userName: String,
        @Field("deviceId") deviceId: String,
        @Field("acceptEmail") phone: String
    ): BaseResponse<String>

    /**
     * 删除家庭账户
     */
    @GET("device/removeFamily")
    suspend fun removeFamily(@Query("familyId") familyId: String): BaseResponse<String>

    /**
     * 获取首页Data模块的设备数据
     */
    @GET("data/getDeviceData")
    suspend fun getDeviceData(
        @Query("deviceId") deviceId: String,
        @Query("dayTime") dayTime: String,
        @Query("petId") petId: String
    ): BaseResponse<HomeDataBean>

    /**
     * 获取ActiveTime数据
     */
    @GET("data/getActiveTimeByDay")
    suspend fun getActiveTimeByDay(
        @Query("deviceId") deviceId: String,
        @Query("dayTime") dayTime: String,
        @Query("petId") petId: String
    ): BaseResponse<ActiveTimeBean>

    /**
     * 获取SleepTime数据
     */
    @GET("data/getSleepTimeByDay")
    suspend fun getSleepTimeByDay(
        @Query("deviceId") deviceId: String,
        @Query("dayTime") dayTime: String,
        @Query("petId") petId: String
    ): BaseResponse<SleepTimeBean>

    /**
     * 获取HistoryByDay数据
     */
    @GET("data/getHistoryByDay")
    suspend fun getHistoryByDay(
        @Query("deviceId") deviceId: String,
        @Query("fromTime") fromTime: Long,
        @Query("toTime") toTime: Long
    ): BaseResponse<MutableList<HistoryDataBean>>

    /**
     * 获取设备进出围栏历史数据
     */
    @GET("data/getHistoryInOutFenceList")
    suspend fun getHistoryFenceList(
        @Query("deviceId") deviceId: String,
        @Query("beginTimeStamp") fromTime: Long,
        @Query("endTimeStamp") toTime: Long
    ): BaseResponse<MutableList<MessageBean>>

    /**
     * 设置运动目标
     */
    @FormUrlEncoded
    @POST("data/goal")
    suspend fun setGoal(
        @Field("deviceId") deviceId: String, @Field("goalTime") goalTime: Int
    ): BaseResponse<String>

    /**
     * 获取地图模块的设备数据
     */
    @GET("map/deviceStatus")
    suspend fun getMapDeviceStatus(@Query("deviceId") deviceId: String): BaseResponse<MapDeviceBean>

    /**
     * 打开关闭直播
     */
    @GET("map/setupDeviceLiveStatus")
    suspend fun setupDeviceLiveStatus(
        @Query("deviceId") deviceId: String,
        @Query("liveState") liveState: Int,
        @Query("sendState") sendState: Int,
        @Query("modeType") modeType: Int,
    ): BaseResponse<String>

    /**
     * 直播宠物轨迹
     */
    @GET("map/getPetLivePoint")
    suspend fun getPetLivePoint(
        @Query("deviceId") deviceId: String, @Query("timeStamp") timeStamp: Long
    ): BaseResponse<LiveDataBean>

    /**
     * 获取所有设备的e-sim卡
     */
    @GET("order/getCards")
    suspend fun getCards(
        @Query(
            "userId"
        ) userId: String
    ): BaseResponse<MutableList<RechargeDeviceBean>>

    /**
     * 获取设备的充值记录
     */
    @GET("order/getRechargeHistory")
    suspend fun getRechargeHistory(
        @Query(
            "deviceId"
        ) deviceId: String
    ): BaseResponse<MutableList<RechargeHistoryBean>>

    /**
     * 取消自动续费/自动订阅
     */
    @FormUrlEncoded
    @POST("order/cancelSubscription")
    suspend fun cancelSubscriptions(
        @Field("orderId") orderId: String,
        @Field("payType") payType: Int,
        @Field("subscriptionId") subscriptionId: String
    ): BaseResponse<String>

    /**
     * 自动续费,自动订阅
     */
    @FormUrlEncoded
    @POST("order/subscription")
    suspend fun subscription(
        @Field("feePackage") feePackage: String,
        @Field("deviceId") deviceId: String,
        @Field("accountFee") accountFee: String,
        @Field("subscriptionFee") subscriptionFee: String,
        @Field("period") period: String,
        @Field("userId") userId: String,
        @Field("username") username: String
    ): BaseResponse<PayResultBean>

    /**
     * 获取套餐列表
     */
    @GET("order/setmeal")
    suspend fun getSetMealList(): BaseResponse<MutableList<SetMealBean>>

    /**
     * 获取订单号
     */
    @GET("order/getPaypalOrderNo")
    suspend fun getPaypalOrderNo(
        @Query("mealName") mealName: String,
        @Query("description") description: String,
        @Query("totalCost") totalCost: String,
        @Query("deviceId") deviceId: String
    ): BaseResponse<OrderBean>

    /**
     * 信用卡发起支付
     */
    @FormUrlEncoded
    @POST("order/payment")
    suspend fun cardPayment(
        @Field("mealName") mealName: String,
        @Field("mealDays") mealDays: Int,
        @Field("totalCost") totalCost: String,
        @Field("paymentMethodNonce") paymentMethodNonce: String,
        @Field("deviceId") deviceId: String
    ): BaseResponse<String>

    /**
     * 信用卡自动订阅
     */
    @FormUrlEncoded
    @POST("creditCard/creditCardSubscription")
    suspend fun cardSubscription(
        @Field("userId") userId: String,
        @Field("paymentMethodNonce") paymentMethodNonce: String,
        @Field("firstName") firstName: String,
        @Field("lastName") lastName: String,
        @Field("feePackage") feePackage: String,
        @Field("deviceId") deviceId: String,
        @Field("accountFee") accountFee: Double,
        @Field("period") period: Float,
        @Field("username") username: String,
        @Field("planId") planId: String
    ): BaseResponse<String>

    /**
     * 更新订单状态
     * @param orderStatus:0待支付 1是支付成功 2是取消支付/失败
     */
    @FormUrlEncoded
    @POST("order/updateOrderStatus")
    suspend fun updateOrderStatus(
        @Field("orderId") orderId: String,
        @Field("orderStatus") orderStatus: Int,
        @Field("deviceId") deviceId: String,
        @Field("mealDays") mealDays: Int
    ): BaseResponse<String>

    /**
     * 获取braintree客户端令牌
     */
    @GET("order/getClientToken")
    suspend fun getBraintreeClientToken(): BaseResponse<PayResultBean>

    /**
     * 关闭设备
     */
    @FormUrlEncoded
    @POST("device/turnoff")
    suspend fun turnoff(
        @Field("deviceInfoId") deviceInfoId: String,
        @Field("turnOff") turnOff: Int,
        @Field("modeType") modeType: Int
    ): BaseResponse<String>

    /**
     * 设置设备上报下发时间
     */
    @FormUrlEncoded
    @POST("device/gnssInterval")
    suspend fun reportInterval(
        @Field("deviceInfoId") deviceInfoId: String,
        @Field("gnssInterval") gnssInterval: Int,
        @Field("modeType") modeType: Int
    ): BaseResponse<String>

    /**
     * 设置设备的直播时间
     */
    @FormUrlEncoded
    @POST("device/setLiveTime")
    suspend fun setLiveTime(
        @Field("deviceId") deviceId: String, @Field("liveTime") liveTime: Int
    ): BaseResponse<String>

    /**
     * 设置ledSwitch开关
     */
    @FormUrlEncoded
    @POST("device/ledSwitch")
    suspend fun setLedSwitch(
        @Field("deviceInfoId") deviceInfoId: String,
        @Field("ledSwitch") ledSwitch: Int,
        @Field("modeType") modeType: Int
    ): BaseResponse<String>

    /**
     * 设置light灯光
     */
    @FormUrlEncoded
    @POST("device/ledLignt")
    suspend fun setLedLight(
        @Field("deviceInfoId") deviceInfoId: String,
        @Field("red") red: Int,
        @Field("green") green: Int,
        @Field("blue") blue: Int,
        @Field("lightMode") lightMode: Int,
        @Field("ledSwitch") ledSwitch: Int,
        @Field("modeType") modeType: Int
    ): BaseResponse<String>

    /**
     * 获取固件信息
     */
    @GET("device/getFirmware")
    suspend fun getFirmware(@Query("deviceName") deviceName: String): BaseResponse<FirmwareBean>


    /**
     * 获取sim卡餐列表
     */
    @GET("pay$STRIPE_VERSION_NUMBER/meals")
    suspend fun getSimSetMealList(
        @Query("deviceCode") deviceCode: String, @Query("partnerCode") partnerCode: String
    ): BaseResponse<LKSimListBean>

    /**
     * 获取Stripe支付凭证
     */
    @GET("pay$STRIPE_VERSION_NUMBER/payments")
    suspend fun getStripePayOrder(
        @Query("amount") amount: String,
        @Query("userId") userId: String,
        @Query("feePackage") feePackage: String,
        @Query("deviceId") deviceId: String,
        @Query("username") username: String,
        @Query("cost") cost: String,
        @Query("priceId") priceId: String,
        @Query("partnerCode") partnerCode: String,
        @Query("packageCode") packageCode: String,
        @Query("servicePlanCode") servicePlanCode: String,
        @Query("orderPeriod") orderPeriod: String,
        @Query("servicePlanShowName") servicePlanShowName: String,
        @Query("deviceCode") deviceCode: String,
        @Query("autoRenewal") autoRenewal: String
    ): BaseResponse<String>

    /**
     * Stripe支付创建消费用户
     */
    @FormUrlEncoded
    @POST("pay$STRIPE_VERSION_NUMBER/createCustomer")
    suspend fun createCustomer(
        @Field("parms") param: String,
        @Field("userId") userId: String,
        @Field("userName") userName: String,
        @Field("email") email: String
    ): BaseResponse<StripeSubscriptionPriceBean>

    /**
     * Stripe支付创建订阅
     */
    @FormUrlEncoded
    @POST("pay$STRIPE_VERSION_NUMBER/createSubscription")
    suspend fun createSubscription(
        @Field("userId") userId: String,
        @Field("feePackage") feePackage: String,
        @Field("deviceId") deviceId: String,
        @Field("username") username: String,
        @Field("cost") cost: String,
        @Field("priceId") priceId: String,
        @Field("customerId") customerId: String,
        @Field("amount") amount: String,
        @Field("partnerCode") partnerCode: String,
        @Field("packageCode") packageCode: String,
        @Field("servicePlanCode") servicePlanCode: String,
        @Field("orderPeriod") orderPeriod: String,
        @Field("servicePlanShowName") servicePlanShowName: String,
        @Field("deviceCode") deviceCode: String,
        @Field("autoRenewal") autoRenewal: String
    ): BaseResponse<String>

    /**
     * Stripe支付取消订阅
     */
    @FormUrlEncoded
    @POST("pay$STRIPE_VERSION_NUMBER/cancelSubscription")
    suspend fun cancelStripeSubscription(
        @Field("orderId") orderId: String,
        @Field("subscriptionId") subscriptionId: String,
        @Field("iccid") iccid: String
    ): BaseResponse<String>

    /**
     * Stripe支付 Rsa算法解密测试
     */
    @FormUrlEncoded
    @POST("pay$STRIPE_VERSION_NUMBER/rsaDigisteTest")
    suspend fun rsaDecodeTest(
        @Field("encryptedData") encryptedData: String
    ): BaseResponse<String>
    /*******************************************以下是国内版本接口***********************************/
    /**
     * 获取微信登录的OpedId
     */
//    @Headers("${CommonRequestInterceptor.HEADERS_NAME}:${CommonRequestInterceptor.HEADERS_value}")
//    @GET("oauth2/access_token")
//    suspend fun getWXOpedId(@Query("appid") appid: String,
//                            @Query("secret") secret: String,
//                            @Query("code") code: String,
//                            @Query("grant_type") grant_type: String): BaseResponse<String>

    /**
     * 微信登录
     */
    @GET("user/wxLogin")
    suspend fun wxLogin(@Query("code") code: String): BaseResponse<UserBean>

    /**
     * 微信绑定
     */
    @FormUrlEncoded
    @POST("user/weixinBind")
    suspend fun wxBind(
        @Field("phone") phone: String,
        @Field("verificationCode") verificationCode: String,
        @Field("wxId") wxId: String
    ): BaseResponse<UserBean>

    /**
     * 发送验证码
     */
    @GET("user/sendCode")
    suspend fun sendCode(
        @Query("phone") phone: String,
        //发送类型 1是验证码登录 2微信绑定 3注册 4忘记密码
        @Query("type") type: Int
    ): BaseResponse<String>

    /**
     * 验证码登录
     */
    @FormUrlEncoded
    @POST("user/phoneLogin")
    suspend fun phoneLogin(
        @Field("phone") phone: String, @Field("verificationCode") verificationCode: String
    ): BaseResponse<UserBean>

    /**
     * 手机号验证码验证
     */
    @FormUrlEncoded
    @POST("user/validateCode")
    suspend fun validatePhoneCode(
        @Field("phone") phone: String, @Field("code") code: String,
        //验证码类型 1是注册 2是忘记密码
        @Field("type") type: Int
    ): BaseResponse<String>

    /**
     * 账号密码登录
     */
    @FormUrlEncoded
    @POST("user/accountPasswordLogin")
    suspend fun accountPasswordLogin(
        @Field("phone") phone: String, @Field("password") password: String
    ): BaseResponse<UserBean>

    /**
     * 用户注册
     */
    @FormUrlEncoded
    @POST("user/register")
    suspend fun register(
        @Field("phone") phone: String, @Field("password") password: String
    ): BaseResponse<String>

    /**
     * 重置密码
     */
    @FormUrlEncoded
    @POST("user/resetPassword")
    suspend fun resetNewPassword(
        @Field("phone") phone: String, @Field("password") password: String
    ): BaseResponse<String>

    /**
     * 获取微信支付Prepay_id
     */
    @FormUrlEncoded
    @POST("order/getWxPayOrder")
    suspend fun getWxPayOrder(
        @Field("feePackage") feePackage: String,
        @Field("deviceId") deviceId: String,
        @Field("payFee") payFee: Double,
        @Field("period") period: Float,
        @Field("userId") userId: String,
        @Field("username") username: String
    ): BaseResponse<WXPayOrderBean>

    /**
     * 获取支付宝支付订单
     */
    @FormUrlEncoded
    @POST("order/getAlipayOrder")
    suspend fun getAlipayOrder(
        @Field("feePackage") feePackage: String,
        @Field("deviceId") deviceId: String,
        @Field("payFee") payFee: Double,
        @Field("period") period: Float,
        @Field("userId") userId: String,
        @Field("username") username: String
    ): BaseResponse<AlipayOrderBean>


    /**
     * 获取订阅订单列表
     */
    @GET("order$SUBSCRIPTIONS_V3/subscriptions/order/list")
    suspend fun getSubscriptionsOrder(
        @Query("userId") userId: String
    ): BaseResponse<MutableList<SubscriptionsOrderBean>>

    /**
     * 获取套餐计划类型
     */
    @GET("order$SUBSCRIPTIONS_V3/subscriptions/plan/types")
    suspend fun getPackageType(): BaseResponse<MutableList<PackageTypeBean>>

    /**
     * 获取套餐列表
     */
    @GET("order$SUBSCRIPTIONS_V3/plan/list")
    suspend fun getPackageList(
        @Query("planTypeName") planTypeName: String
    ): BaseResponse<MutableList<PackageBean>>

    /**
     * 获取设备充值得的历史记录
     */
    @GET("order$SUBSCRIPTIONS_V3/subscriptions/history")
    suspend fun getSubscriptionsHistory(
        @Query("userId") userId: String, @Query("deviceId") deviceId: String
    ): BaseResponse<MutableList<SubscriptionsOrderBean>>

    /**
     * 获取设备充值得的历史记录(包括自动续订)
     */
    @GET("order$SUBSCRIPTIONS_V3/subscriptions/historyIncludRenew")
    suspend fun getHistoryIncludeRenew(
        @Query("subscriptionId") subscriptionId: String
    ): BaseResponse<MutableList<SubscriptionsOrderBean>>

    /**
     * 提交退款申请
     */
    @FormUrlEncoded
    @POST("order$SUBSCRIPTIONS_V3/refund/commit")
    suspend fun commitRefund(
        @Field("currency_code") currencyCode: String,
        @Field("orderNum") orderNum: String,
        @Field("chargeId") chargeId: String,
        @Field("amount") amount: Int,
        @Field("subscriptionId") subscriptionId: String,
        @Field("planName") planName: String,
        @Field("refundDescription") refundDescription: String,
        @Field("deviceId") deviceId: String,
        @Field("deviceOutId") deviceOutId: String,
        @Field("payType") payType: Int
    ): BaseResponse<OrderBean>

    /**
     * 退款
     */
    @FormUrlEncoded
    @POST("order$SUBSCRIPTIONS_V3/refund")
    suspend fun refund(
        @Field("orderNum") orderNum: String
    ): BaseResponse<String>

    /**
     * 更新订阅状态
     */
    @FormUrlEncoded
    @POST("order$SUBSCRIPTIONS_V3/updateScriptionStatus")
    suspend fun updateSubscriptionStatus(
        @Field("subscriptionId") subscriptionId: String, @Field("status") status: Int
    ): BaseResponse<String>

    /**
     * 获取SIM卡重新激活费用
     */
    @GET("order$SUBSCRIPTIONS_V3/reactivation/fee")
    suspend fun getReactivationFee(
        @Query("orderId") orderId: String
    ): BaseResponse<CommonDataBean>

    /**
     * 获取具体国家地区税率
     */
    @GET("order$SUBSCRIPTIONS_V3/plan/getTaxRateByRegionName")
    suspend fun getTaxRateByRegionName(
        @Query("countryCode") countryCode: String, @Query("regionName") regionName: String
    ): BaseResponse<CommonDataBean>

    /**
     * 创建Stripe订单发起支付
     */
    @FormUrlEncoded
    @POST("order$SUBSCRIPTIONS_V3/stripe/createOrderInfo")
    suspend fun createStripeOrder(
        @Field("userId") userId: String,
        @Field("deviceId") deviceId: String,
        @Field("payMethod") payMethod: Int,
        @Field("iccid") iccid: String,
        @Field("deviceOutId") deviceOutId: String,
        @Field("username") username: String,
        @Field("mealName") mealName: String,
        @Field("mealDesc") mealDesc: String,
        @Field("mealId") mealId: String,
        @Field("mealPeriod") mealPeriod: Int,
        @Field("mealPrice") mealPrice: Double,
        @Field("mealDiscountPrice") mealDiscountPrice: Double,
        @Field("mealUnit") mealUnit: String,
        @Field("annualCareType") annualCareType: Int,
        @Field("annualCarePrice") annualCarePrice: Double,
//        @Field("couponCode") couponCode: String,
        @Field("reactivation") reactivation: Int,
        @Field("reactivatePrice") reactivatePrice: Double,
        @Field("totalAmountWithTax") totalAmountWithTax: Double,
        @Field("planCategory") planCategory: String,
//        @Field("couponPrice") couponPrice: Double,
        @Field("autoRenewPrice") autoRenewPrice: Double,
//        @Field("useCoupon") useCoupon: Int,
        @Field("tax") tax: Double,
        @Field("customerId") customerId: String,
        @Field("orderNum") orderNum: String,
        @Field("isUpdateOrder") isUpdateOrder: Int,
        @Field("planTimeMonthsCount") planTimeMonthsCount: Int,
        @Field("subscriptionId") subscriptionId: String
    ): BaseResponse<PayResultBean>

    /**
     * 创建Paypal订单发起支付
     */
    @FormUrlEncoded
    @POST("order$SUBSCRIPTIONS_V3/paypal/createOrderInfo")
    suspend fun createPaypalOrder(
        @Field("userId") userId: String,
        @Field("deviceId") deviceId: String,
        @Field("payMethod") payMethod: Int,
        @Field("iccid") iccid: String,
        @Field("deviceOutId") deviceOutId: String,
        @Field("username") username: String,
        @Field("mealName") mealName: String,
        @Field("mealDesc") mealDesc: String,
        @Field("mealId") mealId: String,
        @Field("mealPeriod") mealPeriod: Int,
        @Field("mealPrice") mealPrice: Double,
        @Field("mealDiscountPrice") mealDiscountPrice: Double,
        @Field("mealUnit") mealUnit: String,
        @Field("annualCareType") annualCareType: Int,
        @Field("annualCarePrice") annualCarePrice: Double,
//        @Field("couponCode") couponCode: String,
        @Field("reactivation") reactivation: Int,
        @Field("reactivatePrice") reactivatePrice: Double,
        @Field("totalAmountWithTax") totalAmountWithTax: Double,
        @Field("planCategory") planCategory: String,
        @Field("autoRenewPrice") autoRenewPrice: Double,
//        @Field("couponPrice") couponPrice: Double,
//        @Field("useCoupon") useCoupon: Int,
        @Field("tax") tax: Double,
        @Field("customerId") customerId: String,
        @Field("orderNum") orderNum: String,
        @Field("isUpdateOrder") isUpdateOrder: Int,
        @Field("planTimeMonthsCount") planTimeMonthsCount: Int,
        @Field("subscriptionId") subscriptionId: String
    ): BaseResponse<PayResultBean>

    /**
     * 获取通知设置
     */
    @GET("user$VERSION_NUMBER/notification/getSettings")
    suspend fun getNotificationSet(
        @Query("userId") userId: String
    ): BaseResponse<MutableList<NotificationBean>>

    /**
     * 消息通知设置
     */
    @FormUrlEncoded
    @POST("user$VERSION_NUMBER/notification/setting")
    suspend fun setNotification(
        @Field("userId") userId: String,
        @Field("notificationType") notificationType: Int,
        @Field("status") status: Int
    ): BaseResponse<String>


    /**
     * 设备日志上传
     */
    @Multipart
    @POST("file/uploadLog")
    suspend fun uploadLog(@Part file: MultipartBody.Part): BaseResponse<String>

    /**
     * 上传设备日志
     */
    @FormUrlEncoded
    @POST("device/uploadDeviceLog")
    suspend fun uploadDeviceLog(
        @Field("deviceOutId") deviceOutId: String,
        @Field("uploadTime") uploadTime: String,
        @Field("macID") macID: String,
        @Field("logFileUrl") logFileUrl: String
    ): BaseResponse<String>

    /**
     * 设备一键定位
     */
    @FormUrlEncoded
    @POST("map/setupRefreshLocation")
    suspend fun setupRefreshLocation(@Field("deviceId") deviceId: String): BaseResponse<String>
}