package storage

import (
	"path/filepath"
	"regexp"
)

var digestRe = regexp.MustCompile(`^sha256:[a-f0-9]{64}$`)

// Store manages blob storage on the local filesystem.
type Store struct {
	layersPath  string
	uploadsPath string
}

// New creates a Store that will write final blobs under layersPath and
// stage in-progress uploads under uploadsPath.
func New(layersPath, uploadsPath string) *Store {
	return &Store{
		layersPath:  layersPath,
		uploadsPath: uploadsPath,
	}
}

// validateDigest checks that digest matches sha256:<64 lowercase hex chars>.
func validateDigest(digest string) error {
	if !digestRe.MatchString(digest) {
		return ErrInvalidDigest
	}
	return nil
}

// blobPath returns the filesystem path for a blob with the given digest.
// The layout is: <layersPath>/sha256/<first-2-hex>/<full-64-hex>
func (s *Store) blobPath(digest string) string {
	hex := digest[len("sha256:"):]
	return filepath.Join(s.layersPath, "sha256", hex[0:2], hex)
}
