package tencent

import (
	. "code.hoteas.com/golang/hotime/common"
	"crypto/hmac"
	"crypto/sha1"
	"encoding/base64"
	"fmt"
	"io"
	"io/ioutil"
	"net/http"
	gourl "net/url"

	"strings"
	"time"
)

type company struct {
	secretId  string
	secretKey string
}

var Company = company{}

func (that *company) Init(secretId, secretKey string) {
	// 云市场分配的密钥Id
	//secretId := "xxxx"
	//// 云市场分配的密钥Key
	//secretKey := "xxxx"
	that.secretId = secretId
	that.secretKey = secretKey
}

func (that *company) calcAuthorization(source string) (auth string, datetime string, err error) {

	timeLocation, _ := time.LoadLocation("Etc/GMT")
	datetime = time.Now().In(timeLocation).Format("Mon, 02 Jan 2006 15:04:05 GMT")
	signStr := fmt.Sprintf("x-date: %s\nx-source: %s", datetime, source)

	// hmac-sha1
	mac := hmac.New(sha1.New, []byte(that.secretKey))
	mac.Write([]byte(signStr))
	sign := base64.StdEncoding.EncodeToString(mac.Sum(nil))

	auth = fmt.Sprintf("hmac id=\"%s\", algorithm=\"hmac-sha1\", headers=\"x-date x-source\", signature=\"%s\"",
		that.secretId, sign)

	return auth, datetime, nil
}

func (that *company) urlencode(params map[string]string) string {
	var p = gourl.Values{}
	for k, v := range params {
		p.Add(k, v)
	}
	return p.Encode()
}

func (that *company) GetCompany(name string) Map {
	// 云市场分配的密钥Id
	//secretId := "xxxx"
	//// 云市场分配的密钥Key
	//secretKey := "xxxx"
	source := "market"

	// 签名
	auth, datetime, _ := that.calcAuthorization(source)

	// 请求方法
	method := "GET"
	// 请求头
	headers := map[string]string{"X-Source": source, "X-Date": datetime, "Authorization": auth}

	// 查询参数
	queryParams := make(map[string]string)
	queryParams["keyword"] = name
	// body参数
	bodyParams := make(map[string]string)

	// url参数拼接
	url := "https://service-3jnh3ku8-1256140209.gz.apigw.tencentcs.com/release/business4/geet"
	if len(queryParams) > 0 {
		url = fmt.Sprintf("%s?%s", url, that.urlencode(queryParams))
	}

	bodyMethods := map[string]bool{"POST": true, "PUT": true, "PATCH": true}
	var body io.Reader = nil
	if bodyMethods[method] {
		body = strings.NewReader(that.urlencode(bodyParams))
		headers["Content-Type"] = "application/x-www-form-urlencoded"
	}

	client := &http.Client{
		Timeout: 5 * time.Second,
	}
	request, err := http.NewRequest(method, url, body)
	if err != nil {
		fmt.Println(err)
		return nil
	}
	for k, v := range headers {
		request.Header.Set(k, v)
	}
	response, err := client.Do(request)
	if err != nil {
		fmt.Println(err)
		return nil
	}
	defer response.Body.Close()

	bodyBytes, err := ioutil.ReadAll(response.Body)
	if err != nil {
		fmt.Println(err)
		return nil
	}
	res := string(bodyBytes)
	fmt.Println(res)
	return ObjToMap(res)
}
