/**
 * 核心服务接口sdk（golang版）
 *
 * @desc 啪啪运动 核心服务接口sdk
 * ---------------------------------------------------------------------
 * @author		unphp <unphp@qq.com>
 * @date		2018-12-18
 * @copyright	core-utils
 * ---------------------------------------------------------------------
 */

package cooper

import (
	"encoding/json"
	"errors"
	"net/url"
	"PPOSUtils/utils"
)

//BaiduRequestInterface ...
type BaiduRequestInterface interface {
	Params() url.Values
	Post(result interface{}) (int, error)
	SetClient(client *CoreClient)
}

//BaiduRequest ...
type BaiduRequest struct {
	Client *CoreClient
}

//SetClient ...
func (that *BaiduRequest) SetClient(client *CoreClient) {
	that.Client = client
}

////////////////////////////////////////////////////////////////////////////////////////

//BaiduFaceUserAddReturn 注册人脸头像响应
type BaiduFaceUserAddReturn struct {
	FaceToken string            `json:"face_token"` //人脸头像特征值
	Location  map[string]string `json:"location"`   //
}

//BaiduFaceUserAddRequest 注册人脸头像
type BaiduFaceUserAddRequest struct {
	BaiduRequest
	UserId       int64  `json:"user_id"`        //用户id
	GroupId      int64  `json:"group_id"`       //用户分组id
	FaceImageUrl string `json:"face_image_url"` //用户头像url
}

//Params ...
func (that *BaiduFaceUserAddRequest) Params() url.Values {
	var m = make(url.Values)
	m.Set("user_id", ToString(that.UserId))
	m.Set("group_id", ToString(that.GroupId))
	m.Set("face_image_url", that.FaceImageUrl)
	return m
}

//Post ...
func (that *BaiduFaceUserAddRequest) Post(result interface{}) (int, error) {
	//
	_response, _err := that.Client.Post("/baiduFace/userAdd", that)
	if _err != nil {
		return 10001, _err
	}
	var _data ResponseMap
	_data = make(map[string]interface{})
	if _err := _response.ToJSON(&_data); _err != nil {
		return 10002, _err
	}
	_slice := []string{
		"code",
		"msg",
	}
	for _, _k := range _slice {
		if !_data.Has(_k) {
			return 10003, errors.New("请求返回确实字段：" + _k)
		}
	}
	_code, _ := _data.String("code")
	_msg, _ := _data.String("code")
	//
	if _code != "200" {
		return utils.ToInt(_code), errors.New("请求返回错误提示：" + _msg)
	}
	//
	var _resp interface{}
	if _data.Has("result") {
		_resp = _data.Get("result")
	}
	if _data.Has("data") {
		_resp = _data.Get("data")
	}
	_result, _err := json.Marshal(_resp)
	if _err != nil {
		return 10004, errors.New("返回结果不符合格式")
	}
	//
	if _err := json.Unmarshal(_result, result); _err != nil {
		return 10005, errors.New("返回结果不符合格式")
	}
	return 0, nil
}

////////////////////////////////////////////////////////////////////////////////////////

//BaiduFaceUserUpdateReturn 更新人脸头像响应
type BaiduFaceUserUpdateReturn struct {
	FaceToken string            `json:"face_token"` //人脸头像特征值
	Location  map[string]string `json:"location"`   //
}

//BaiduFaceUserUpdateRequest 更新人脸头像
type BaiduFaceUserUpdateRequest struct {
	BaiduRequest
	UserId       int64  `json:"user_id"`        //用户id
	GroupId      int64  `json:"group_id"`       //用户分组id
	FaceImageUrl string `json:"face_image_url"` //用户头像url
}

//Params ...
func (that *BaiduFaceUserUpdateRequest) Params() url.Values {
	var m = make(url.Values)
	m.Set("user_id", ToString(that.UserId))
	m.Set("group_id", ToString(that.GroupId))
	m.Set("face_image_url", that.FaceImageUrl)
	return m
}

//Post ...
func (that *BaiduFaceUserUpdateRequest) Post(result interface{}) (int, error) {
	//
	_response, _err := that.Client.Post("/baiduFace/userUpdate", that)
	if _err != nil {
		return 10001, _err
	}
	//
	var _data ResponseMap
	_data = make(map[string]interface{})
	if _err := _response.ToJSON(&_data); _err != nil {
		return 10002, _err
	}
	_slice := []string{
		"code",
		"msg",
	}
	for _, _k := range _slice {
		if !_data.Has(_k) {
			return 10003, errors.New("请求返回确实字段：" + _k)
		}
	}
	_code, _ := _data.String("code")
	_msg, _ := _data.String("code")
	//
	if _code != "200" {
		return utils.ToInt(_code), errors.New("请求返回错误提示：" + _msg)
	}
	//
	var _resp interface{}
	if _data.Has("result") {
		_resp = _data.Get("result")
	}
	if _data.Has("data") {
		_resp = _data.Get("data")
	}
	_result, _err := json.Marshal(_resp)
	if _err != nil {
		return 10004, errors.New("返回结果不符合格式")
	}
	//
	if _err := json.Unmarshal(_result, result); _err != nil {
		return 10005, errors.New("返回结果不符合格式")
	}
	return 0, nil
}

////////////////////////////////////////////////////////////////////////////////////////

//BaiduFaceUserRemoveFaceRequest 删除人脸头像
type BaiduFaceUserRemoveFaceRequest struct {
	BaiduRequest
	UserId    int64  `json:"user_id"`    //用户id
	GroupId   int64  `json:"group_id"`   //用户分组id
	FaceToken string `json:"face_token"` //用户人脸头像特征值（注册百度人脸库时返回的特征值）
}

//Params ...
func (that *BaiduFaceUserRemoveFaceRequest) Params() url.Values {
	var m = make(url.Values)
	m.Set("user_id", ToString(that.UserId))
	m.Set("group_id", ToString(that.GroupId))
	m.Set("face_token", that.FaceToken)
	return m
}

//Post ...
func (that *BaiduFaceUserRemoveFaceRequest) Post(result interface{}) (int, error) {
	//
	_response, _err := that.Client.Post("/baiduFace/userRemoveFace", that)
	if _err != nil {
		return 10001, _err
	}
	var _data ResponseMap
	_data = make(map[string]interface{})
	if _err := _response.ToJSON(&_data); _err != nil {
		return 10002, _err
	}
	_slice := []string{
		"code",
		"msg",
	}
	for _, _k := range _slice {
		if !_data.Has(_k) {
			return 10003, errors.New("请求返回确实字段：" + _k)
		}
	}
	_code, _ := _data.String("code")
	_msg, _ := _data.String("code")
	//
	if _code != "200" {
		return utils.ToInt(_code), errors.New("请求返回错误提示：" + _msg)
	}
	//
	var _resp interface{}
	if _data.Has("result") {
		_resp = _data.Get("result")
	}
	if _data.Has("data") {
		_resp = _data.Get("data")
	}
	_result, _err := json.Marshal(_resp)
	if _err != nil {
		return 10004, errors.New("返回结果不符合格式")
	}
	//
	if _err := json.Unmarshal(_result, result); _err != nil {
		return 10005, errors.New("返回结果不符合格式")
	}
	return 0, nil
}

////////////////////////////////////////////////////////////////////////////////////////

//BaiduFaceUserRemoveRequest 删除用户
type BaiduFaceUserRemoveRequest struct {
	BaiduRequest
	UserId  int64 `json:"user_id"`  //用户id
	GroupId int64 `json:"group_id"` //用户分组id
}

//Params ...
func (that *BaiduFaceUserRemoveRequest) Params() url.Values {
	var m = make(url.Values)
	m.Set("user_id", ToString(that.UserId))
	m.Set("group_id", ToString(that.GroupId))
	return m
}

//Post ...
func (that *BaiduFaceUserRemoveRequest) Post(result interface{}) (int, error) {
	//
	_response, _err := that.Client.Post("/baiduFace/userRemove", that)
	if _err != nil {
		return 10001, _err
	}
	var _data ResponseMap
	_data = make(map[string]interface{})
	if _err := _response.ToJSON(&_data); _err != nil {
		return 10002, _err
	}
	_slice := []string{
		"code",
		"msg",
	}
	for _, _k := range _slice {
		if !_data.Has(_k) {
			return 10003, errors.New("请求返回确实字段：" + _k)
		}
	}
	_code, _ := _data.String("code")
	_msg, _ := _data.String("code")
	//
	if _code != "200" {
		return utils.ToInt(_code), errors.New("请求返回错误提示：" + _msg)
	}
	//
	var _resp interface{}
	if _data.Has("result") {
		_resp = _data.Get("result")
	}
	if _data.Has("data") {
		_resp = _data.Get("data")
	}
	_result, _err := json.Marshal(_resp)
	if _err != nil {
		return 10004, errors.New("返回结果不符合格式")
	}
	//
	if _err := json.Unmarshal(_result, result); _err != nil {
		return 10005, errors.New("返回结果不符合格式")
	}
	return 0, nil
}

////////////////////////////////////////////////////////////////////////////////////////

//BaiduFaceSearchRequest 人脸搜索
type BaiduFaceSearchRequest struct {
	BaiduRequest
	FaceImageUrl string `json:"face_image_url"` //用户id
	GroupIds     string `json:"group_ids"`      //用户分组id
	ImageType    string `json:"image_type"`     //
}

//Params ...
func (that *BaiduFaceSearchRequest) Params() url.Values {
	var m = make(url.Values)
	m.Set("face_image_url", ToString(that.FaceImageUrl))
	m.Set("group_ids", ToString(that.GroupIds))
	m.Set("image_type", ToString(that.ImageType))
	return m
}

//Post ...
func (that *BaiduFaceSearchRequest) Post(result interface{}) (int, error) {
	//
	_response, _err := that.Client.Post("/baiduFace/search", that)
	if _err != nil {
		return 10001, _err
	}
	//
	var _data ResponseMap
	_data = make(map[string]interface{})
	if _err := _response.ToJSON(&_data); _err != nil {
		return 10002, _err
	}
	_slice := []string{
		"code",
		"msg",
	}
	for _, _k := range _slice {
		if !_data.Has(_k) {
			return 10003, errors.New("请求返回确实字段：" + _k)
		}
	}
	_code, _ := _data.String("code")
	_msg, _ := _data.String("code")
	//
	if _code != "200" {
		return utils.ToInt(_code), errors.New("请求返回错误提示：" + _msg)
	}
	//
	var _resp interface{}
	if _data.Has("result") {
		_resp = _data.Get("result")
	}
	if _data.Has("data") {
		_resp = _data.Get("data")
	}
	_result, _err := json.Marshal(_resp)
	if _err != nil {
		return 10004, errors.New("返回结果不符合格式")
	}
	//
	if _err := json.Unmarshal(_result, result); _err != nil {
		return 10005, errors.New("返回结果不符合格式")
	}
	return 0, nil
}
