package utils

import (
	"bytes"
	"encoding/json"
	"fmt"
	"gin-vue-admin/global"
	"gin-vue-admin/model/request"
	"io/ioutil"
	"net/http"
	"time"
)

const (
	payType      = 1 //1: 微信
	platformType = 3 //平台类型 1: saas  3:shop mobile
	sourceCode   = 2 //2:微信小程序
)

/**
 * 收银台
 */
func Pay(data *request.OrderPayReq, payNum int) (interface{}, error) {
	des := "谛医" //描述
	if data.UserType == 2 {
		des = "必康"
	}

	if data.UserCharacter != 0 {
		des = "谛医-远程判读" //描述
		if data.UserType == 2 {
			des = "必康-远程判读"
		}
	}

	//支付信息
	paymentInfo := make(map[string]interface{})
	paymentInfo["app_id"] = &global.GVA_CONFIG.Wx.Appid

	if data.UserType == 2 {
		paymentInfo["app_id"] = &global.GVA_CONFIG.Bkwx.Appid
	}

	paymentInfo["attach_info"] = data.OrderNo
	paymentInfo["goods_des"] = des
	paymentInfo["goods_detail"] = des
	paymentInfo["goods_price"] = data.PayMoney
	paymentInfo["notice_url"] = &global.GVA_CONFIG.Pay.PayCallBack
	paymentInfo["open_id"] = data.Openid
	paymentInfo["pay_type"] = payType
	paymentInfo["platform_info"] = des
	paymentInfo["platform_type"] = platformType
	paymentInfo["source_code"] = sourceCode
	fmt.Println("payConf:", payNum)
	if payNum == 1 {
		paymentInfo["sub_mchid"] = &global.GVA_CONFIG.Wx.Mchid
	} else if payNum == 2 {
		paymentInfo["is_serve"] = 1
		paymentInfo["sub_mchid"] = &global.GVA_CONFIG.Bkwx.Mchid
	} else {
		paymentInfo["is_serve"] = 1
		paymentInfo["sub_mchid"] = &global.GVA_CONFIG.Bkwx.Mchid
	}
	//发起支付
	payUrl := global.GVA_CONFIG.Pay.UnifiedOrder

	result := PayPost(payUrl, paymentInfo, "")

	return result, nil
}

func PayPost(url string, data interface{}, token string) string {
	// 超时时间:10秒
	client := &http.Client{Timeout: 10 * time.Second}
	fmt.Println("请求地址:" + url)

	jsonStr, _ := json.Marshal(data)
	fmt.Println("请求数据:" + string(jsonStr))

	reqest, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))

	if token != "" {
		reqest.Header.Add("Authorization", "Bearer "+token)
		fmt.Println("token:" + token)
	}
	reqest.Header.Add("Content-Type", "application/json")
	reqest.Header.Add("Connection", "keep-alive")
	if err != nil {
		fmt.Println("PayPost Err:", err)
		panic(err)
	}

	resp, _ := client.Do(reqest)
	defer resp.Body.Close()

	result, _ := ioutil.ReadAll(resp.Body)

	fmt.Println("返回数据:" + string(result))
	return string(result)
}