package github

import (
	"context"
	"fmt"
	"time"

	"github.com/databricks/cli/cmd/labs/localcache"
	"github.com/databricks/cli/libs/log"
)

const repositoryCacheTTL = 24 * time.Hour

func NewRepositoryCache(org, cacheDir string) *repositoryCache {
	filename := fmt.Sprintf("%s-repositories", org)
	return &repositoryCache{
		cache: localcache.NewLocalCache[Repositories](cacheDir, filename, repositoryCacheTTL),
		Org:   org,
	}
}

type repositoryCache struct {
	cache localcache.LocalCache[Repositories]
	Org   string
}

func (r *repositoryCache) Load(ctx context.Context) (Repositories, error) {
	return r.cache.Load(ctx, func() (Repositories, error) {
		return getRepositories(ctx, r.Org)
	})
}

// getRepositories is considered to be privata API, as we want the usage to go through a cache
func getRepositories(ctx context.Context, org string) (Repositories, error) {
	var repos Repositories
	log.Debugf(ctx, "Loading repositories for %s from GitHub API", org)
	url := fmt.Sprintf("%s/users/%s/repos", gitHubAPI, org)
	err := httpGetAndUnmarshal(ctx, url, &repos)
	return repos, err
}

type Repositories []ghRepo

type ghRepo struct {
	Name          string   `json:"name"`
	Description   string   `json:"description"`
	Langauge      string   `json:"language"`
	DefaultBranch string   `json:"default_branch"`
	Stars         int      `json:"stargazers_count"`
	IsFork        bool     `json:"fork"`
	IsArchived    bool     `json:"archived"`
	Topics        []string `json:"topics"`
	HtmlURL       string   `json:"html_url"`
	CloneURL      string   `json:"clone_url"`
	SshURL        string   `json:"ssh_url"`
	License       struct {
		Name string `json:"name"`
	} `json:"license"`
}