package appChargeUtil

import (
	"encoding/json"
	"fmt"

	"goutil/typeUtil"
)

// APP Store充值收据对象
type Receipt struct {
	// Bvrs
	Bvrs string

	// BundleIdentifier
	BundleIdentifier string

	// 产品Id
	ProductId string

	// 交易Id
	TransactionId string

	// 数量
	Quantity int

	// 状态
	Status int
}

// BundleIdentifier是否有效
// bundleIdentifierList：配置的BundleIdentifier列表
// 返回值：
// 是否有效
func (this *Receipt) IsBundleIdentifierValid(bundleIdentifierList []string) bool {
	for _, item := range bundleIdentifierList {
		if this.BundleIdentifier == item {
			return true
		}
	}

	return false
}

// ProductId是否有效
// productId：输入的ProductId
// 返回值：
// 是否有效
func (this *Receipt) IsProductIdValid(productId string) bool {
	return this.ProductId == productId
}

// 转换为字符串
// 返回值：
// 字符串
func (this *Receipt) String() string {
	return fmt.Sprintf("{Bvrs=%s,BundleIdentifier=%s,ProductId=%s,TransactionId=%s,Quantity=%d,Status=%d}", this.Bvrs, this.BundleIdentifier, this.ProductId, this.TransactionId, this.Quantity, this.Status)
}

// 创建新的收据对象
// receiptInfo：收据信息
// 返回值：
// 收据对象
// 错误对象
/*
	{
		"receipt":
		{
			"original_purchase_date_pst":"2015-06-22 20:56:34 America/Los_Angeles", //购买时间,太平洋标准时间
			"purchase_date_ms":"1435031794826", //购买时间毫秒
			"unique_identifier":"5bcc5503dbcc886d10d09bef079dc9ab08ac11bb",//唯一标识符
			"original_transaction_id":"1000000160390314", //原始交易ID
			"bvrs":"1.0",//iPhone程序的版本号
			"transaction_id":"1000000160390314", //交易的标识
			"quantity":"1", //购买商品的数量
			"unique_vendor_identifier":"AEEC55C0-FA41-426A-B9FC-324128342652", //开发商交易ID
			"item_id":"1008526677",//App Store用来标识程序的字符串
			"product_id":"cosmosbox.strikehero.gems60",//商品的标识
			"purchase_date":"2015-06-23 03:56:34 Etc/GMT",//购买时间
			"original_purchase_date":"2015-06-23 03:56:34 Etc/GMT", //原始购买时间
			"purchase_date_pst":"2015-06-22 20:56:34 America/Los_Angeles",//太平洋标准时间
			"bid":"com.cosmosbox.StrikeHero",//iPhone程序的bundle标识
			"original_purchase_date_ms":"1435031794826"//毫秒
		},
		"status":0 //状态码,0为成功
	}
*/
func newReceipt(receiptInfo string) (receiptObj *Receipt, err error) {
	// 创建空对象
	receiptObj = &Receipt{}

	// 将接收的数据转化为map类型的对象
	receiptDataMap := make(map[string]interface{})
	err = json.Unmarshal([]byte(receiptInfo), &receiptDataMap)
	if err != nil {
		return
	}
	mapData := typeUtil.NewMapData(receiptDataMap)

	// 定义、并判断返回状态
	receiptObj.Status, err = mapData.Int("status")
	if err != nil {
		return
	}
	if receiptObj.Status != 0 {
		err = fmt.Errorf("状态:%d不正确", receiptObj.Status)
		return
	}

	// Receipt is actually a child
	receiptDataMap, ok := mapData["receipt"].(map[string]interface{})
	if !ok {
		err = fmt.Errorf("receipt错误")
		return
	}
	mapData = typeUtil.NewMapData(receiptDataMap)

	// 用返回值对本对象的属性进行赋值
	receiptObj.Bvrs, err = mapData.String("bvrs")
	if err != nil {
		return
	}
	receiptObj.BundleIdentifier, err = mapData.String("bid")
	if err != nil {
		return
	}
	receiptObj.ProductId, err = mapData.String("product_id")
	if err != nil {
		return
	}
	receiptObj.TransactionId, err = mapData.String("transaction_id")
	if err != nil {
		return
	}
	receiptObj.Quantity, err = mapData.Int("quantity")
	if err != nil {
		return
	}

	return
}
