1package dnsimple
2
3import (
4	"context"
5	"fmt"
6)
7
8func domainServicesPath(accountID string, domainIdentifier string, serviceIdentifier string) string {
9	if serviceIdentifier != "" {
10		return fmt.Sprintf("/%v/domains/%v/services/%v", accountID, domainIdentifier, serviceIdentifier)
11	}
12	return fmt.Sprintf("/%v/domains/%v/services", accountID, domainIdentifier)
13}
14
15// DomainServiceSettings represents optional settings when applying a DNSimple one-click service to a domain.
16type DomainServiceSettings struct {
17	Settings map[string]string `url:"settings,omitempty"`
18}
19
20// AppliedServices lists the applied one-click services for a domain.
21//
22// See https://developer.dnsimple.com/v2/services/domains/#applied
23func (s *ServicesService) AppliedServices(ctx context.Context, accountID string, domainIdentifier string, options *ListOptions) (*ServicesResponse, error) {
24	path := versioned(domainServicesPath(accountID, domainIdentifier, ""))
25	servicesResponse := &ServicesResponse{}
26
27	path, err := addURLQueryOptions(path, options)
28	if err != nil {
29		return nil, err
30	}
31
32	resp, err := s.client.get(ctx, path, servicesResponse)
33	if err != nil {
34		return servicesResponse, err
35	}
36
37	servicesResponse.HTTPResponse = resp
38	return servicesResponse, nil
39}
40
41// ApplyService applies a one-click services to a domain.
42//
43// See https://developer.dnsimple.com/v2/services/domains/#apply
44func (s *ServicesService) ApplyService(ctx context.Context, accountID string, serviceIdentifier string, domainIdentifier string, settings DomainServiceSettings) (*ServiceResponse, error) {
45	path := versioned(domainServicesPath(accountID, domainIdentifier, serviceIdentifier))
46	serviceResponse := &ServiceResponse{}
47
48	resp, err := s.client.post(ctx, path, settings, nil)
49	if err != nil {
50		return nil, err
51	}
52
53	serviceResponse.HTTPResponse = resp
54	return serviceResponse, nil
55}
56
57// UnapplyService unapplies a one-click services from a domain.
58//
59// See https://developer.dnsimple.com/v2/services/domains/#unapply
60func (s *ServicesService) UnapplyService(ctx context.Context, accountID string, serviceIdentifier string, domainIdentifier string) (*ServiceResponse, error) {
61	path := versioned(domainServicesPath(accountID, domainIdentifier, serviceIdentifier))
62	serviceResponse := &ServiceResponse{}
63
64	resp, err := s.client.delete(ctx, path, nil, nil)
65	if err != nil {
66		return nil, err
67	}
68
69	serviceResponse.HTTPResponse = resp
70	return serviceResponse, nil
71}
72