package idnum

import (
	"encoding/json"
	"errors"
	"fmt"
	"github.com/fonchain_enterprise/micro-account/pkg/cache"
	"io/ioutil"
	"net/http"
	"net/url"
	"strings"
	"time"
)

var param = map[string]string{
	"grant_type":    "client_credentials",
	"client_id":     "AlbWwhnZINIy1YqWP3agQA42",
	"client_secret": "NL2nT4rnGHIcpopBI93a7G85WscluOEH",
}

type IDCheckRes struct {
	ErrorCode int         `json:"error_code"`
	ErrorMsg  string      `json:"error_msg"`
	LogID     int         `json:"log_id"`
	Timestamp int         `json:"timestamp"`
	Cached    int         `json:"cached"`
	Result    interface{} `json:"result"`
}
type TokenInfo struct {
	RefreshToken  string `json:"refresh_token"`
	ExpiresIn     int    `json:"expires_in"`
	Scope         string `json:"scope"`
	SessionKey    string `json:"session_key"`
	AccessToken   string `json:"access_token"`
	SessionSecret string `json:"session_secret"`
}

/*
Tru89O1zosjSCIN2uUlEctbE
rLgGU2gwNvEQAo0UooTwArtvqBTaL3Y3
25346530
*/

func CheckIDNumFromNet(idNum string, name string) error {
	var host = "https://aip.baidubce.com/rest/2.0/face/v3/person/idmatch"
	accessToken, err := getAccessToken()
	fmt.Println("1百度生成token---", accessToken, err)
	if err != nil {
		return err
	}

	uri, err := url.Parse(host)
	if err != nil {
		fmt.Println(err)
		return err
	}
	query := uri.Query()
	query.Set("access_token", accessToken)
	uri.RawQuery = query.Encode()

	var params = map[string]string{}
	params["id_card_number"] = idNum
	params["name"] = name
	sendBody, err := json.Marshal(params)
	if err != nil {
		fmt.Println(err)
		return err
	}
	sendData := string(sendBody)
	client := &http.Client{}
	request, err := http.NewRequest("POST", uri.String(), strings.NewReader(sendData))
	if err != nil {
		fmt.Println(err)
		return err
	}
	request.Header.Set("Content-Type", "application/json")
	response, err := client.Do(request)
	defer response.Body.Close()
	result, err := ioutil.ReadAll(response.Body)
	if err != nil {
		fmt.Println(err)
		return err
	}
	fmt.Println(string(result))
	var res IDCheckRes

	err = json.Unmarshal(result, &res)

	fmt.Println(string(result))
	if err != nil {
		fmt.Println(err)
		return err
	}

	if res.ErrorCode != 0 {
		if res.ErrorCode == 222351 {
			return errors.New("不匹配或者身份证不存在")
		}
		return errors.New("实名认证未通过")
	}

	return nil
}

func getAccessToken() (string, error) {

	var tokenInfo TokenInfo
	var err error
	key := "baidu:Id:access_token" + param["client_id"]
	strCmd := cache.RedisClient.Get(key)

	accessToken := strCmd.Val()
	if accessToken != "" {
		err := json.Unmarshal([]byte(accessToken), &tokenInfo)
		if err != nil {
			return "", err
		}
		return tokenInfo.AccessToken, nil
	}

	accessToken, err = getNewAccessToken()

	if err != nil {
		return "", err
	}

	if merr := cache.RedisClient.Set(key, accessToken, 5*60*1000*time.Millisecond).Err(); merr != nil {
		return "", merr
	}

	err = json.Unmarshal([]byte(accessToken), &tokenInfo)

	if err != nil {
		return "", err
	}

	return tokenInfo.AccessToken, nil
}

func getNewAccessToken() (string, error) {
	accessToken := ""

	var host = "https://aip.baidubce.com/oauth/2.0/token"

	uri, err := url.Parse(host)
	fmt.Println(uri)
	if err != nil {
		fmt.Println(err)
		return accessToken, err
	}
	query := uri.Query()
	for k, v := range param {
		query.Set(k, v)
	}
	uri.RawQuery = query.Encode()

	response, err := http.Get(uri.String())

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

	return string(result), err
}