package blob

import (
	"net/http"

	// crypto libraries included for go-digest
	_ "crypto/sha256"
	_ "crypto/sha512"

	"github.com/opencontainers/go-digest"

	"github.com/regclient/regclient/types/descriptor"
	"github.com/regclient/regclient/types/ref"
)

// Common was previously an interface. A type alias is provided for upgrades.
type Common = *BCommon

// BCommon is a common struct for all blobs which includes various shared methods.
type BCommon struct {
	r         ref.Ref
	desc      descriptor.Descriptor
	blobSet   bool
	rawHeader http.Header
	resp      *http.Response
}

// GetDescriptor returns the descriptor associated with the blob.
func (c *BCommon) GetDescriptor() descriptor.Descriptor {
	return c.desc
}

// Digest returns the provided or calculated digest of the blob.
//
// Deprecated: Digest should be replaced by GetDescriptor().Digest, see [GetDescriptor].
func (c *BCommon) Digest() digest.Digest {
	return c.desc.Digest
}

// Length returns the provided or calculated length of the blob.
//
// Deprecated: Length should be replaced by GetDescriptor().Size, see [GetDescriptor].
func (c *BCommon) Length() int64 {
	return c.desc.Size
}

// MediaType returns the Content-Type header received from the registry.
//
// Deprecated: MediaType should be replaced by GetDescriptor().MediaType, see [GetDescriptor].
func (c *BCommon) MediaType() string {
	return c.desc.MediaType
}

// RawHeaders returns the headers received from the registry.
func (c *BCommon) RawHeaders() http.Header {
	return c.rawHeader
}

// Response returns the response associated with the blob.
func (c *BCommon) Response() *http.Response {
	return c.resp
}
