package serviceassets

import (
	"strings"

	"github.com/gophercloud/gophercloud"
)

// DeleteOptsBuilder allows extensions to add additional parameters to the Delete
// request.
type DeleteOptsBuilder interface {
	ToCDNAssetDeleteParams() (string, error)
}

// DeleteOpts is a structure that holds options for deleting CDN service assets.
type DeleteOpts struct {
	// If all is set to true, specifies that the delete occurs against all of the
	// assets for the service.
	All bool `q:"all"`
	// Specifies the relative URL of the asset to be deleted.
	URL string `q:"url"`
}

// ToCDNAssetDeleteParams formats a DeleteOpts into a query string.
func (opts DeleteOpts) ToCDNAssetDeleteParams() (string, error) {
	q, err := gophercloud.BuildQueryString(opts)
	return q.String(), err
}

// Delete accepts a unique service ID or URL and deletes the CDN service asset associated with
// it. For example, both "96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0" and
// "https://global.cdn.api.rackspacecloud.com/v1.0/services/96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0"
// are valid options for idOrURL.
func Delete(c *gophercloud.ServiceClient, idOrURL string, opts DeleteOptsBuilder) (r DeleteResult) {
	var url string
	if strings.Contains(idOrURL, "/") {
		url = idOrURL
	} else {
		url = deleteURL(c, idOrURL)
	}
	if opts != nil {
		q, err := opts.ToCDNAssetDeleteParams()
		if err != nil {
			r.Err = err
			return
		}
		url += q
	}
	_, r.Err = c.Delete(url, nil)
	return
}
