package excel

import (
	"reflect"
	"testing"
)

type XXXX struct {
	ID                int64  `orm:"column(id)" json:"id"`
	VendorOrderID     string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"`
	VendorOrderID2    string `orm:"column(vendor_order_id2);size(48);index" json:"vendorOrderID2"`
	VendorID          int    `orm:"column(vendor_id)" json:"vendorID"`
	VendorStoreID     string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"`
	StoreID           int    `orm:"column(store_id)" json:"storeID"`      // 外部系统里记录的 jxstoreid
	JxStoreID         int    `orm:"column(jx_store_id)" json:"jxStoreID"` // 根据VendorStoreID在本地系统里查询出来的 jxstoreid
	StoreName         string `orm:"size(64)" json:"storeName"`
	ShopPrice         int64  `json:"shopPrice"`      // 单位为分 门店标价
	SalePrice         int64  `json:"salePrice"`      // 单位为分 售卖价
	ActualPayPrice    int64  `json:"actualPayPrice"` // 单位为分 顾客实际支付
	Weight            int    `json:"weight"`         // 单位为克
	ConsigneeName     string `orm:"size(32)" json:"consigneeName"`
	ConsigneeMobile   string `orm:"size(32)" json:"consigneeMobile"`
	ConsigneeMobile2  string `orm:"size(32)" json:"consigneeMobile2"`
	ConsigneeAddress  string `orm:"size(255)" json:"consigneeAddress"`
	CoordinateType    int    `json:"-"`
	ConsigneeLng      int    `json:"-"`          // 坐标 * （10的六次方）
	ConsigneeLat      int    `json:"-"`          // 坐标 * （10的六次方）
	SkuCount          int    `json:"skuCount"`   // 商品类别数量，即有多少种商品（注意在某些情况下，相同SKU的商品由于售价不同，也会当成不同商品在这个值里）
	GoodsCount        int    `json:"goodsCount"` // 商品个数
	Status            int    `json:"status"`     // 参见OrderStatus*相关的常量定义
	VendorStatus      string `orm:"size(255)" json:"vendorStatus"`
	LockStatus        int    `json:"lockStatus"`
	OrderSeq          int    `json:"orderSeq"` // 门店订单序号
	BuyerComment      string `orm:"size(255)" json:"buyerComment"`
	BusinessType      int    `json:"businessType"`
	CancelApplyReason string `orm:"size(255)" json:"-"` // ""表示没有申请，不为null表示用户正在取消申请
	VendorWaybillID   string `orm:"column(vendor_waybill_id);size(48)" json:"vendorWaybillID"`
	WaybillVendorID   int    `orm:"column(waybill_vendor_id)" json:"waybillVendorID"` // 表示当前承运商，-1表示还没有安排
	DeliveryFlag      int8   `json:"deliveryFlag"`                                    // 第1位为1表示禁止调度器调度三方配送
	DuplicatedCount   int    `json:"-"`                                               // 重复新订单消息数，这个一般不是由于消息重发造成的（消息重发由OrderStatus过滤），一般是业务逻辑造成的
	OriginalData      string `orm:"-" json:"-"`                                       // 只是用于传递数据
	Flag              int8   `json:"flag"`                                            //非运单调整相关的其它状态
}

func TestObj2Excel(t *testing.T) {
	// kk := make([]*model.SkuName, 1)
	// kk[0] = &model.SkuName{
	// 	Name: "haha",
	// }

	kk := []map[string]interface{}{
		map[string]interface{}{
			"key1": 1,
			"key2": 2,
			"key3": 3,
		},
	}
	cc := &Obj2ExcelSheetConfig{
		Title:       "Title",
		Data:        kk,
		CaptionList: []string{"key1", "key2", "key3"},
	}
	Obj2Excel([]*Obj2ExcelSheetConfig{cc})
}

func BenchmarkObj2Excel(b *testing.B) {
	const sliceLen = 1000
	oneData := &XXXX{}
	cc := &Obj2ExcelSheetConfig{
		Title:       "Title",
		CaptionList: nil,
	}
	elmType := reflect.TypeOf(oneData)
	if elmType.Kind() == reflect.Ptr {
		elmType = elmType.Elem()
	}
	for i := 0; i < elmType.NumField(); i++ {
		if jsonTag := elmType.Field(i).Tag.Get("json"); jsonTag != "" && jsonTag != "-" {
			cc.CaptionList = append(cc.CaptionList, jsonTag)
		}
	}
	value := reflect.Indirect(reflect.ValueOf(oneData))
	for i := 0; i < elmType.NumField(); i++ {
		value2 := value.Field(i)
		if value2.Kind() == reflect.String {
			value2.SetString(elmType.Field(i).Name)
		}
	}

	/*
		data := make([]map[string]interface{}, sliceLen)
		for k := range data {
			data[k] = utils.Struct2MapByJson(oneData)
		}
		//*/

	//*
	data := make([]*XXXX, 1000)
	for k := range data {
		copied := *oneData
		data[k] = &copied
	}
	//*/

	cc.Data = data
	for i := 0; i < b.N; i++ {
		Obj2Excel([]*Obj2ExcelSheetConfig{cc})
	}
	// b.Log(utils.Format4Output(data, false))
}
