package com.konkerlabs.platform.registry.business.model;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Tolerate;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.common.util.SerializationUtils;
import org.springframework.security.oauth2.provider.OAuth2Authentication;

import java.io.Serializable;
import java.time.Instant;
import java.util.Date;

@Data
@Builder
@Document(collection = "accessTokens")
@NoArgsConstructor
@AllArgsConstructor
public class AccessToken implements Serializable {

    private static final long serialVersionUID = 7588602587200382326L;

    @Id
    private String tokenId;

    @CreatedDate
    private Date createTime = Date.from(Instant.now());

    @Version
    private Long version;

    private byte[] token;
    private String authenticationId;
    private byte[] authentication;
    private String username;
    private String clientId;
    private String refreshToken;

    @Tolerate
    public OAuth2AccessToken token() {
        return SerializationUtils.deserialize(token);
    }

    @Tolerate
    public AccessToken token(OAuth2AccessToken token) {
        this.token = SerializationUtils.serialize(token);
        return this;
    }

    @Tolerate
    public OAuth2Authentication authentication() {
        return SerializationUtils.deserialize(authentication);
    }

    @Tolerate
    public AccessToken authentication(OAuth2Authentication authentication) {
        this.authentication = SerializationUtils.serialize(authentication);
        return this;
    }

    @Override
    public String toString() {
        return new StringBuilder().append("{")
                .append("tokenId='").append(tokenId).append('\'')
                .append(", createTime=").append(createTime)
                .append(", version=").append(version)
                .append(", authenticationId='").append(authenticationId).append('\'')
                .append(", username='").append(username).append('\'')
                .append(", clientId='").append(clientId).append('\'')
                .append(", refreshToken='").append(refreshToken).append('\'')
                .append('}').toString();
    }

}