// http客户端接口
// 秒寻科技
// 2024-02-21
// 周涛

package util

import (
	"bytes"
	"encoding/json"
	"errors"
	"io"
	"net/http"
	"net/url"
	"strings"
	"time"
)

// Get请求
// strUrl:请求地址
// headerMap:请求头参数
// paramMap:参数
// 返回值：字节数组
func GetRequest(strUrl string, headerMap map[string]string, paramMap map[string]string) ([]byte, error) {
	//指定请求超时时间
	client := &http.Client{
		Timeout: 5 * time.Second, //5秒超时
	}

	//创建一个http请求
	request, err := http.NewRequest(http.MethodGet, strUrl, nil)
	if err != nil {
		return nil, err
	}

	//添加请求头
	request.Header.Add("User-Agent", "chrome")
	for key, v := range headerMap {
		request.Header.Add(key, v)
	}

	//为请求增加查询参数
	params := make(url.Values)
	for key, v := range paramMap {
		if v != "" {
			params.Add(key, v)
		}
	}
	request.URL.RawQuery = params.Encode()

	//发起请求
	resp, err := client.Do(request)
	if err != nil {
		return nil, err
	}
	defer func() {
		_ = resp.Body.Close()
	}()

	//检查状态码，判断请求是否成功
	if resp.StatusCode != 200 {
		return nil, errors.New("请求执行出错")
	}

	//读返回参数
	byteList, err := io.ReadAll(resp.Body)
	if err != nil {
		return nil, err
	}

	return byteList, nil
}

// Post请求-表单
// strUrl:请求地址
// dataMap:表单数据
// 返回值：[]byte数据切片
func PostRequestForm(strUrl string, dataMap map[string]string) ([]byte, error) {
	//指定请求超时时间
	client := &http.Client{
		Timeout: 5 * time.Second, //5秒超时
	}

	data := make(url.Values)
	for key, v := range dataMap {
		data.Add(key, v)
	}
	payload := data.Encode()

	//发请求
	bodyReader := strings.NewReader(payload)
	resp, err := client.Post(strUrl, "application/x-www-form-urlencoded", bodyReader)
	if err != nil {
		return nil, err
	}
	defer func() {
		_ = resp.Body.Close()
	}()

	//检查状态码，判断请求是否成功
	if resp.StatusCode != 200 {
		return nil, errors.New("请求执行出错")
	}

	//读取结果
	byteList, err := io.ReadAll(resp.Body)
	if err != nil {
		return nil, err
	}

	return byteList, nil
}

// Post请求-json
// strUrl:请求地址
// dataModel:结构体
// 返回值：[]byte数据切片
func PostRequestJson(strUrl string, dataModel interface{}) ([]byte, error) {
	//指定请求超时时间
	client := &http.Client{
		Timeout: 5 * time.Second, //5秒超时
	}

	dataList, err := json.Marshal(dataModel)
	if err != nil {
		return nil, err
	}
	bodyReader := bytes.NewReader(dataList)

	//发请求
	resp, err := client.Post(strUrl, "application/json", bodyReader)
	if err != nil {
		return nil, err
	}
	defer func() {
		_ = resp.Body.Close()
	}()

	//检查状态码，判断请求是否成功
	if resp.StatusCode != 200 {
		return nil, errors.New("请求执行出错")
	}

	//读取结果
	byteList, err := io.ReadAll(resp.Body)
	if err != nil {
		return nil, err
	}

	return byteList, nil
}
