package httprange

import (
	
	
	
	

	
)

// Builder constructs a [BytesResource] for an HTTP resource that supports byte
// range requests.
type Builder struct {
	// Metadata extracts representation metadata for the resource.
	Metadata HTTPMetadataExtractor

	// Validator builds a validator for conditional requests.
	Validator HTTPValidatorBuilder

	// Request builds the HTTP GET request for range requests.
	Request HTTPRequestBuilder

	// Client is the HTTP client instance to use.
	Client httpclient.Client
}

// BuildFromRawURL is a convenience function that builds a [BytesResource] from
// the parsed URL. If client is nil, the default HTTP client is used.
func ( context.Context,  string,  httpclient.Client) (*BytesResource, error) {
	,  := url.Parse()
	if  != nil {
		return nil, 
	}
	return NewBuilderFromURL(, ).Build()
}

// NewBuilderFromURL returns a new [Builder] for the given URL and HTTP client.
// If client is nil, the default HTTP client is used.
func ( *url.URL,  httpclient.Client) *Builder {
	if  == nil {
		 = httpclient.DefaultClient()
	}
	return &Builder{
		Metadata: &HTTPResponseMetadataExtractor{
			Request: &HTTPRequest{
				Method: http.MethodHead,
				URL:    ,
			},
			Client: ,
		},
		Validator: &HTTPStrongValidatorBuilder{
			UseLastModified: false,
		},
		Request: &HTTPRequest{
			URL: ,
		},
		Client: ,
	}
}

// Build creates a [BytesResource] for the configured HTTP resource.
func ( *Builder) ( context.Context) (*BytesResource, error) {
	,  := .Metadata.Extract()
	if  != nil {
		return nil, 
	}

	 := .Provide()

	if .ContentLength < 0 {
		return nil, errors.New("httprange: unknown resource content length")
	}

	if  := checkUnitIsAccepted(.AcceptRanges, bytesUnit);  != nil {
		return nil, 
	}

	,  := .Validator.Build(, , .Client)
	if  != nil {
		return nil, 
	}

	return &BytesResource{
		Length: .ContentLength,
		Ranger: &HTTPRanger{
			Request: .Request,
			Client:  ,
		},
	}, nil
}