package putio

import (
	"fmt"
	"net/http"

	"github.com/putdotio/go-putio/putio"
	"github.com/rclone/rclone/fs/fserrors"
)

func checkStatusCode(resp *http.Response, expected int) error {
	if resp.StatusCode != expected {
		return &statusCodeError{response: resp}
	}
	return nil
}

type statusCodeError struct {
	response *http.Response
}

func (e *statusCodeError) Error() string {
	return fmt.Sprintf("unexpected status code (%d) response while doing %s to %s", e.response.StatusCode, e.response.Request.Method, e.response.Request.URL.String())
}

func (e *statusCodeError) Temporary() bool {
	return e.response.StatusCode == 429 || e.response.StatusCode >= 500
}

// shouldRetry returns a boolean as to whether this err deserves to be
// retried.  It returns the err as a convenience
func shouldRetry(err error) (bool, error) {
	if err == nil {
		return false, nil
	}
	if perr, ok := err.(*putio.ErrorResponse); ok {
		err = &statusCodeError{response: perr.Response}
	}
	if fserrors.ShouldRetry(err) {
		return true, err
	}
	return false, err
}