// Package protocol 定义客户端 ↔ 后端的通信契约，是 5 端（server/desktop/android/ios/web）
// 对齐的唯一真相源。设计依据 doc/backend-architecture.html 第四章。
package protocol

// 音频参数：二进制帧为 16kHz / 16bit / mono PCM，每 100ms 一帧。
const (
	SampleRate  = 16000
	FrameMillis = 100
	FrameBytes  = SampleRate * 2 * FrameMillis / 1000 // 3200

	// MaxSessionSeconds 单会话上限，到点服务端自动截断定稿（SESSION_LIMIT）。
	MaxSessionSeconds = 180

	// 设备维度 30 分钟滑动窗口限制。
	RateWindowSeconds      = 30 * 60
	RateMaxSessions        = 30
	RateMaxAudioSeconds    = 30 * 60
	MaxConcurrentPerDevice = 1

	// TrialDailySeconds 每日免费试用时长（秒）。
	TrialDailySeconds = 180
)

// 上行文本帧类型。
const (
	MsgStart  = "start"
	MsgStop   = "stop"
	MsgCancel = "cancel"
)

// 下行文本帧类型。
const (
	MsgPartial = "partial"
	MsgFinal   = "final"
	MsgUsage   = "usage"
	MsgError   = "error"
)

// ClientMsg 客户端上行控制消息（文本帧）。音频走二进制帧。
type ClientMsg struct {
	Type       string `json:"type"` // start | stop | cancel
	SessionID  string `json:"session_id"`
	SampleRate int    `json:"sample_rate,omitempty"` // start 必填，当前仅支持 16000
	Format     string `json:"format,omitempty"`      // start 必填，当前仅支持 pcm16
}

// ServerMsg 服务端下行消息（文本帧）。
type ServerMsg struct {
	Type      string `json:"type"` // partial | final | usage | error
	SessionID string `json:"session_id,omitempty"`

	// partial / final
	Text string `json:"text,omitempty"`

	// usage：识别中每 2s 及 stop 后下发，驱动 UI 实时刷新余额。
	// 去 omitempty（16G）：0 是合法值（扣穿 / 试用用尽），客户端须能区分
	// "未下发"与"为 0"。partial/final 帧亦会带这三个 0 字段，客户端以 type 分发，无碍。
	SessionSeconds int   `json:"session_seconds"`
	BalanceSeconds int64 `json:"balance_seconds"`
	TrialRemaining int   `json:"trial_remaining"`

	// error
	Code    string `json:"code,omitempty"`
	Message string `json:"message,omitempty"`
}
