package api

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
)

type RefreshRequest struct {
	RefreshToken string `json:"refresh_token"`
}

type RefreshResponse struct {
	AccessToken  string `json:"access_token"`
	ExpiresInMs  int    `json:"expires_in_ms"`
	RefreshToken string `json:"refresh_token"`
}

func Refresh(refreshToken string) (RefreshResponse, error) {
	body, err := json.Marshal(RefreshRequest{
		RefreshToken: refreshToken,
	})
	if err != nil {
		return RefreshResponse{}, err
	}
	resp, err := http.Post("https://matrix-client.matrix.org/_matrix/client/v3/refresh", "application/json", bytes.NewReader(body))
	if err != nil {
		return RefreshResponse{}, err
	}
	if resp.StatusCode < 200 || resp.StatusCode >= 300 {
		return RefreshResponse{}, fmt.Errorf("request failed %d: %s", resp.StatusCode, resp.Status)
	}
	var responseBody RefreshResponse
	err = json.NewDecoder(resp.Body).Decode(&responseBody)
	return responseBody, err
}