package gitstore

import (
	"context"
	"time"

	"go.skia.org/infra/go/vcsinfo"
)

// GitStore defines the functions of a data store for Git metadata (aka vcsinfo.LongCommit)
// Each GitStore instance relates to one repository that is defined in the constructor of the
// implementation.
type GitStore interface {
	// Put stores the given commits. They can be retrieved in order of timestamps by using
	// RangeByTime or RangeN (no topological ordering).
	Put(ctx context.Context, commits []*vcsinfo.LongCommit) error

	// Get retrieves the commits identified by 'hashes'. The return value will always have the
	// length of the input value and the results will line up by index. If a commit does not exist
	// the corresponding entry in the result is nil.
	// The function will only return an error if the retrieval operation (the I/O) fails, not
	// if the given hashes do not exist or are invalid.
	Get(ctx context.Context, hashes []string) ([]*vcsinfo.LongCommit, error)

	// PutBranches updates branches in the repository. It writes indices for the branches so they
	// can be retrieved via RangeN and RangeByTime. These are ordered in toplogical order with only
	// first-parents included.
	// 'branches' maps branchName -> commit_hash to indicate the head of a branch. The store then
	// calculates the commits of the branch and updates the indices accordingly.
	// If a branch exists it will be updated. It will not remove existing branches in the repo if
	// they are not listed in the 'branches' argument.
	PutBranches(ctx context.Context, branches map[string]string) error

	// GetBranches returns the current branches in the store. It maps[branchName]->BranchPointer.
	// A BranchPointer contains the HEAD commit and also the Index of the HEAD commit, which is
	// usually the total number of commits in the branch minus 1.
	GetBranches(ctx context.Context) (map[string]*BranchPointer, error)

	// RangeN returns all commits in the half open index range [startIndex, endIndex).
	// Thus not including endIndex. It returns the commits in the given branch sorted in ascending
	// order by Index and the commits are topologically sorted only including first-parent commits.
	RangeN(ctx context.Context, startIndex, endIndex int, branch string) ([]*vcsinfo.IndexCommit, error)

	// RangeByTime returns all commits in the half open time range [startIndex, endIndex). Thus not
	// including commits at 'end' time.
	// Caveat: The returned results will match the requested range, but will be sorted by Index.
	// So if the timestamps within a commit are not in order they will be unordered in the results.
	RangeByTime(ctx context.Context, start, end time.Time, branch string) ([]*vcsinfo.IndexCommit, error)

	// GetGraph returns the commit graph of the entire repository.
	GetGraph(ctx context.Context) (*CommitGraph, error)
}

// GitStoreBased is an interface that tags an object as being based on GitStore and the
// underlying GitStore instance can be retrieved. e.g.
//
// if gsb, ok := someInstance.(GitStoreBased); ok {
//   gitStore := gsb.GetGitStore()
//   ...  do something with gitStore
// }
//
type GitStoreBased interface {
	// GetGitStore returns the underlying GitStore instances.
	GetGitStore() GitStore
}

// BranchPointer captures the HEAD of a branch and the index of that commit.
type BranchPointer struct {
	Head  string
	Index int
}

// RepoInfo contains information about one repo in the GitStore.
type RepoInfo struct {
	// Numeric id of the repo. This is unique within all repos in a BT table. This ID is uniquely
	// assigned whenever a new repo is added.
	ID int64

	// RepoURL contains the URL of the repo as returned by git.NormalizeURL(...).
	RepoURL string

	// Branches contain all the branches in the repo, mapping branch_name -> branch_pointer.
	Branches map[string]*BranchPointer
}
