package api

import (
	"bytes"
	"context"
	"io"
	"net/http"
	"net/url"

	"github.com/pkg/errors"
)

func textAPI(uri string, fallback ...string) (string, error) {
	u, err := url.Parse(uri)
	if err != nil {
		return "", errors.Wrap(err, "parsing URL")
	}

	reqCtx, cancel := context.WithTimeout(context.Background(), remoteRequestTimeout)
	defer cancel()

	req, err := http.NewRequestWithContext(reqCtx, http.MethodGet, u.String(), nil)
	if err != nil {
		return "", errors.Wrap(err, "assembling request")
	}
	req.Header.Set("User-Agent", "Luzifer/twitch-bot template/api/jsonAPI (https://github.com/Luzifer/twitch-bot)")

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		return "", errors.Wrap(err, "executing request")
	}
	defer resp.Body.Close()

	switch resp.StatusCode {
	case http.StatusOK:
		// That's what we wanna see

	case http.StatusNoContent:
		if len(fallback) > 0 {
			return fallback[0], nil
		}
		return "", errors.Errorf("unexpected HTTP status %d without fallback", resp.StatusCode)

	default:
		return "", errors.Errorf("unexpected HTTP status %d", resp.StatusCode)
	}

	content, err := io.ReadAll(resp.Body)
	if err != nil {
		return "", errors.Wrap(err, "reading response body")
	}

	if len(bytes.TrimSpace(content)) == 0 && len(fallback) > 0 {
		return fallback[0], nil
	}

	return string(content), nil
}