package provider

import (
	"context"
	"fmt"
	"io"
	"net/http"
	"time"

	calent "github.com/tidbcloud/devops/entity/k8scalendar"
)

type Config struct {
	URL       string
	UserAgent string
}

type Provider interface {
	Cloud() string
	Fetch(ctx context.Context) ([]*calent.VersionLifecycle, error)
}

type httpFetcher struct {
	client    *http.Client
	userAgent string
}

func newHTTPFetcher(userAgent string) *httpFetcher {
	return &httpFetcher{
		client: &http.Client{Timeout: 2 * time.Minute},
		userAgent: func() string {
			if userAgent != "" {
				return userAgent
			}
			return "Mozilla/5.0 k8s-upgrade-planner"
		}(),
	}
}

func (f *httpFetcher) fetchHTML(ctx context.Context, url string) (string, error) {
	req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
	if err != nil {
		return "", err
	}
	req.Header.Set("User-Agent", f.userAgent)
	req.Header.Set("Accept", "text/html,application/xhtml+xml")

	resp, err := f.client.Do(req)
	if err != nil {
		return "", err
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		return "", fmt.Errorf("fetch %s: status %d", url, resp.StatusCode)
	}
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return "", err
	}
	return string(body), nil
}

func NewGKE(cfg Config) Provider {
	return &gkeProvider{cfg: cfg, fetcher: newHTTPFetcher(cfg.UserAgent)}
}
