package forgejo

import (
	"encoding/json"
	"io"
	"net/http"
	"strings"
)

var (
	baseUrl string
	apiUrl  string
)

type Error struct {
	StatusCode int
	Status     string
	Message    string
}

func (e *Error) Error() string {
	s := "forgejo: http: " + e.Status
	if e.Message != "" {
		s += ": " + e.Message
	}
	return s
}

func SetUrl(u string) {
	baseUrl = strings.TrimRight(u, "/")
	apiUrl = baseUrl + "/api/v1"
}

func Request(method string, path string, headers map[string]string, body io.Reader) (*http.Response, error) {
	req, err := http.NewRequest(method, apiUrl+"/"+strings.TrimLeft(path, "/"), body)
	if err != nil {
		return nil, err
	}
	req.Header.Set("accept", "application/json")

	for k, v := range headers {
		req.Header.Set(k, v)
	}

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		return nil, err
	}

	if resp.StatusCode >= 400 {
		defer resp.Body.Close()
		err := &Error{
			StatusCode: resp.StatusCode,
			Status:     resp.Status,
		}
		v := struct {
			Message string `json:"message"`
		}{}
		if json.NewDecoder(resp.Body).Decode(&v) == nil && v.Message != "" {
			err.Message = v.Message
		}
		return nil, err
	}
	return resp, nil
}
