package jdshopapi

import (
	"bytes"
	"crypto/md5"
	"encoding/base64"
	"fmt"
	"image"
	"image/gif"
	"image/jpeg"
	"image/png"
	"io/ioutil"
	"math"
	"net/http"
	"regexp"
	"strings"
	"testing"

	"git.rosy.net.cn/baseapi/platformapi"
	"git.rosy.net.cn/baseapi/utils"
	"git.rosy.net.cn/jx-callback/business/model"
)

var (
	skuNamePat = regexp.MustCompile(`([\(（\[【][^\(（\[【\)）\]】]*[\)）\]】])?(.*?)([(（].*[)）])?\s*约?([1-9][\d\.]*)(g|G|kg|kG|Kg|KG|l|L|ml|mL|Ml|ML|克)\s*([(（].*[)）])?\s*(?:\/|／|)\s*([^\s（）()]{0,2})(\s.*)?$\s*([（(].*[）)])?$`)
)

func TestFindShopCategories(t *testing.T) {
	result, err := api.FindShopCategories()
	if err != nil {
		t.Fatal(err)
	}
	t.Log(utils.Format4Output(result, false))
}

func TestDeleteShopCategory(t *testing.T) {
	result, err := api.DeleteShopCategory(14439186)
	if err != nil {
		t.Fatal(err)
	}
	t.Log(utils.Format4Output(result, false))
}

func TestUploadPicture(t *testing.T) {
	data, _, _ := DownloadFileByURL("http://image.jxc4.com/image/5de25b52598d7327b17399d6ddba0197.jpg")
	// img, outMimeType, _ := Binary2Image(data, "")
	// result2, _ := Image2Binary(img, outMimeType)
	fmt.Println(base64.StdEncoding.EncodeToString(data))
	//result, err := api.UploadPicture(data, 0, "noGoodsImg")
	//if err != nil {
	//	t.Fatal(err)
	//}
	//t.Log(utils.Format4Output(result, false))
}

func DownloadFileByURL(fileURL string) (bodyData []byte, fileMD5 string, err error) {
	response, err := http.Get(fileURL)
	if err == nil {
		defer response.Body.Close()
		if response.StatusCode == http.StatusOK {
			if bodyData, err = ioutil.ReadAll(response.Body); err == nil {
				fileMD5 = fmt.Sprintf("%X", md5.Sum(bodyData))
			}
		} else {
			err = platformapi.ErrHTTPCodeIsNot200
		}
	}
	return bodyData, fileMD5, err
}

func Binary2Image(binaryData []byte, mimeType string) (img image.Image, outMimeType string, err error) {
	if mimeType == "" {
		mimeType = http.DetectContentType(binaryData)
	}
	switch mimeType {
	case model.MimeTypeJpeg:
		img, err = jpeg.Decode(bytes.NewReader(binaryData))
	case model.MimeTypePng:
		img, err = png.Decode(bytes.NewReader(binaryData))
	case model.MimeTypeGif:
		img, err = gif.Decode(bytes.NewReader(binaryData))
	}
	return img, mimeType, err
}

func Image2Binary(img image.Image, mimeType string) (binaryData []byte, err error) {
	buf := new(bytes.Buffer)
	switch mimeType {
	case model.MimeTypeJpeg:
		jpeg.Encode(buf, img, nil)
	case model.MimeTypePng:
		png.Encode(buf, img)
	case model.MimeTypeGif:
		gif.Encode(buf, img, nil)
	}
	binaryData = buf.Bytes()
	return binaryData, err
}

func TestGetFeightMb(t *testing.T) {
	err := api.GetFeightMb()
	if err != nil {
		t.Fatal(err)
	}
	// t.Log(utils.Format4Output(result, false))
}

func TestCreateSku(t *testing.T) {
	var images []*CreateSkuParamImages
	var skus []*CreateSkuParamSkus
	var attrs []*CreateSkuParamAttrs
	// var attrs2 []*CreateSkuParamAttrs
	// var attrs3 []*CreateSkuParamAttrs
	var features []*CreateSkuParamFeatures
	feature := &CreateSkuParamFeatures{
		Key:   "is7ToReturn",
		Value: "0",
	}
	features = append(features, feature)
	// desc = "aa"
	// desc := `<p>因生鲜比较脆弱，发货途中如果有磕碰损坏，请收到联系客服，闪电赔付。请核对好地址，发货后不可修改地址，因改地址导致损坏不能赔付，谢谢理解</p><p><img style="width:auto;height:auto;max-width:100%;" src="//img10.360buyimg.com/imgzone/jfs/t1/111969/32/6692/171733/5ebbb9daE5bedb5b2/38350dca19e2b9d2.jpg"><br></p><p><br></p>`
	// desc := `<p>因生鲜比较脆弱，发货途中如果有磕碰损坏，请收到联系客服，闪电赔付。请核对好地址，发货后不可修改地址，因改地址导致损坏不能赔付，谢谢理解</p><p><img style="width:auto;height:auto;max-width:100%;" src="//img10.360buyimg.com/imgzone/jfs/t1/126814/22/1326/472568/5ebb888dEa2cfb5f6/c0c81db660994246.jpg"><br></p><p><br></p>`
	ware := &CreateSkuParamWare{
		Title:         "测试商品1",
		BrandID:       44259,
		ShopCategorys: []int{15602360},
		CategoryID:    12247,
		// TransportID: TransportID,
		// MobileDesc:   "测试",
		// Introduction: "测试",
		// WareStatus: 1,
		// OuterID:     "1",
		Weight: 230,
		Height: 100,
		Length: 100,
		Width:  100,
		// JdPrice:     20,
		MarketPrice: 2300,
		VenderID:    10569615,
		// PromiseID:   JdsPromiseID,
	}
	// ware.Features = features
	ware.MobileDesc = "aa"
	ware.Introduction = "<p>aa</p>"
	image := &CreateSkuParamImages{
		ColorID:  "0000000000",
		ImgIndex: 1,
		ImgURL:   "jfs/t1/142006/30/15024/504060/5fb636d4Ef12079f7/2adad323cbcf7c52.jpg",
		// Type:     "com.jd.pop.ware.ic.api.domain.image",
		// Type2:    "com.jd.pop.ware.ic.api.domain.Image",
	}
	images = append(images, image)
	ware.Images = images
	sku := &CreateSkuParamSkus{
		JdPrice:  100,
		StockNum: 100,
		Type:     "com.jd.pop.ware.ic.api.domain.sku",
		Type2:    "com.jd.pop.ware.ic.api.domain.Sku",
		// OuterID:  "1",
	}
	// sku2 := &CreateSkuParamSkus{
	// 	JdPrice:  10,
	// 	StockNum: 1,
	// Type:     "com.jd.pop.ware.ic.api.domain.sku",
	// Type2:    "com.jd.pop.ware.ic.api.domain.Sku",
	// OuterID:  "2",
	// }
	// attr1 := &CreateSkuParamAttrs{
	// 	AttrID:     "109692",
	// 	AttrValues: []string{"613613"},
	// }
	// attr2 := &CreateSkuParamAttrs{
	// 	AttrID:     "109897",
	// 	AttrValues: []string{"613771"},
	// }
	// attr3 := &CreateSkuParamAttrs{
	// 	AttrID:     "160508",
	// 	AttrValues: []string{"0.5"},
	// }
	//attr4 := &CreateSkuParamAttrs{
	//	AttrID:     "140190",
	//AttrValues: []string{"730802"},
	//}
	// attr5 := &CreateSkuParamAttrs{
	// 	AttrID:     "1000022043",
	// 	AttrValues: []string{"2515313135"},
	// }
	// attr6 := &CreateSkuParamAttrs{
	// 	AttrID:     "1001027606",
	// 	AttrValues: []string{"2440272539"},
	// }
	// attrs = append(attrs, attr1)
	// attrs = append(attrs, attr2)
	// attrs = append(attrs, attr3)
	//attrs = append(attrs, attr4)
	// attrs2 = append(attrs2, attr5)
	// attrs3 = append(attrs3, attr6)
	ware.MultiCateProps = attrs
	// sku2.SaleAttrs = attrs3
	// sku.SaleAttrs = attrs2
	skus = append(skus, sku)
	// skus = append(skus, sku2)
	// ware.Skus = skus
	result, err := api.CreateWare(ware, skus)
	if err != nil {
		t.Fatal(err)
	}
	t.Log(utils.Format4Output(result, false))
}

func TestFindVendorCategories(t *testing.T) {
	result, err := api.FindVendorCategories()
	if err != nil {
		t.Fatal(err)
	}
	t.Log(utils.Format4Output(result, false))
}

func TestFindAttrs(t *testing.T) {
	result, err := api.FindAttrs(12247)
	if err != nil {
		t.Fatal(err)
	}
	t.Log(utils.Format4Output(result, false))
}

func TestFindValuesByAttrId(t *testing.T) {
	result, no, err := api.FindValuesByAttrId(1000022043)
	if err != nil {
		t.Fatal(err)
	}
	t.Log(utils.Format4Output(result, false))
	fmt.Println(no)
}

func TestSaveVenderAttrValue(t *testing.T) {
	_, err := api.SaveVenderAttrValue("100g", 1001027606, 13577, 2)
	if err != nil {
		t.Fatal(err)
	}
	// t.Log(utils.Format4Output(result, false))
}

func TestDeleteWare(t *testing.T) {
	err := api.DeleteWare(10021536917364)
	if err != nil {
		t.Fatal(err)
	}
	// t.Log(utils.Format4Output(result, false))
}

func TestUpOrDown(t *testing.T) {
	err := api.UpOrDown(14518369562, 2)
	if err != nil {
		t.Fatal(err)
	}
	// t.Log(utils.Format4Output(result, false))
}

func TestUpdateWare(t *testing.T) {
	err := api.UpdateWare(&UpdateWareParam{
		WareID: 14545996691,
		Title:  "进口凤梨",
		Features: []*CreateSkuParamFeatures{
			&CreateSkuParamFeatures{
				Key:   "fdms",
				Value: "1",
			},
		},
	})
	if err != nil {
		t.Fatal(err)
	}
	// t.Log(utils.Format4Output(result, false))
}

func TestFindSkuStock(t *testing.T) {
	err := api.FindSkuStock(69353673334)
	if err != nil {
		t.Fatal(err)
	}
	// t.Log(utils.Format4Output(result, false))
}

func TestQueryPicture(t *testing.T) {
	result, err := api.QueryPicture("[畅销]香蕉1")
	if err != nil {
		t.Fatal(err)
	}
	t.Log(utils.Format4Output(result, false))
}

func TestImageUpdate(t *testing.T) {
	err := api.ImageUpdate(14535527473, 1, "jfs/t1/116844/10/7385/198098/5ec3853bEa53d0730/168e5654c6309c96.jpg")
	if err != nil {
		t.Fatal(err)
	}
	// t.Log(utils.Format4Output(result, false))
}

func TestSearchWare4Valid(t *testing.T) {
	result, err := api.SearchWare4Valid("帝王蟹约2.25-2.5kg/只", 1, 100)
	if err != nil {
		t.Fatal(err)
	}
	t.Log(utils.Format4Output(result, false))
}

func TestUpdateSkus(t *testing.T) {
	_, err := api.UpdateSkus(&UpdateSkusParam{
		WareID: 14600091031,
		Skus: []*UpdateSkusParamSkus{
			&UpdateSkusParamSkus{
				WareID:   14600091031,
				SkuID:    70357447332,
				JdPrice:  7.5,
				StockNum: "9999",
				SaleAttrs: []*CreateSkuParamAttrs{
					&CreateSkuParamAttrs{
						AttrID:     "1001027602",
						AttrValues: []string{"2441658643"},
					},
				},
				Type:  "com.jd.pop.ware.ic.api.domain.sku",
				Type2: "com.jd.pop.ware.ic.api.domain.Sku",
			},
		},
	})
	if err != nil {
		t.Fatal(err)
	}
}

func TestDeleteSku(t *testing.T) {
	err := api.DeleteSku(69576828876)
	if err != nil {
		t.Fatal(err)
	}
	// t.Log(utils.Format4Output(result, false))
}

func TestFindSkuById(t *testing.T) {
	result, err := api.FindSkuById(10024685331653)
	if err != nil {
		t.Fatal(err)
	}
	t.Log(utils.Format4Output(result, false))
}

func TestUpdateWareMarketPrice(t *testing.T) {
	err := api.UpdateWareMarketPrice(14539778638, 500)
	if err != nil {
		t.Fatal(err)
	}
	// t.Log(utils.Format4Output(result, false))
}

func TestFindOpReason(t *testing.T) {
	result, err := api.FindOpReason(14519009105)
	if err != nil {
		t.Fatal(err)
	}
	t.Log(utils.Format4Output(result, false))
}

func TestAAAA(t *testing.T) {
	var (
		lng = 114.893295
		lat = 25.85793
	)
	const (
		maxRadius          = 5000
		maxStoreCount4User = 5
	)
	lng2, _ := ConvertDistanceToLogLat(lng, lat, float64(maxRadius), 90)
	_, lat2 := ConvertDistanceToLogLat(lng, lat, float64(maxRadius), 0)
	lng1 := lng - (lng2 - lng)
	lat1 := lat - (lat2 - lat)
	fmt.Println(lng1, lng2, lat1, lat2)
}

func ConvertDistanceToLogLat(lng, lat, distance, angle float64) (newLng, newLat float64) {
	oneDu := 111319.55                                                                      // 单位为米
	newLng = lng + (distance*math.Sin(angle*math.Pi/180))/(oneDu*math.Cos(lat*math.Pi/180)) //将距离转换成经度的计算公式
	newLat = lat + (distance*math.Cos(angle*math.Pi/180))/oneDu                             //将距离转换成纬度的计算公式
	return newLng, newLat
}

func TestFindWareById(t *testing.T) {
	result, err := api.FindWareById(10020536637379)
	if err != nil {
		t.Fatal(err)
	}
	t.Log(utils.Format4Output(result, false))
}

func TestTransparentImageAdd(t *testing.T) {
	str := "12300548611401"
	// suffix := str[12:len(str)]
	fmt.Println(str[:12])
}

func TestUpdateWareSaleAttrvalueAlias(t *testing.T) {
	err := api.UpdateWareSaleAttrvalueAlias(&UpdateWareSaleAttrvalueAliasParam{
		WareID: 14565234929,
		Props: []*CreateSkuParamAttrs2{
			&CreateSkuParamAttrs2{
				AttrID:         "1000021981",
				AttrValues:     []string{"2453826609"},
				AttrValueAlias: []string{"500g 下午易缺货"},
				Type:           "com.jd.pop.ware.ic.api.domain.prop",
				Type2:          "com.jd.pop.ware.ic.api.domain.Prop",
			},
		},
	})
	if err != nil {
		t.Fatal(err)
	}
	// t.Log(utils.Format4Output(result, false))
}

func TestSearchSkuList(t *testing.T) {
	result, _, err := api.SearchSkuList2([]int{10020537029118})
	if err != nil {
		t.Fatal(err)
	}
	t.Log(utils.Format4Output(result, false))
}

func TestAAAAAA(t *testing.T) {
	result, _, err := api.SearchSkuList(1, 20)
	if err != nil {
		t.Fatal(err)
	}
	t.Log(utils.Format4Output(result, false))
}

func SplitSkuName(skuName string) (prefix, name, comment, specUnit, unit string, specQuality float32) {
	searchResult := skuNamePat.FindStringSubmatch(skuName)
	if searchResult != nil {
		if searchResult[3] != "" {
			comment = searchResult[3]
		} else if searchResult[6] != "" {
			comment = searchResult[6]
		} else if searchResult[8] != "" {
			comment = searchResult[8]
		} else if searchResult[9] != "" {
			comment = searchResult[9]
		}
		// comment = TrimDecorationChar(comment)
		// name = TrimDecorationChar(searchResult[2])
		// if comment != "" {
		// 	// if utf8.RuneCountInString(comment) <= 5 {
		// 	// 	name += "-" + comment
		// 	// 	comment = ""
		// 	// }
		// }
		specUnit = strings.ToLower(strings.Replace(searchResult[5], "克", "g", -1))
		if specUnit == "l" {
			specUnit = "L"
		}
		if searchResult[7] == "" {
			unit = "份"
		} else {
			unit = searchResult[7]
		}
		specQuality = float32(utils.Str2Float64(searchResult[4]))
		// prefix = TrimDecorationChar(searchResult[1])
	}
	return prefix, name, comment, specUnit, unit, specQuality
}

func TestUpdateSkuJdPrice(t *testing.T) {
	err := api.UpdateSkuJdPrice(7038506664, 10)
	if err != nil {
		t.Fatal(err)
	}
	// t.Log(utils.Format4Output(result, false))
}
