package httpclient

import (
	"bytes"
	"encoding/json"
	"io"
	"time"

	"io/ioutil"
	"net/http"
)

var (
	// 3 seconds timeout
	httpClient = &http.Client{Timeout: time.Second * 20}
)

// Get request by url
func Get(url string) (string, int, error) {
	return GetWithHeader(url, nil, nil)
}

func encodeJSON(data interface{}) io.Reader {
	b, _ := json.Marshal(data)

	return bytes.NewReader(b)
}

// Get request by url
func PostWithHeader(url string, data interface{}, header *map[string]string) (string, int, error) {
	req, err := http.NewRequest(http.MethodPost, url, encodeJSON(data))
	if err != nil {
		return "", 0, err
	}
	if header != nil {
		for k, v := range *header {
			req.Header.Set(k, v)
		}
	}
	resp, err := httpClient.Do(req)
	if nil != err {
		return "", 0, err
	}
	respdata, err := ioutil.ReadAll(resp.Body)
	return string(respdata), resp.StatusCode, err
}

// Get request by url
func GetWithHeader(url string, params *map[string]string, header *map[string]string) (string, int, error) {
	req, err := http.NewRequest(http.MethodGet, url, nil)
	if err != nil {
		return "", 0, err
	}
	if header != nil {
		for k, v := range *header {
			req.Header.Set(k, v)
		}
	}
	if params != nil {
		q := req.URL.Query()
		for k, v := range *params {
			q.Add(k, v)
		}
		req.URL.RawQuery = q.Encode()
	}
	resp, err := httpClient.Do(req)
	if nil != err {
		return "", 0, err
	}
	data, err := ioutil.ReadAll(resp.Body)
	return string(data), resp.StatusCode, err
}
