package internal

import (
	"bytes"
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"io"
	"io/ioutil"
	"mime/multipart"
	"net/http"
	"strings"
	"wss-pool/config"
	"wss-pool/logging/applogger"
	"wss-pool/logging/perflogger"
)

var (
	ResultStr      = ""
	QueryError     = "Query failed"
	QuerySuccess   = "query was successful"
	QueryToken     = "Token failure"
	ParameterError = "参数错误"
	PhoneError     = "电话号码不正确"
	PassWordError  = "密码不正确"
	TokenError     = "登录成功并且生成新的token"
	UserIdError    = "用户Id不正确"
	CodeError      = "验证码不正确"
)

func HttpGet(url string) (string, error) {
	resp, err := http.Get(url)
	if err != nil {
		return "", err
	}
	defer resp.Body.Close()
	result, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		applogger.Error("ioutil.ReadAll err: %v", err)
		return "", err
	}

	return string(result), err
}

// 统一请求Get方法
func HttpGetApi(url string) (map[string]interface{}, error) {
	logger := perflogger.GetInstance()
	logger.Start()

	resp, err := http.Get(url)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	//logger.StopAndLog("GET", url)

	var status map[string]interface{}
	if err := json.NewDecoder(resp.Body).Decode(&status); err != nil {
		applogger.Error("NewDecoder err: %v", err)
		return nil, err
	}

	return status, err
}

func GetWithHeader(url string, headers map[string]string) (map[string]interface{}, error) {
	client := &http.Client{}

	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		return nil, err
	}
	for key, header := range headers {
		req.Header.Set(key, header)
	}
	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	result, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		applogger.Error("select err: %v", err)
		return nil, err
	}
	if strings.Contains(string(result), "html") {
		return nil, nil
	}

	var status map[string]interface{}
	if err := json.NewDecoder(resp.Body).Decode(&status); err != nil {
		applogger.Error("json NewDecoder err: %v", err)
		return nil, err
	}
	return status, nil
}

// 股票静态数据接入
func HttpGetDo(url string) (string, error) {
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		applogger.Error("http NewRequest err: %v", err)
		return "", err
	}

	req.Header.Add("X-RapidAPI-Key", config.Config.ShareGather.RapidApiKey)
	req.Header.Add("X-RapidAPI-Host", config.Config.ShareGather.RapidApiHost)

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		applogger.Error("http DefaultClient Do err: %v", err)
		return "", err
	}
	defer res.Body.Close()

	body, err := io.ReadAll(res.Body)
	if err != nil {
		applogger.Error("io ReadAll err: %v", err)
		return "", err
	}

	return string(body), nil
}

func HttpGetDoNew(url string) (map[string]interface{}, error) {
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		applogger.Error("NewRequest err: %v", err)
		return nil, err
	}

	req.Header.Add("X-RapidAPI-Key", config.Config.ShareGather.RapidApiKey)
	req.Header.Add("X-RapidAPI-Host", config.Config.ShareGather.RapidApiHost)

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		applogger.Error("http DefaultClient Do err: %v", err)
		return nil, err
	}
	defer res.Body.Close()

	var status map[string]interface{}
	if err := json.NewDecoder(res.Body).Decode(&status); err != nil {
		applogger.Error("json NewDecoder err: %v", err)
		return nil, err
	}

	return status, nil
}

func HttpPost(url string, body string) (string, error) {
	resp, err := http.Post(url, "application/json", strings.NewReader(body))
	if err != nil {
		return "", err
	}
	defer resp.Body.Close()
	result, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return "", err
	}

	return string(result), err
}

func HttpPostFrom(url string, postData map[string]string) (string, error) {
	fmt.Println(url)
	payload := &bytes.Buffer{}
	w := multipart.NewWriter(payload)
	for k, v := range postData {
		w.WriteField(k, v)
	}
	w.Close()
	client := &http.Client{}
	req, _ := http.NewRequest("POST", url, payload)
	req.Header.Set("Content-Type", w.FormDataContentType())
	resp, err := client.Do(req)
	if err != nil {
		return "", err
	}
	data, err := ioutil.ReadAll(resp.Body)
	resp.Body.Close()
	return string(data), err
}

// Unified return format
func GinResult(code int, value interface{}, msg string) interface{} {
	return gin.H{
		"code":    code,
		"data":    value,
		"message": msg,
	}
}