package com.ttstd.controlled.network;

import com.google.gson.JsonObject;
import com.ttstd.controlled.network.model.PairingCodeResponse;
import com.ttstd.controlled.network.model.ProvisionRequest;
import com.ttstd.controlled.network.model.ProvisionResponse;
import com.ttstd.controlled.network.model.TokenRequest;
import com.ttstd.controlled.network.model.TokenResponse;

import io.reactivex.rxjava3.core.Single;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.POST;

/**
 * 被控端设备侧接口（Retrofit 声明式定义）。
 *
 * 全部返回 RxJava3 的 {@link Single}，由调用方 compose 生命周期绑定，
 * 从而在 Activity/Service 销毁时自动取消请求，不再使用裸 new Thread。
 */
public interface DeviceApi {

    /**
     * 激活第一步：用出厂 SN + HMAC 签名证明设备身份，换取 deviceUid 与一次性 deviceSecret。
     */
    @POST("/api/device/provision")
    Single<ProvisionResponse> provision(@Body ProvisionRequest request);

    /**
     * 激活第二步：用 deviceUid + deviceSecret 换取 accessToken（WebSocket Bearer 握手使用）。
     */
    @POST("/api/device/token")
    Single<TokenResponse> token(@Body TokenRequest request);

    /**
     * 拉取 TURN 短期凭证（iceServers）。服务端未开启时可能返回错误，调用方需自行降级。
     */
    @GET("/api/client/turn-credentials")
    Single<JsonObject> turnCredentials(@Header("Authorization") String bearerToken);

    /**
     * 生成一次性配对码，供其他用户（控制端）兑换绑定。需携带设备令牌。
     */
    @POST("/api/client/device/pairing-code")
    Single<PairingCodeResponse> pairingCode(@Header("Authorization") String bearerToken);
}
