package curl

import (
	"bufio"
	"bytes"
	"errors"
	"io"
	"net/http"
	"strings"
	"time"
)

// 接口请求
func ApiCall(url, method string, header map[string]string, body io.Reader, timeOut time.Duration) (rsp *http.Response, err error) {
	method = strings.ToUpper(method)
	if method != "GET" && method != "POST" && method != "PUT" && method != "DELETE" {
		return nil, errors.New("invalid http method")
	}
	if url == "" {
		return nil, errors.New("request url can`t be empty")
	}
	client := &http.Client{}
	if timeOut <= 0 {
		client.Timeout = time.Second * 15
	} else {
		client.Timeout = timeOut
	}
	requestHandle, err := http.NewRequest(method, url, body)
	if err != nil {
		return nil, err
	}
	for k, v := range header {
		requestHandle.Header.Set(k, v)
	}
	return client.Do(requestHandle)
}

// 请求(读取返回字节内容)
func ApiCall2(url, method string, header map[string]string, body io.Reader, timeOut time.Duration) (result []byte, err error) {
	method = strings.ToUpper(method)
	if method != "GET" && method != "POST" && method != "PUT" && method != "DELETE" {
		return nil, errors.New("invalid http method")
	}
	if url == "" {
		return nil, errors.New("request url can`t be empty")
	}
	client := &http.Client{}
	if timeOut <= 0 {
		client.Timeout = time.Second * 15
	} else {
		client.Timeout = timeOut
	}
	requestHandle, err := http.NewRequest(method, url, body)
	if err != nil {
		return nil, err
	}
	for k, v := range header {
		requestHandle.Header.Set(k, v)
	}
	rsp, err := client.Do(requestHandle)
	if err != nil {
		return nil, err
	}
	defer rsp.Body.Close()
	buff := bytes.Buffer{}
	reader := bufio.NewReader(rsp.Body)
	for {
		line, err := reader.ReadBytes('\n')
		if err != nil {
			if err == io.EOF {
				_, err = buff.Write(line)
				if err != nil {
					return nil, err
				}
				break
			}
			return nil, err
		}
		_, err = buff.Write(line)
		if err != nil {
			return nil, err
		}
	}
	return buff.Bytes(), nil
}