package pdd

import (
	"bytes"
	"duoduo/conf"
	"duoduo/tools"
	"duoduo/tools/app"
	"fmt"
	"io/ioutil"
	"net/http"
	"sort"
)

func PostPdd(inputObj interface{}, outputObj interface{}, function string) error {

	//数据转json
	jsonData, err := tools.JsonMarshal(inputObj)
	if err != nil {
		fmt.Println(err.Error())
		return err
	}
	var jsonStr = []byte(jsonData) //转换二进制
	buffer := bytes.NewBuffer(jsonStr)

	fmt.Print("jsonData = ", jsonData)

	confIni, errConf := conf.ConnIni()
	if errConf != nil {
		fmt.Println(errConf)
	}

	path := confIni.MustValue("pdd", "api_http")
	fmt.Print(path)
	//path = "https://gw-api.pinduoduo.com/api/router?type=pdd.ddk.goods.search&data_type=JSON&client_id=a5d05569c6584a50bfb6600b2d150bae&timestamp=1620461572&sign=8F2C23805C8B8A388AFB512DD3EAD727"

	request, err := http.NewRequest("POST", path, buffer)
	if err != nil {
		fmt.Println(err.Error())
		return err
	}
	request.Header.Set("Content-Type", "application/json;charset=UTF-8")
	client := http.Client{}
	//创建客户端
	resp, err := client.Do(request) //发送请求
	if err != nil {
		fmt.Printf("client.Do%v", err)
		return err
	}
	respBytes, err := ioutil.ReadAll(resp.Body)
	fmt.Print(string(respBytes))

	return nil

}

func PostDDk(inputObj interface{}, outputObj interface{}) (string, error) {
	//数据转json
	jsonData, err := tools.JsonMarshal(inputObj)
	if err != nil {
		return "", err
	}
	fmt.Print(jsonData)
	var jsonStr = []byte(jsonData) //转换二进制
	buffer := bytes.NewBuffer(jsonStr)
	confIni, errConf := conf.ConnIni()
	if errConf != nil {
		return "", err
	}

	path := confIni.MustValue("pdd", "api_http")
	fmt.Print(path)

	request, err := http.NewRequest("POST", path, buffer)
	if err != nil {
		fmt.Println(err.Error())
		return "", err
	}
	request.Header.Set("Content-Type", "application/json;charset=UTF-8")
	client := http.Client{}
	//创建客户端
	resp, err := client.Do(request) //发送请求
	if err != nil {
		fmt.Printf("client.Do%v", err)
		return "", err
	}
	respBytes, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return "", err
	}
	fmt.Print("respBytes =           ", string(respBytes))

	return string(respBytes), nil

}

func DDKSign(inputObj interface{}) (string, error) {

	jsonData, err := tools.JsonMarshal(inputObj)
	if err != nil {
		return "", err
	}
	pddSearch := make(map[string]string)
	err = tools.JsonUnmarshal(jsonData, &pddSearch)
	if err != nil {
		return "", err
	}

	confIni, errConf := conf.ConnIni()
	if errConf != nil {
		return "", err
	}

	path := confIni.MustValue("pdd", "api_http")
	fmt.Print(path)

	var ks []string
	for k, v := range pddSearch {
		fmt.Print(k)
		fmt.Print(v)
		if v != "sign" {
			ks = append(ks, k)
		}

	}
	sort.Strings(ks)
	plainText := confIni.MustValue("pdd", "client_secret")
	//排序后拼接数据
	for i := 0; i < len(ks); i++ {
		fmt.Print(ks[i])
		plainText = plainText + ks[i]
		plainText = plainText + pddSearch[ks[i]]
	}

	plainText += confIni.MustValue("pdd", "client_secret")
	fmt.Print("plainText = ", plainText)
	sign := tools.MD5(plainText)
	fmt.Print(sign)

	return sign, nil
}

//调用阿里接口
func Post(inputObj interface{}, outputObj interface{}, function string) error {
	//加载配置
	confIni, errConf := conf.ConnIni()
	if errConf != nil {
		fmt.Println(errConf)
	}

	hostAdd := fmt.Sprintf("%s", confIni.MustValue("aliSet", "ali_host"))
	fmt.Println(hostAdd)

	//数据转json
	jsonData, err := tools.JsonMarshal(inputObj)
	if err != nil {
		fmt.Println(err.Error())
		return err
	}
	app.TispELKLogs(function, "POST", jsonData)

	fmt.Print("json = ", jsonData)

	request, err := http.NewRequest("POST", hostAdd, bytes.NewBuffer([]byte(jsonData)))
	if err != nil {
		fmt.Println(err.Error())
		return err
	}
	request.Header.Set("Content-Type", "application/json;charset=UTF-8")
	client := http.Client{}
	//创建客户端
	resp, err := client.Do(request) //发送请求
	if err != nil {
		fmt.Printf("client.Do%v", err)
		return err
	}
	respBytes, err := ioutil.ReadAll(resp.Body)

	if err != nil {
		fmt.Printf("ioutil.ReadAll%v", err)
		return err
	}
	fmt.Println(string(respBytes))
	err = tools.JsonUnmarshal(string(respBytes), outputObj)
	if err != nil {
		return err
	}
	app.TispELKOutDataLogs(function, "POST", string(respBytes))
	return nil

	////byte数组直接转成string,优化内存
	//str := (*string)(unsafe.Pointer(&respBytes))

}