package services

import (
	"encoding/base64"
	"encoding/json"
	"errors"
	"fmt"
	"github.com/rdlucklib/rdluck_tools/http"
	"net/url"
)

/*
//名片识别
func init() {
	fmt.Println("start")
	services.GetBusinessCard()
	fmt.Println("end")
}
*/

type BdAccessToken struct {
	AccessToken string `json:"access_token"`
	Error       string
}

func GetAccessToken() (accessTokenStr string, err error) {
	baiduApiKey := "nMfRuZ0qBCsVWfGGKekaoMqh"
	baiduBdSecretKey := "N6xcrUizYijMf47iTDDyPBm3lTOrvVSF"
	getUrl := `https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=` + baiduApiKey + `&client_secret=` + baiduBdSecretKey + `&`
	body, err := http.Post(getUrl, "")
	var accessToken BdAccessToken
	err = json.Unmarshal(body, &accessToken)
	if err != nil {
		fmt.Println("err:" + err.Error())
		return
	}
	if accessToken.Error != "" {
		err = errors.New("获取token失败,Err:" + accessToken.Error)
		return
	}
	accessTokenStr = accessToken.AccessToken
	return
}

type BdBussinessCard struct {
	Errno          int    `json:"error_code"`
	ErrorMsg       string `json:"error_msg"`
	Logid          string
	WordsResultNum int
	WordsResult    struct {
		ADDR    []string `json:"ADDR"`
		FAX     []string `json:"FAX"`
		MOBILE  []string `json:"MOBILE"`
		NAME    []string `json:"NAME"`
		PC      []string `json:"PC"`
		URL     []string `json:"URL"`
		TEL     []string `json:"TEL"`
		COMPANY []string `json:"COMPANY"`
		TITLE   []string `TITLE`
		EMAIL   []string `EMAIL`
	} `json:"words_result"`
	//{"log_id":1332206693559304192,"error_msg":"target detect error","error_code":282102}
}

func GetBusinessCard(imgUrl string) (item *BdBussinessCard, err error) {
	imgBody, err := http.Get(imgUrl)
	if err != nil {
		return
	}
	//rnStr := utils.GetRandStringNoSpecialChar(5)
	//savePath := time.Now().Format(utils.FormatDateTimeUnSpace) + rnStr + ".jpg"
	//err = file.SaveFile(imgBody, savePath)
	//if err != nil {
	//	return
	//}
	//defer func() {
	//	os.Remove(savePath)
	//}()
	accessToken, err := GetAccessToken()
	fmt.Println("accessToken")
	fmt.Println(accessToken)
	if err != nil {
		fmt.Print("GetAccessToken Err:" + err.Error())
	}
	bussinessCardUrl := `https://aip.baidubce.com/rest/2.0/ocr/v1/business_card?access_token=` + accessToken
	//ff, _ := os.Open(savePath)
	//defer ff.Close()
	//sourcebuffer := make([]byte, 500000)
	//n, _ := ff.Read(sourcebuffer)
	//sourcestring := base64.StdEncoding.EncodeToString(sourcebuffer[:n])
	imageBase64 := base64.StdEncoding.EncodeToString(imgBody)
	imgData := imageBase64
	param := url.Values{}
	param.Set("image", imgData)
	cardBody, err := http.Post(bussinessCardUrl, param.Encode())
	fmt.Println("body:", string(cardBody))
	//fmt.Println(string(cardBody))
	if err != nil {
		fmt.Println("err:", err.Error())
		return
	}
	err = json.Unmarshal(cardBody, &item)
	if err != nil {
		fmt.Println("line err:", err.Error())
	}
	return
}

type CardAccurate struct {
	WordsResultNum int `json:"words_result_num"`
	WordsResult    []struct {
		Words string `json:"words"`
	} `json:"words_result"`
	ErrorCode int    `json:"error_code"`
	ErrorMsg  string `json:"error_msg"`
}

//通用文字(高精度)
func GetBusinessCardByAccurate(imgUrl string) (item *CardAccurate, err error) {
	imgBody, err := http.Get(imgUrl)
	if err != nil {
		return
	}
	//rnStr := utils.GetRandStringNoSpecialChar(5)
	//savePath := time.Now().Format(utils.FormatDateTimeUnSpace) + rnStr + ".jpg"
	//err = file.SaveFile(imgBody, savePath)
	//if err != nil {
	//	return
	//}
	//defer func() {
	//	os.Remove(savePath)
	//}()
	//
	//nowStr:=time.Now().Format(utils.FormatDateTimeUnSpace)
	//outPath := "./"+nowStr+".jpg"
	//缩放

	//file, err := os.Open(savePath)
	//if err != nil {
	//	fmt.Println("file err:" + err.Error())
	//	return
	//}
	//
	//// decode jpeg into image.Image
	//img, err := jpeg.Decode(file)
	//if err != nil {
	//	fmt.Println("jpeg Decode:" + err.Error())
	//	return
	//}
	//width:=img.Bounds().Dx()
	//height:=img.Bounds().Dy()
	//fmt.Println(width,height)
	//
	//if width>=4096 {
	//	width=4000
	//}
	//
	//if height>=4096 {
	//	height=4000
	//}
	//
	//file.Close()
	//
	//fmt.Println(width,height)
	//
	//m := resize.Resize(uint(width),uint(height), img, resize.Lanczos3)
	//
	//out, err := os.Create(outPath)
	//if err != nil {
	//	fmt.Println("Create:" + err.Error())
	//	return
	//}
	//defer out.Close()
	//
	//jpeg.Encode(out, m, nil)

	accessToken, err := GetAccessToken()
	fmt.Println("accessToken")
	fmt.Println(accessToken)
	if err != nil {
		fmt.Print("GetAccessToken Err:" + err.Error())
	}
	bussinessCardUrl := `https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic?access_token=` + accessToken
	//ff, _ := os.Open(outPath)
	//defer ff.Close()
	//sourcebuffer := make([]byte, 500000)
	//n, _ := ff.Read(sourcebuffer)
	//sourcestring := base64.StdEncoding.EncodeToString(sourcebuffer[:n])
	//imgData := sourcestring

	imageBase64 := base64.StdEncoding.EncodeToString(imgBody)

	param := url.Values{}
	param.Set("image", imageBase64)
	cardBody, err := http.Post(bussinessCardUrl, param.Encode())
	if err != nil {
		fmt.Println("err:", err.Error())
		return
	}
	err = json.Unmarshal(cardBody, &item)
	return
}

//通用文字(高精度)
func GetBdGeneralBasic(imgUrl string) (item *CardAccurate, err error) {
	imgBody, err := http.Get(imgUrl)
	if err != nil {
		return
	}

	accessToken, err := GetAccessToken()
	if err != nil {
		fmt.Print("GetAccessToken Err:" + err.Error())
	}
	bussinessCardUrl := `https://aip.baidubce.com/rest/2.0/ocr/v1/handwriting?access_token=` + accessToken

	imageBase64 := base64.StdEncoding.EncodeToString(imgBody)

	param := url.Values{}
	param.Set("image", imageBase64)
	cardBody, err := http.Post(bussinessCardUrl, param.Encode())
	if err != nil {
		fmt.Println("err:", err.Error())
		return
	}
	err = json.Unmarshal(cardBody, &item)
	return
}