package cache

import (
	"fmt"

	"github.com/drone/drone/model"
	"golang.org/x/net/context"
)

// GetRepos returns the user permissions to the named repository
// from the cache associated with the current context.
func GetPerms(c context.Context, user *model.User, owner, name string) *model.Perm {
	key := fmt.Sprintf("perms:%s:%s/%s",
		user.Login,
		owner,
		name,
	)
	val, err := FromContext(c).Get(key)
	if err != nil {
		return nil
	}
	return val.(*model.Perm)
}

// SetRepos adds the listof user permissions to the named repsotiory
// to the cache assocaited with the current context.
func SetPerms(c context.Context, user *model.User, perm *model.Perm, owner, name string) {
	key := fmt.Sprintf("perms:%s:%s/%s",
		user.Login,
		owner,
		name,
	)
	FromContext(c).Set(key, perm)
}

// GetRepos returns the list of user repositories from the cache
// associated with the current context.
func GetRepos(c context.Context, user *model.User) []*model.RepoLite {
	key := fmt.Sprintf("repos:%s",
		user.Login,
	)
	val, err := FromContext(c).Get(key)
	if err != nil {
		return nil
	}
	return val.([]*model.RepoLite)
}

// SetRepos adds the listof user repositories to the cache assocaited
// with the current context.
func SetRepos(c context.Context, user *model.User, repos []*model.RepoLite) {
	key := fmt.Sprintf("repos:%s",
		user.Login,
	)
	FromContext(c).Set(key, repos)
}

// GetSetRepos is a helper function that attempts to get the
// repository list from the cache first. If no data is in the
// cache or it is expired, it will remotely fetch the list of
// repositories and populate the cache.
// func GetSetRepos(c context.Context, user *model.User) ([]*model.RepoLite, error) {
// 	cache := FromContext(c).Repos()
// 	repos := FromContext(c).Repos().Get(user)
// 	if repos != nil {
// 		return repos, nil
// 	}
// 	var err error
// 	repos, err = remote.FromContext(c).Repos(user)
// 	if err != nil {
// 		return nil, err
// 	}
// 	cache.Set(user, repos)
// 	return repos, nil
// }