package http

import (
	"github.com/dolanor/caldav-go/utils"
	"net/http"
)

// a client for making HTTP requests
type Client struct {
	native         *http.Client
	server         *Server
	requestHeaders map[string]string
}

func (c *Client) SetHeader(key string, value string) {
	if c.requestHeaders == nil {
		c.requestHeaders = map[string]string{}
	}
	c.requestHeaders[key] = value
}

// downcasts to the native HTTP interface
func (c *Client) Native() *http.Client {
	return c.native
}

// returns the embedded HTTP server reference
func (c *Client) Server() *Server {
	return c.server
}

// executes an HTTP request
func (c *Client) Do(req *Request) (*Response, error) {
	for key, value := range c.requestHeaders {
		req.Header.Add(key, value)
	}
	if resp, err := c.Native().Do((*http.Request)(req)); err != nil {
		return nil, utils.NewError(c.Do, "unable to execute HTTP request", c, err)
	} else {
		return NewResponse(resp), nil
	}
}

// creates a new client for communicating with an HTTP server
func NewClient(server *Server, native *http.Client) *Client {
	return &Client{server: server, native: native}
}

// creates a new client for communicating with a server
// uses the default HTTP client from net/http
func NewDefaultClient(server *Server) *Client {
	return NewClient(server, http.DefaultClient)
}
