package com.games.gateway.domain;

import com.alibaba.fastjson.annotation.JSONField;
import com.games.gateway.enums.AccountType;
import com.games.gateway.enums.SessionStatusEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * @author code
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Session {

    /**
     * 授权token
     */
    private String token;
    /**
     * 用户ID
     */
    private Long userId;
    /**
     * session状态
     */
    private SessionStatusEnum status;
    /**
     * session创建时间
     */
    private LocalDateTime createTime;
    /**
     * session最后访问时间
     */
    private LocalDateTime lastAccessTime;
    /**
     * session过期时间
     */
    private LocalDateTime expireTime;
    /**
     * 用户注册时间
     */
    private LocalDateTime registerTime;
    /**
     * 终端类型【前端透传 WEB、ANDROID、IOS】
     */
    private String endpoint;

    /**
     * 数字版本号【前端透传 数字版本号】
     */
    private Integer versionNum;

    /**
     * 终端设备唯一识别码【前端透传】
     */
    private String deviceCode;

    /**
     * 终端设备IP【前端透传】
     */
    private String ip;

    /**
     * 终端设备UA【前端透传】
     */
    private String userAgent;

    @JSONField(serialize = false)
    public boolean isExpired() {
        return expireTime != null && LocalDateTime.now().isAfter(expireTime);
    }

    /**
     * 是否超过最大存活期内
     *
     * @param sessionAlive 最大存活时间，单位分钟，由 client 定义
     * @return 是否在最大存活时间内
     */
    @JSONField(serialize = false)
    public boolean isOverMaxAlive(Integer sessionAlive) {
        LocalDateTime maxAliveTime = createTime.plusMinutes(sessionAlive);
        return LocalDateTime.now().isAfter(maxAliveTime);
    }

}
