/*
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

// Event represents an event in the system
type Event struct {
	Account     string `json:"account,omitempty" doc:"the account name for the account that owns the object being acted on in the event (e.g. the owner of the virtual machine, ip address, or security group)"`
	Created     string `json:"created,omitempty" doc:"the date the event was created"`
	Description string `json:"description,omitempty" doc:"a brief description of the event"`
	ID          *UUID  `json:"id" doc:"the ID of the event"`
	Level       string `json:"level,omitempty" doc:"the event level (INFO, WARN, ERROR)"`
	ParentID    *UUID  `json:"parentid,omitempty" doc:"whether the event is parented"`
	State       string `json:"state,omitempty" doc:"the state of the event"`
	Type        string `json:"type,omitempty" doc:"the type of the event (see event types)"`
	UserName    string `json:"username,omitempty" doc:"the name of the user who performed the action (can be different from the account if an admin is performing an action for a user, e.g. starting/stopping a user's virtual machine)"`
}

// ListRequest builds the ListEvents request
func (event Event) ListRequest() (ListCommand, error) {
	req := &ListEvents{
		ID:    event.ID,
		Level: event.Level,
		Type:  event.Type,
	}

	return req, nil
}

// EventType represent a type of event
type EventType struct {
	Name string `json:"name,omitempty" doc:"Event Type"`
}

// ListRequest builds the ListEventTypes request
func (EventType) ListRequest() (ListCommand, error) {
	req := &ListEventTypes{}

	return req, nil
}

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

// ListEvents list the events
type ListEvents struct {
	Duration  int    `json:"duration,omitempty" doc:"the duration of the event"`
	EndDate   string `json:"enddate,omitempty" doc:"the end date range of the list you want to retrieve (use format \"yyyy-MM-dd\" or the new format \"yyyy-MM-dd HH:mm:ss\")"`
	EntryTime int    `json:"entrytime,omitempty" doc:"the time the event was entered"`
	ID        *UUID  `json:"id,omitempty" doc:"the ID of the event"`
	Keyword   string `json:"keyword,omitempty" doc:"List by keyword"`
	Level     string `json:"level,omitempty" doc:"the event level (INFO, WARN, ERROR)"`
	Page      int    `json:"page,omitempty"`
	PageSize  int    `json:"pagesize,omitempty"`
	StartDate string `json:"startdate,omitempty" doc:"the start date range of the list you want to retrieve (use format \"yyyy-MM-dd\" or the new format \"yyyy-MM-dd HH:mm:ss\")"`
	Type      string `json:"type,omitempty" doc:"the event type (see event types)"`
	_         bool   `name:"listEvents" description:"A command to list events."`
}

// ListEventsResponse represents a response of a list query
type ListEventsResponse struct {
	Count int     `json:"count"`
	Event []Event `json:"event"`
}

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

// ListEventTypes list the event types
type ListEventTypes struct {
	Page     int  `json:"page,omitempty"`     // fake
	PageSize int  `json:"pagesize,omitempty"` // fake
	_        bool `name:"listEventTypes" description:"List Event Types"`
}

// ListEventTypesResponse represents a response of a list query
type ListEventTypesResponse struct {
	Count     int         `json:"count"`
	EventType []EventType `json:"eventtype"`
	_         bool        `name:"listEventTypes" description:"List Event Types"`
}
