package uk.co.caeldev.springsecuritymongo.builders;

import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.common.OAuth2RefreshToken;

import java.time.LocalDateTime;
import java.util.Map;
import java.util.Set;

import static uk.co.caeldev.springsecuritymongo.commons.SecurityRDG.*;
import static uk.co.caeldev.springsecuritymongo.util.LocalDateTimeUtil.convertToDateFrom;

public class OAuth2AccessTokenBuilder {

    private LocalDateTime expiration = localDateTime().next();
    private OAuth2RefreshToken oAuth2RefreshToken = OAuth2RefreshTokenBuilder.oAuth2RefreshToken().build();
    private Set<String> scope = set(string()).next();
    private Map<String, Object> additionalInformation = map(string(), objectOf(string())).next();
    private String token = string().next();

    private OAuth2AccessTokenBuilder() {
    }

    public static OAuth2AccessTokenBuilder oAuth2AccessTokenBuilder() {
        return new OAuth2AccessTokenBuilder();
    }

    public OAuth2AccessToken build() {
        final DefaultOAuth2AccessToken oAuth2AccessToken = new DefaultOAuth2AccessToken(token);
        oAuth2AccessToken.setExpiration(convertToDateFrom(expiration));
        oAuth2AccessToken.setRefreshToken(oAuth2RefreshToken);
        oAuth2AccessToken.setScope(scope);
        oAuth2AccessToken.setAdditionalInformation(additionalInformation);
        return oAuth2AccessToken;
    }

    public OAuth2AccessTokenBuilder token(String token) {
        this.token = token;
        return this;
    }
}