package fosite

import (
	"strings"
	"time"
)

func NewAccessResponse() *AccessResponse {
	return &AccessResponse{
		Extra: map[string]interface{}{},
	}
}

type AccessResponse struct {
	Extra       map[string]interface{}
	AccessToken string
	TokenType   string
}

func (a *AccessResponse) SetScopes(scopes Arguments) {
	a.SetExtra("scope", strings.Join(scopes, " "))
}

func (a *AccessResponse) SetExpiresIn(expiresIn time.Duration) {
	a.SetExtra("expires_in", int64(expiresIn/time.Second))
}

func (a *AccessResponse) SetExtra(key string, value interface{}) {
	a.Extra[key] = value
}

func (a *AccessResponse) GetExtra(key string) interface{} {
	return a.Extra[key]
}

func (a *AccessResponse) SetAccessToken(token string) {
	a.AccessToken = token
}

func (a *AccessResponse) SetTokenType(name string) {
	a.TokenType = name
}

func (a *AccessResponse) GetAccessToken() string {
	return a.AccessToken
}

func (a *AccessResponse) GetTokenType() string {
	return a.TokenType
}

func (a *AccessResponse) ToMap() map[string]interface{} {
	a.Extra["access_token"] = a.GetAccessToken()
	a.Extra["token_type"] = a.GetTokenType()
	return a.Extra
}
