package com.lingniu.ingest.session;

import com.lingniu.ingest.api.ProtocolId;

import java.time.Instant;
import java.util.Map;

/**
 * 设备会话领域模型。不可变；更新通过 {@link SessionStore#update} 原子替换。
 *
 * @param sessionId    会话 ID（通常由 Netty channel id + 终端号生成）
 * @param protocol     协议 ID
 * @param vin          车架号（注册/鉴权后补齐，注册前为 null）
 * @param phone        终端手机号 / 设备号
 * @param token        鉴权 Token（平台下发）
 * @param peerAddress  对端 IP:port
 * @param registeredAt 注册时间
 * @param lastSeenAt   最后活跃时间
 * @param attributes   协议特定属性（协议版本、型号等）
 */
public record DeviceSession(
        String sessionId,
        ProtocolId protocol,
        String vin,
        String phone,
        String token,
        String peerAddress,
        Instant registeredAt,
        Instant lastSeenAt,
        Map<String, String> attributes
) {
    public DeviceSession touch(Instant now) {
        return new DeviceSession(sessionId, protocol, vin, phone, token, peerAddress,
                registeredAt, now, attributes);
    }

    public DeviceSession withVin(String vin) {
        return new DeviceSession(sessionId, protocol, vin, phone, token, peerAddress,
                registeredAt, lastSeenAt, attributes);
    }

    public DeviceSession withToken(String token) {
        return new DeviceSession(sessionId, protocol, vin, phone, token, peerAddress,
                registeredAt, lastSeenAt, attributes);
    }
}
