/*
Copyright 2020 The Kubernetes Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package egoscale

// ResourceTag is a tag associated with a resource
//
// https://community.exoscale.com/documentation/compute/instance-tags/
type ResourceTag struct {
	Account      string `json:"account,omitempty" doc:"the account associated with the tag"`
	Customer     string `json:"customer,omitempty" doc:"customer associated with the tag"`
	Key          string `json:"key,omitempty" doc:"tag key name"`
	ResourceID   *UUID  `json:"resourceid,omitempty" doc:"id of the resource"`
	ResourceType string `json:"resourcetype,omitempty" doc:"resource type"`
	Value        string `json:"value,omitempty" doc:"tag value"`
}

// ListRequest builds the ListZones request
func (tag ResourceTag) ListRequest() (ListCommand, error) {
	req := &ListTags{
		Customer:     tag.Customer,
		Key:          tag.Key,
		ResourceID:   tag.ResourceID,
		ResourceType: tag.ResourceType,
		Value:        tag.Value,
	}

	return req, nil
}

// CreateTags (Async) creates resource tag(s)
type CreateTags struct {
	ResourceIDs  []UUID        `json:"resourceids" doc:"list of resources to create the tags for"`
	ResourceType string        `json:"resourcetype" doc:"type of the resource"`
	Tags         []ResourceTag `json:"tags" doc:"Map of tags (key/value pairs)"`
	Customer     string        `json:"customer,omitempty" doc:"identifies client specific tag. When the value is not null, the tag can't be used by cloudStack code internally"`
	_            bool          `name:"createTags" description:"Creates resource tag(s)"`
}

// Response returns the struct to unmarshal
func (CreateTags) Response() interface{} {
	return new(AsyncJobResult)
}

// AsyncResponse returns the struct to unmarshal the async job
func (CreateTags) AsyncResponse() interface{} {
	return new(BooleanResponse)
}

// DeleteTags (Async) deletes the resource tag(s)
type DeleteTags struct {
	ResourceIDs  []UUID        `json:"resourceids" doc:"Delete tags for resource id(s)"`
	ResourceType string        `json:"resourcetype" doc:"Delete tag by resource type"`
	Tags         []ResourceTag `json:"tags,omitempty" doc:"Delete tags matching key/value pairs"`
	_            bool          `name:"deleteTags" description:"Deleting resource tag(s)"`
}

// Response returns the struct to unmarshal
func (DeleteTags) Response() interface{} {
	return new(AsyncJobResult)
}

// AsyncResponse returns the struct to unmarshal the async job
func (DeleteTags) AsyncResponse() interface{} {
	return new(BooleanResponse)
}

//go:generate go run generate/main.go -interface=Listable ListTags

// ListTags list resource tag(s)
type ListTags struct {
	Customer     string `json:"customer,omitempty" doc:"list by customer name"`
	Key          string `json:"key,omitempty" doc:"list by key"`
	Keyword      string `json:"keyword,omitempty" doc:"List by keyword"`
	Page         int    `json:"page,omitempty"`
	PageSize     int    `json:"pagesize,omitempty"`
	ResourceID   *UUID  `json:"resourceid,omitempty" doc:"list by resource id"`
	ResourceType string `json:"resourcetype,omitempty" doc:"list by resource type"`
	Value        string `json:"value,omitempty" doc:"list by value"`
	_            bool   `name:"listTags" description:"List resource tag(s)"`
}

// ListTagsResponse represents a list of resource tags
type ListTagsResponse struct {
	Count int           `json:"count"`
	Tag   []ResourceTag `json:"tag"`
}
