#include "voice_delivery.h"
#include "voice_capture_limits.h"
#include <cassert>
#include <cstdio>

int main() {
    using wearable::VoiceDelivery;
    using wearable::voice_terminal_ack;
    assert(voice_terminal_ack("voice_end_ack","TRANSCRIBING"));
    assert(voice_terminal_ack("voice_end_ack","AWAITING_CONFIRMATION"));
    assert(!voice_terminal_ack("voice_ack","TRANSCRIBING"));
    assert(!voice_terminal_ack("voice_end_ack","SENT"));
    assert(!voice_terminal_ack("voice_end_ack",nullptr));
    VoiceDelivery delivery;delivery.id=0xab;
    // END 尾帧丢失时，写入成功不能切换到结果阶段或释放上传状态。
    assert(!delivery.remote_pending);
    assert(!delivery.acknowledge(0xac,2,2));
    assert(!delivery.acknowledge(0xab,1,2));
    assert(!delivery.expired(45000,0,VOICE_RETAIN_AFTER_FAILURE_MS));
    assert(!delivery.expired(119999,0,VOICE_RETAIN_AFTER_FAILURE_MS));
    assert(delivery.expired(120000,0,VOICE_RETAIN_AFTER_FAILURE_MS));
    // 重发 END/status 获得终态确认后，只保留结果身份，不再上传 PCM。
    assert(delivery.acknowledge(0xab,2,2));
    assert(delivery.remote_pending);
    assert(!delivery.acknowledge(0xab,2,2));
    assert(!delivery.expired(180000,0,VOICE_RETAIN_AFTER_FAILURE_MS));
    assert(!delivery.needs_status(3,false));
    assert(delivery.needs_status(3,true));
    delivery.status_generation=3;
    assert(!delivery.needs_status(3,true));
    // approval、target、cancel 使身份失效，迟到确认和重连均不可复活请求。
    delivery.clear();
    assert(!delivery.needs_status(4,true));
    assert(!delivery.acknowledge(0xab,4,4));
    wearable::VoiceCleanup cleanup;
    cleanup.add(0xab);cleanup.add(0xab);cleanup.add(0xac);
    assert(!cleanup.next(false));
    assert(cleanup.next(true)==0xab);
    cleanup.sent(0xab,false);assert(cleanup.next(true)==0xab);
    cleanup.sent(0xac,true);assert(cleanup.next(true)==0xab);
    cleanup.sent(0xab,true);assert(cleanup.next(true)==0xac);
    cleanup.sent(0xac,true);assert(!cleanup.next(true));
    std::puts("Production VoiceDelivery END tail-loss / terminal ACK / hard expiry / STT reconnect / invalidation / offline cleanup PASS");
}
