package rex_model

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

type Repo interface {
	GetLatestTag() (Tag, error)
}

// Currently only for github
type GithubRepo struct {
	Owner string `json:"owner"`
	Repo  string `json:"repo"`
}

func (r GithubRepo) GetLatestTag() (Tag, error) {
	url := fmt.Sprintf("https://api.github.com/repos/%s/%s/tags", r.Owner, r.Repo)
	resp, err := http.Get(url)
	if err != nil {
		log.Printf("Failed to fetch releases for %s/%s: %v", r.Owner, r.Repo, err)
		return Tag{}, err
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		log.Printf("Unexpected response status for %s/%s: %d", r.Owner, r.Repo, resp.StatusCode)
		return Tag{}, fmt.Errorf("unexpected response status: %d", resp.StatusCode)
	}

	var tags = []Tag{}
	if err := json.NewDecoder(resp.Body).Decode(&tags); err != nil {
		log.Printf("Failed to decode response for %s/%s: %v", r.Owner, r.Repo, err)
		return Tag{}, err
	}

	return tags[0], nil
}

type Commit struct {
	Sha string `json:"sha"`
	URL string `json:"url"`
}

type Tag struct {
	Name       string `json:"name"`
	ZipballURL string `json:"zipball_url"`
	TarballURL string `json:"tarball_url"`
	Commit     Commit `json:"commit"`
	NodeID     string `json:"node_id"`
}