package com.jishisongfu.duobibi.data.api

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import okhttp3.MultipartBody
import okhttp3.RequestBody
import retrofit2.http.Multipart
import retrofit2.http.POST
import retrofit2.http.Part

/**
 * OCR 截图记账 API。
 *
 * 后端复用 iOS 端已有 `POST /api/v1/parse-image`(`duobibi-server/app/api/parse_image.py`),
 * cluster_id 为字符串(为兼容 iOS UUID)。Android 端用 Long,客户端发送时 `id.toString()`,
 * 接收时 `String.toLongOrNull()` 转回。
 *
 * 请求是 multipart/form-data:
 *   - image: 截图字节(JPEG,客户端已压短边 1024,< 5MB)
 *   - clusters: JSON 字符串 [{"id":"<str>","title":"..."}, ...]
 *   - package_name: Android 端不传(图片本身不带 packageName 上下文,后端从图片识别 source_app)
 */
interface OcrApi {

    @Multipart
    @POST("api/v1/parse-image")
    suspend fun parseImage(
        @Part image: MultipartBody.Part,
        @Part("clusters") clusters: RequestBody,
    ): ParseImageResponse
}

/**
 * 后端 ParseStrResponse 的客户端镜像。cluster_id 是字符串(后端为兼容 iOS UUID 设计)。
 */
@Serializable
data class ParseImageResponse(
    val title: String,
    val price: Double,
    @SerialName("source_app") val sourceApp: String,
    @SerialName("cluster_id") val clusterIdStr: String? = null,
    @SerialName("typical_price") val typicalPrice: Double,
)

/**
 * OCR multipart 请求里 `clusters` 字段用的 DTO。后端 `ClusterDtoStr` 期望 `id` 是字符串
 * (iOS UUID),Android 端把 Long id `toString()` 装进来,响应端再 `toLongOrNull()` 转回。
 */
@Serializable
data class ClusterDtoStr(
    val id: String,
    val title: String,
)
