#pragma once
#include <cstdint>
#include <cstring>
#include <vector>
#include <algorithm>

namespace wearable {
// END 写入 socket 不代表网关已接收；只有匹配会话和连接代次的终态确认可释放 PCM。
inline bool voice_terminal_ack(const char *type, const char *state) {
    return type && state && std::strcmp(type,"voice_end_ack")==0 &&
        (std::strcmp(state,"TRANSCRIBING")==0 || std::strcmp(state,"AWAITING_CONFIRMATION")==0);
}
// 取消按不可复用的 voice_id 排队；离线与失败发送不会丢失 cleanup。
struct VoiceCleanup {
    std::vector<uint64_t> ids;
    void add(uint64_t id) {
        if(id && std::find(ids.begin(),ids.end(),id)==ids.end())ids.push_back(id);
    }
    uint64_t next(bool ready) const { return ready && !ids.empty()?ids.front():0; }
    void sent(uint64_t id, bool success) {
        if(success && !ids.empty() && ids.front()==id)ids.erase(ids.begin());
    }
};
struct VoiceDelivery {
    uint64_t id=0;
    bool remote_pending=false;
    uint32_t status_generation=0;
    bool acknowledge(uint64_t ack_id, uint32_t ack_generation, uint32_t generation) {
        if(!id || ack_id!=id || ack_generation!=generation || remote_pending) return false;
        remote_pending=true;status_generation=generation;return true;
    }
    bool needs_status(uint32_t generation, bool ready) const {
        return id && remote_pending && ready && status_generation!=generation;
    }
    bool expired(int64_t now, int64_t since, int64_t limit) const {
        return id && !remote_pending && now-since>=limit;
    }
    void clear() { *this={}; }
};
}
