package slack

import (
	"context"
	"net/url"
)

// RotateTokens exchanges a refresh token for a new app configuration token
func (api *Client) RotateTokens(configToken string, refreshToken string) (*TokenResponse, error) {
	return api.RotateTokensContext(context.Background(), configToken, refreshToken)
}

// RotateTokensContext exchanges a refresh token for a new app configuration token with a custom context
func (api *Client) RotateTokensContext(ctx context.Context, configToken string, refreshToken string) (*TokenResponse, error) {
	if configToken == "" {
		configToken = api.configToken
	}

	if refreshToken == "" {
		refreshToken = api.configRefreshToken
	}

	values := url.Values{
		"refresh_token": {refreshToken},
	}

	response := &TokenResponse{}
	err := api.getMethod(ctx, "tooling.tokens.rotate", configToken, values, response)
	if err != nil {
		return nil, err
	}

	return response, response.Err()
}

// UpdateConfigTokens replaces the configuration tokens in the client with those returned by the API
func (api *Client) UpdateConfigTokens(response *TokenResponse) {
	api.configToken = response.Token
	api.configRefreshToken = response.RefreshToken
}

type TokenResponse struct {
	Token        string `json:"token,omitempty"`
	RefreshToken string `json:"refresh_token,omitempty"`
	TeamId       string `json:"team_id,omitempty"`
	UserId       string `json:"user_id,omitempty"`
	IssuedAt     uint64 `json:"iat,omitempty"`
	ExpiresAt    uint64 `json:"exp,omitempty"`
	SlackResponse
}