package http

import (
	"github.com/moby/buildkit/solver/llbsolver/provenance"
	provenancetypes "github.com/moby/buildkit/solver/llbsolver/provenance/types"
	"github.com/moby/buildkit/source"
	srctypes "github.com/moby/buildkit/source/types"
	digest "github.com/opencontainers/go-digest"
	"github.com/pkg/errors"
)

func NewHTTPIdentifier(str string, tls bool) (*HTTPIdentifier, error) {
	proto := "https://"
	if !tls {
		proto = "http://"
	}
	return &HTTPIdentifier{TLS: tls, URL: proto + str}, nil
}

type HTTPIdentifier struct {
	TLS              bool
	URL              string
	Checksum         digest.Digest
	Filename         string
	Perm             int
	UID              int
	GID              int
	AuthHeaderSecret string
	Header           []HeaderField
}

type HeaderField struct {
	Name  string
	Value string
}

var _ source.Identifier = (*HTTPIdentifier)(nil)

func (id *HTTPIdentifier) Scheme() string {
	if id.TLS {
		return srctypes.HTTPSScheme
	}
	return srctypes.HTTPScheme
}

func (id *HTTPIdentifier) Capture(c *provenance.Capture, pin string) error {
	dgst, err := digest.Parse(pin)
	if err != nil {
		return errors.Wrapf(err, "failed to parse HTTP digest %s", pin)
	}
	c.AddHTTP(provenancetypes.HTTPSource{
		URL:    id.URL,
		Digest: dgst,
	})
	return nil
}
