1package pagerduty
2
3import (
4	"fmt"
5	"net/http"
6
7	"github.com/google/go-querystring/query"
8)
9
10// MaintenanceWindow is used to temporarily disable one or more services for a set period of time.
11type MaintenanceWindow struct {
12	APIObject
13	SequenceNumber uint            `json:"sequence_number,omitempty"`
14	StartTime      string          `json:"start_time"`
15	EndTime        string          `json:"end_time"`
16	Description    string          `json:"description"`
17	Services       []APIObject     `json:"services"`
18	Teams          []APIListObject `json:"teams"`
19	CreatedBy      APIListObject   `json:"created_by"`
20}
21
22// ListMaintenanceWindowsResponse is the data structur returned from calling the ListMaintenanceWindows API endpoint.
23type ListMaintenanceWindowsResponse struct {
24	APIListObject
25	MaintenanceWindows []MaintenanceWindow `json:"maintenance_windows"`
26}
27
28// ListMaintenanceWindowsOptions is the data structure used when calling the ListMaintenanceWindows API endpoint.
29type ListMaintenanceWindowsOptions struct {
30	APIListObject
31	Query      string   `url:"query,omitempty"`
32	Includes   []string `url:"include,omitempty,brackets"`
33	TeamIDs    []string `url:"team_ids,omitempty,brackets"`
34	ServiceIDs []string `url:"service_ids,omitempty,brackets"`
35	Filter     string   `url:"filter,omitempty,brackets"`
36}
37
38// ListMaintenanceWindows lists existing maintenance windows, optionally filtered by service and/or team, or whether they are from the past, present or future.
39func (c *Client) ListMaintenanceWindows(o ListMaintenanceWindowsOptions) (*ListMaintenanceWindowsResponse, error) {
40	v, err := query.Values(o)
41	if err != nil {
42		return nil, err
43	}
44	resp, err := c.get("/maintenance_windows?" + v.Encode())
45	if err != nil {
46		return nil, err
47	}
48	var result ListMaintenanceWindowsResponse
49	return &result, c.decodeJSON(resp, &result)
50}
51
52// CreateMaintenanceWindows creates a new maintenance window for the specified services.
53func (c *Client) CreateMaintenanceWindows(m MaintenanceWindow) (*MaintenanceWindow, error) {
54	data := make(map[string]MaintenanceWindow)
55	data["maintenance_window"] = m
56	resp, err := c.post("/maintenance_windows", data, nil)
57	return getMaintenanceWindowFromResponse(c, resp, err)
58}
59
60// DeleteMaintenanceWindow deletes an existing maintenance window if it's in the future, or ends it if it's currently on-going.
61func (c *Client) DeleteMaintenanceWindow(id string) error {
62	_, err := c.delete("/maintenance_windows/" + id)
63	return err
64}
65
66// GetMaintenanceWindowOptions is the data structure used when calling the GetMaintenanceWindow API endpoint.
67type GetMaintenanceWindowOptions struct {
68	Includes []string `url:"include,omitempty,brackets"`
69}
70
71// GetMaintenanceWindow gets an existing maintenance window.
72func (c *Client) GetMaintenanceWindow(id string, o GetMaintenanceWindowOptions) (*MaintenanceWindow, error) {
73	v, err := query.Values(o)
74	if err != nil {
75		return nil, err
76	}
77	resp, err := c.get("/maintenance_windows/" + id + "?" + v.Encode())
78	return getMaintenanceWindowFromResponse(c, resp, err)
79}
80
81// UpdateMaintenanceWindow updates an existing maintenance window.
82func (c *Client) UpdateMaintenanceWindow(m MaintenanceWindow) (*MaintenanceWindow, error) {
83	resp, err := c.put("/maintenance_windows/"+m.ID, m, nil)
84	return getMaintenanceWindowFromResponse(c, resp, err)
85}
86
87func getMaintenanceWindowFromResponse(c *Client, resp *http.Response, err error) (*MaintenanceWindow, error) {
88	if err != nil {
89		return nil, err
90	}
91	var target map[string]MaintenanceWindow
92	if dErr := c.decodeJSON(resp, &target); dErr != nil {
93		return nil, fmt.Errorf("Could not decode JSON response: %v", dErr)
94	}
95	rootNode := "maintenance_window"
96	t, nodeOK := target[rootNode]
97	if !nodeOK {
98		return nil, fmt.Errorf("JSON response does not have %s field", rootNode)
99	}
100	return &t, nil
101}
102