package infra

import (
	"fmt"
	"net/url"
)

// Oauth2Refresh renueva un access token OAuth2 usando el refresh token.
// POST al TokenURL con grant_type=refresh_token. Retorna OAuthTokens con
// el nuevo AccessToken (y posiblemente un nuevo RefreshToken segun el proveedor).
func Oauth2Refresh(config OAuthConfig, refreshToken string) (OAuthTokens, error) {
	var zero OAuthTokens
	if refreshToken == "" {
		return zero, fmt.Errorf("oauth2_refresh: refresh_token vacio")
	}
	if config.TokenURL == "" {
		return zero, fmt.Errorf("oauth2_refresh: token_url vacio")
	}
	form := url.Values{}
	form.Set("grant_type", "refresh_token")
	form.Set("refresh_token", refreshToken)
	form.Set("client_id", config.ClientID)
	form.Set("client_secret", config.ClientSecret)

	tokens, err := oauth2DoTokenRequest(config.TokenURL, form)
	if err != nil {
		return zero, fmt.Errorf("oauth2_refresh: %w", err)
	}
	// Algunos proveedores no devuelven refresh_token al renovar — conservar el original
	if tokens.RefreshToken == "" {
		tokens.RefreshToken = refreshToken
	}
	return tokens, nil
}
