package handler

import (
	"github.com/loveuer/nf"
	"nf-repo/internal/interfaces"
	"nf-repo/internal/opt"
)

type blob struct {
	blobHandler   interfaces.BlobHandler
	uploadHandler interfaces.UploadHandler
}

var (
	b = &blob{}
)

func Root(bh interfaces.BlobHandler, uh interfaces.UploadHandler, mh interfaces.ManifestHandler) nf.HandlerFunc {
	b.blobHandler = bh
	b.uploadHandler = uh
	return func(c *nf.Ctx) error {
		if isBlob(c) {
			return handleBlobs(c)
		}

		if isManifest(c) {
			return handleManifest(c, mh)
		}

		if isTags(c) {
			return handleTags(c, mh)
		}

		if isCatalog(c) {
			return handleCatalog(c, mh)
		}

		if opt.ReferrersEnabled && isReferrers(c) {
			return handleReferrers(c, mh)
		}

		c.Set("Docker-Distribution-API-Version", "registry/2.0")

		return c.SendStatus(200)
	}
}