package study.iot.command;

import java.time.Instant;

/**
 * 云端下发的命令。commandId 是业务幂等键，expireAt 是绝对过期时刻。
 *
 * <p>状态机：CREATED → PUBLISHED → DELIVERED → ACKED → SUCCEEDED / FAILED；任何等待态都可
 * 转 EXPIRED。迟到 ACK 不能把已过期命令记成 SUCCEEDED。</p>
 */
public record Command(String commandId, String deviceId, String type, String payload,
                      Instant createdAt, Instant expireAt) {

    public enum State { CREATED, PUBLISHED, DELIVERED, ACKED, SUCCEEDED, FAILED, EXPIRED }

    public boolean expiredAt(Instant now) {
        return !now.isBefore(expireAt);
    }
}
