package jdshopapi

import (
	"encoding/base64"
	"encoding/json"
	"fmt"
	"strings"

	"git.rosy.net.cn/baseapi/utils"
)

type FindShopCategoriesResult struct {
	CID        int64  `json:"cid"`          //123456	分类编号
	VenderID   int    `json:"vender_id"`    //123456	商家编号
	ShopID     int    `json:"shop_id"`      //	123456	店铺编号
	ParentCID  int64  `json:"parent_cid"`   //123456	父分类编号
	OrderNo    int    `json:"order_no"`     //1	分类排序
	Name       string `json:"name"`         //分类1	分类名称
	IsOpen     bool   `json:"is_open"`      //false	是否展开子分类（false，不展开；true，展开）
	IsHomeShow bool   `json:"is_home_show"` //false	是否在首页展示分类（false，前台不展示，true前台展示
	Status     int    `json:"status"`       //	1	状态(1：删除 1：正常)
	CreateTime int64  `json:"create_time"`  //1394089643000	创建时间
	ModifyTime int64  `json:"modify_time"`  //	修改时间。每修改一次此值都会发生变化。
}

type FindVendorCategoriesResult struct {
	ID        int    `json:"id"`
	Fid       int    `json:"fid"`
	AliasName string `json:"aliasName"`
	Lev       int    `json:"lev"`
	IndexID   int    `json:"indexId"`
	Status    int    `json:"status"`
	Created   int64  `json:"created"`
	Name      string `json:"name"`
	Modified  int64  `json:"modified"`
}

type CreateSkuParamWare struct {
	Title           string `json:"title"`                     //是	无	商品名称（限制50个字符以内）
	CategoryID      int    `json:"categoryId"`                //是	无	已经授权过的京东“三级”类目(通过商家授权类目接口获取)
	MultiCategoryID int    `json:"multiCategoryId,omitempty"` //否	无	末级类目ID
	BrandID         int    `json:"brandId"`                   //否	无	不同类目是否必填情况不同，若发布时提示[此类目要求品牌必填]，则表示品牌需要必填。品牌ID获取方式通过商家授权类目接口获取。
	// TemplateID      int    `json:"templateId"`      //        否	无	发布时不可设置
	TransportID int    `json:"transportId,omitempty"` //是	无	运费模板ID
	WareStatus  int    `json:"wareStatus,omitempty"`  //        否	新增仅可以使用 1:从未上架 8:在售(上架)	商品状态1:从未上架 2:自主下架 4:系统下架 8:在售 513:从未上架 待审核 514:自主下架 待审核 516:系统下架 待审核 520:在售 待审核 1025:从未上架 审核不通过 暂时没用 1026:自主下架 审核不通过 暂时没用 1028:系统下架 审核不通过 1032:在售 审核不通过
	OuterID     string `json:"outerId,omitempty"`     //    否	无	商品外部ID,商家自行设置的ID（便于关联京东商品）
	VenderID    int    `json:"venderId"`
	// Is7ToReturn int    `json:"is7ToReturn"` // 0 不支持，1 支持7天， 2支持90天
	// ItemNum         string `json:"itemNum"`         //    否	无	商品货号
	// BarCode         string `json:"barCode"`         //    否	无	商品的条形码.UPC码,SN码,PLU码统称为条形码
	// WareLocation    int    `json:"wareLocation"`    //        否	无	商品产出地区
	// Delivery        int    `json:"delivery"`        //    否	无	商品发货地
	PromiseID int `json:"promiseId,omitempty"` //        否	无	配送时效
	// adWords                //	否	无	商品广告词对象 （单品页显示的优先级低于促销广告词）
	// Wrap        string `json:"wrap"`        //否	无	包装规格（已废弃）
	// PackListing string `json:"packListing"` //       否	无	商品包装清单
	Length int     `json:"length,omitempty"` //   否	无	商品长度,单位mm。根据类目区分                    是                          否必填
	Width  int     `json:"width,omitempty"`  //   否	无	商品宽度,单位mm。根据类目区分                    是                          否必填
	Height int     `json:"height,omitempty"` //   否	无	商品高度,单位mm。根据类目区分                    是                          否必填
	Weight float64 `json:"weight,omitempty"` //   否	无	商品重量,单位kg。根据类目区分                    是                          否必填
	// Props       []struct {
	// 	AttrID     string `json:"attrID"`     // 否	无	属性ID
	// 	AttrValues string `json:"attrValues"` //否	无	属性值ID数组
	// } `json:"props"` //       否	无	属性列表(已废弃 请使用multiCateProps,已经按照类目限制使用3级类目修改，请及时迁移到多级类目)
	Features      []*CreateSkuParamFeatures `json:"features,omitempty"` //           否	无	商品维度的特殊属性 目前两个特殊属性 IBS、FBP、FCS、SCF 4种商家类型【规格型号】 model和【销售单位】 unit 字段且为必填（如 个、盒、袋等）请勿填写公司名称。
	Images        []*CreateSkuParamImages   `json:"images"`             // 是	无	商品图片列表，发布时必须有主图(颜色为十个0，index为1的图片)
	ShopCategorys []int                     `json:"shopCategorys"`      // 否	无	商品店内分类（商家接口获取到的最末级的分类）
	MobileDesc    string                    `json:"mobileDesc"`         // 是	无	移动版的商品介绍 长度限制10W个字符
	Introduction  string                    `json:"introduction"`       // 是	无	PC版的商品介绍 长度限制10W个字符
	// AfterSales    string                  `json:"afterSales"`    //       否	无	售后服务
	JdPrice     float64 `json:"jdPrice,omitempty"` //   否	无	商品的京东价,人民币单元                    是元
	MarketPrice float64 `json:"marketPrice"`       //       否	无	商品的市场价,人民币单元                    是元
	// ZhuangBaID          string                  `json:"zhuangBaId"`          //       否	无	商品描述装吧实例ID
	// IntroductionUseFlag string                  `json:"introductionUseFlag"` //        否	无	商品描述使用标识 ,0：使用默认的商品描述,1：使用装吧商详
	// MobileZhuangBaID    string                  `json:"mobileZhuangBaId"`    //          否	无	移动版商品描述装吧实例ID
	// MobileDescUseFlag   string                  `json:"mobileDescUseFlag"`   //         否	无	移动版商品描述使用标识,0：使用默认的移动商详；1：使用装吧移动版商详
	// DesignConcept       string                  `json:"designConcept"`       //           否	无	商品设计理念,适用范围                    是toplife类目
	// FitCaseHTMLApp      string                  `json:"fitCaseHtmlApp"`      //           否	无	装修案例移动版描述,装修类目才可填写
	// FitCaseHTMLPc       string                  `json:"fitCaseHtmlPc"`       //           否	无	装修案例PC版描述,装修类目才可填写
	// SpecialServices     []string                `json:"specialServices"`     //  否	无	特色服务,装修类目才可填写,装修类必填,最大为5,每个值最长为8个字符
	MultiCateProps []*CreateSkuParamAttrs `json:"multiCateProps,omitempty"` //  否	无	类目属性列表，类目属性中有必填项时，此字段必填；若未设置或设置错误，会有“通用属性必填”等错误提示！
}

type CreateSkuParamFeatures struct {
	Key   string `json:"key"`   //是	无	特殊属性key
	Value string `json:"value"` //否	无	特殊属性value
}

type CreateSkuParamImages struct {
	ColorID   string `json:"colorId"`             //是	无	颜色id，颜色id和您设置的销售属性值id对应，使用接口jingdong.category.read.findValuesByAttrIdUnlimit 获取 ，如果没销售属性，则默认为10个0（主图，并且主图必填）
	ImgIndex  int    `json:"imgIndex"`            //是	无	图片顺序。index值：1N，如果index存在，则直接覆盖相应index图片
	ImgURL    string `json:"imgUrl"`              //是	无	京东图片服务器地址，不包括前缀。例如：jfs/t2116/102/1731643157/81969/c3df941a/5670f868Nc441d4c3.jpg
	ImgZoneID string `json:"imgZoneId,omitempty"` //否	无	图片空间中的图片Id
	Type      string `json:"type,omitempty"`      //"com.jd.pop.ware.ic.api.domain.sku"
	Type2     string `json:"@type,omitempty"`
}

type CreateSkuParamSkus struct {
	// SkuID int `json:"skuId"` //否	无	skuID（新建商品不需要填写）
	// SaleAttrs []struct {
	// 	AttrValueAlias []string `json:"attrValueAlias"` //否	无	值别名，发布商品时不可设置
	// 	AttrID         string   `json:"attrId        "` // 是	无	属性ID 通过接口 jingdong.category.read.findAttrsByCategoryIdUnlimitCate 传3级分类 type=4获取
	// 	AttrValues     []string `json:"attrValues    "` //是	无	销售属性值 使用接口jingdong.category.read.findValuesByAttrIdUnlimit获取
	// } `json:"saleAttrs"` //是	无	SKU销售属性
	// Features []struct {
	// 	JdPrice  int    `json:"jdPrice"`  //是	无	京东价必填 单位：元
	// 	OuterID  string `json:"outerId"`  //否	无	外部ID,系统不保证唯一性,如需唯一性自行保证
	// 	StockNum string `json:"stockNum"` //是	无	总库存数
	// 	BarCode  string `json:"barCode"`  //否	无	SKU的条形码
	// } `json:"features"` //否	无	特殊属性
	JdPrice  float64 `json:"jdPrice"`           //是	无	京东价必填 单位：元
	OuterID  string  `json:"outerId,omitempty"` //否	无	外部ID,系统不保证唯一性,如需唯一性自行保证
	StockNum int     `json:"stockNum"`          //是	无	总库存数
	// BarCode  string `json:"barCode"`  //否	无	SKU的条形码
	// Props          []struct{} `json:"props"`          //否	无	SKU属性(已废弃 请使用multiCateProps，已经按照类目限制使用3级类目修改，请及时迁移到多级类目)
	SaleAttrs []*CreateSkuParamAttrs `json:"saleAttrs,omitempty"` //否	无	多级SKU属性，仅当属性可以下沉时才能设置，不验证必填！sku维度设置后，以sku上的属性为准！
	// Capacity string `json:"capacity"` // 否	20L 20T	容量，在有特殊要求的类目下必填！最多支持6位小数。
	Type           string                 `json:"type,omitempty"` //"com.jd.pop.ware.ic.api.domain.sku"
	Type2          string                 `json:"@type,omitempty"`
	MultiCateProps []*CreateSkuParamAttrs `json:"multiCateProps,omitempty"` //  否	无	类目属性列表，类目属性中有必填项时，此字段必填；若未设置或设置错误，会有“通用属性必填”等错误提示！
}

type CreateSkuParamAttrs struct {
	AttrValueAlias []string `json:"attrValueAlias,omitempty"` //否	无	值别名，发布商品时不可设置
	AttrID         string   `json:"attrId"`                   //是	无	下沉到sku的属性ID 通过接口 jingdong.category.read.findAttrsByCategoryIdUnlimitCate 获取 features字段中attrLevel=1
	AttrValues     []string `json:"attrValues"`               //是	无	下沉到sku属性值 单选或者多选 通过接口jingdong.category.read.findValuesByAttrIdUnlimit获取 输入类型请手动输入
}

type CreateSkuParam struct {
	Ware *CreateSkuParamWare   `json:"ware"`
	Skus []*CreateSkuParamSkus `json:"skus"`
}

type CreateSkuResult struct {
	WareID int64 `json:"wareId"`
	Skus   []struct {
		WareID    int64 `json:"wareId"`
		SkuID     int64 `json:"skuId"`
		SaleAttrs []struct {
			// AttrValueAlias []string `json:"attrValueAlias"`
			AttrID     string   `json:"attrId"`
			AttrValues []string `json:"attrValues"`
		} `json:"saleAttrs"`
	} `json:"skus"`
}

type UpdateWareParam struct {
	WareID        int64                     `json:"wareId"`
	Title         string                    `json:"title"` //否	标题	商品名称 限制45个字符内
	VenderID      int64                     `json:"venderId"`
	PromiseID     int                       `json:"promiseId"`     //        否	无	配送时效
	MobileDesc    string                    `json:"mobileDesc"`    // 是	无	移动版的商品介绍 长度限制10W个字符
	Introduction  string                    `json:"introduction"`  // 是	无	PC版的商品介绍 长度限制10W个字符
	Features      []*CreateSkuParamFeatures `json:"features"`      //           否	无	商品维度的特殊属性 目前两个特殊属性 IBS、FBP、FCS、SCF 4种商家类型【规格型号】 model和【销售单位】 unit 字段且为必填（如 个、盒、袋等）请勿填写公司名称。
	ShopCategorys []int                     `json:"shopCategorys"` // 否	无	商品店内分类（商家接口获取到的最末级的分类）
	JdPrice       float64                   `json:"jdPrice"`       //是	无	京东价必填 单位：元
}

type QueryPictureReuslt struct {
	PictureSize   int    `json:"picture_size"`
	PictureWidth  int    `json:"picture_width"`
	PictureURL    string `json:"picture_url"`
	PictureID     string `json:"picture_id"`
	PictureName   string `json:"picture_name"`
	PictureType   string `json:"picture_type"`
	Created       int64  `json:"created"`
	PictureCateID int    `json:"picture_cate_id"`
	PictureHeight int    `json:"picture_height"`
}

type UpdateSkusParam struct {
	WareID int64                  `json:"wareId"`
	Skus   []*UpdateSkusParamSkus `json:"skus"`
}

type UpdateSkusParamSkus struct {
	WareID         int64                  `json:"wareId,omitempty"`    //是	11111111111	商品ID（必填）
	SkuID          int64                  `json:"skuId,omitempty"`     //否	11111558987	skuID（新增的sku可不填写）
	SaleAttrs      []*CreateSkuParamAttrs `json:"saleAttrs,omitempty"` //是	无	SKU销售属性
	JdPrice        float64                `json:"jdPrice,omitempty"`   //是	无	京东价必填 单位：元
	OuterID        string                 `json:"outerId,omitempty"`   //否	ww_4567	外部ID,系统不保证唯一性,如需唯一性自行保证
	StockNum       string                 `json:"stockNum,omitempty"`  //是	10	总库存数
	BarCode        string                 `json:"barCode,omitempty"`   //否	45456467777	SKU的条形码
	Capacity       string                 `json:"capacity,omitempty"`  //否	20L	容量，在有特殊要求的类目下必填！最多支持6位小数。
	Type           string                 `json:"type"`                //"com.jd.pop.ware.ic.api.domain.sku"
	Type2          string                 `json:"@type"`
	MultiCateProps []*CreateSkuParamAttrs `json:"multiCateProps,omitempty"` //  否	无	类目属性列表，类目属性中有必填项时，此字段必填；若未设置或设置错误，会有“通用属性必填”等错误提示！
}

//查询商家所有的店内分类
//https://open.jd.com/home/home#/doc/api?apiCateId=88&apiId=2801&apiName=jingdong.vender.shopcategory.findShopCategoriesByVenderId
func (a *API) FindShopCategories() (findShopCategoriesResult []*FindShopCategoriesResult, err error) {
	result, err := a.AccessAPI("jingdong.vender.shopcategory.findShopCategoriesByVenderId", prodURL, nil)
	if err == nil {
		utils.Map2StructByJson(result["jingdong_vender_shopcategory_findShopCategoriesByVenderId_responce"].(map[string]interface{})["shopCategoryResult"].(map[string]interface{})["shop_category_list"], &findShopCategoriesResult, false)
	}
	return findShopCategoriesResult, err
}

//删除店内分类
//https://open.jd.com/home/home#/doc/api?apiCateId=88&apiId=3031&apiName=jingdong.vender.shopcategory.deleteShopCategoryByVenderIdAndCid
func (a *API) DeleteShopCategory(cid int64) (uniteResp *UniteResp, err error) {
	result, err := a.AccessAPI("jingdong.vender.shopcategory.deleteShopCategoryByVenderIdAndCid", prodURL, map[string]interface{}{
		"cid": cid,
	})
	if err == nil {
		utils.Map2StructByJson(result["jingdong_vender_shopcategory_deleteShopCategoryByVenderIdAndCid_responce"].(map[string]interface{})["shopCategoryResult"], &uniteResp, false)
		if !uniteResp.IsSuccess {
			return nil, fmt.Errorf(uniteResp.ErrorMsgCn)
		}
	}
	return uniteResp, err
}

//查询商家所有的类目
//https://open.jd.com/home/home#/doc/api?apiCateId=88&apiId=2727&apiName=jingdong.vender.category.getValidCategoryResultByVenderId
func (a *API) FindVendorCategories() (findVendorCategoriesResult []*FindVendorCategoriesResult, err error) {
	result, err := a.AccessAPI("jingdong.vender.category.getValidCategoryResultByVenderId", prodURL, nil)
	if err == nil {
		utils.Map2StructByJson(result["jingdong_vender_category_getValidCategoryResultByVenderId_responce"].(map[string]interface{})["getvalidcategoryresultbyvenderid_result"].(map[string]interface{})["list"], &findVendorCategoriesResult, false)
	}
	return findVendorCategoriesResult, err
}

//京东商城发布商品（创建商品）
//https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1379&apiName=jingdong.ware.write.add
func (a *API) CreateWare(createSkuParamWare *CreateSkuParamWare, createSkuParamSkus []*CreateSkuParamSkus) (createSkuResult *CreateSkuResult, err error) {
	c := &CreateSkuParam{
		Ware: createSkuParamWare,
		Skus: createSkuParamSkus,
	}
	cc, _ := json.Marshal(c)
	content := string(cc)
	content = strings.Replace(content, "\\u003c", "<", -1)
	content = strings.Replace(content, "\\u003e", ">", -1)
	content = strings.Replace(content, "\\u0026", "&", -1)
	result, err := a.AccessAPI2("jingdong.ware.write.add", prodURL, map[string]interface{}{
		"360buy_param_json": content,
	})
	if err == nil {
		utils.Map2StructByJson(result["jingdong_ware_write_add_responce"].(map[string]interface{})["ware"], &createSkuResult, false)
	}
	return createSkuResult, err
}

type UploadPictureResult struct {
	ReturnCode int    `json:"returnCode"`  //返回码：1，操作成功；0，操作失败
	Desc       string `json:"desc"`        //返回码为1时为操作成功，返回码为0时为操作失败原
	PictureID  string `json:"picture_id"`  //上传成功的图片i
	PictureURL string `json:"picture_url"` //上传成功的图片url
}

//京东商城上传图片
//https://open.jd.com/home/home#/doc/api?apiCateId=61&apiId=164&apiName=jingdong.imgzone.picture.upload
func (a *API) UploadPicture(imageData []byte, pictureCateID int, pictureName string) (uploadPictureResult *UploadPictureResult, err error) {
	result, err := a.AccessAPI("jingdong.imgzone.picture.upload", prodURL, map[string]interface{}{
		"image_data":   base64.StdEncoding.EncodeToString(imageData),
		"picture_name": pictureName,
	})
	if err == nil {
		utils.Map2StructByJson(result["jingdong_imgzone_picture_upload_responce"], &uploadPictureResult, false)
	}
	return uploadPictureResult, err
}

//京东商城查询图片
//https://open.jd.com/home/home#/doc/api?apiCateId=61&apiId=230&apiName=jingdong.imgzone.picture.query
func (a *API) QueryPicture(pictureName string) (queryPictureReuslt []*QueryPictureReuslt, err error) {
	result, err := a.AccessAPI("jingdong.imgzone.picture.query", prodURL, map[string]interface{}{
		"picture_name": pictureName,
	})
	if err == nil {
		utils.Map2StructByJson(result["jingdong_imgzone_picture_query_responce"].(map[string]interface{})["imgList"], &queryPictureReuslt, false)
	}
	return queryPictureReuslt, err
}

//查询运费模板
//https://open.jd.com/home/home#/doc/api?apiCateId=137&apiId=906&apiName=jingdong.ept.feight.outapi.query
func (a *API) GetFeightMb() (err error) {
	_, err = a.AccessAPI("jingdong.SkuFareTemplateService.getTemplates", prodURL, nil)
	return err
}

//类目属性
//https://open.jd.com/home/home#/doc/api?apiCateId=62&apiId=1264&apiName=jingdong.category.read.findAttrsByCategoryId
func (a *API) GetAttrsByCategoryId(currPage, pageSize int) (err error) {
	_, err = a.AccessAPI("jingdong.category.read.findAttrsByCategoryId", prodURL, map[string]interface{}{
		"currPage": currPage,
		"pageSize": pageSize,
	})
	return err
}

//修改商品基础信息
//https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1380&apiName=jingdong.ware.write.updateWare
func (a *API) UpdateWare(updateWareParam *UpdateWareParam) (err error) {
	mapP := map[string]interface{}{
		"ware": updateWareParam,
	}
	result3, _ := json.Marshal(mapP)
	result, err := a.AccessAPI("jingdong.ware.write.updateWare", prodURL, map[string]interface{}{
		"360buy_param_json": string(result3),
	})
	if err == nil {
		if result["jingdong_ware_write_updateWare_responce"].(map[string]interface{})["success"] != "success" {
			return err
		}
	}
	return err
}

//删除商品
//https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1250&apiName=jingdong.ware.write.delete
func (a *API) DeleteWare(wareId int) (err error) {
	_, err = a.AccessAPI("jingdong.ware.write.delete", prodURL, map[string]interface{}{
		"wareId": wareId,
	})
	return err
}

type FindAttrsResult struct {
	ID        int    `json:"id"`
	OrderSort int    `json:"orderSort"`
	InputType int    `json:"inputType"`
	Name      string `json:"name"`
	Features  []struct {
		Fvalue string `json:"fvalue"`
		Key    string `json:"key"`
	} `json:"features"`
	CatID         int  `json:"catId"`
	AttributeType int  `json:"attributeType"`
	IsRequired    bool `json:"isRequired"`
}

//获取类目属性ID
//https://open.jd.com/home/home#/doc/api?apiCateId=62&apiId=2809&apiName=jingdong.category.read.findAttrsByCategoryIdUnlimitCate
func (a *API) FindAttrs(cid int) (findAttrsResult []*FindAttrsResult, err error) {
	result, err := a.AccessAPI("jingdong.category.read.findAttrsByCategoryIdUnlimitCate", prodURL, map[string]interface{}{
		"cid": cid,
		// "attributeType": 4,
	})
	if err == nil {
		utils.Map2StructByJson(result["jingdong_category_read_findAttrsByCategoryIdUnlimitCate_responce"].(map[string]interface{})["findattrsbycategoryidunlimitcate_result"], &findAttrsResult, false)
	}
	return findAttrsResult, err
}

type FindValuesByAttrIdResult struct {
	ID        int64  `json:"id"`
	OrderSort int    `json:"orderSort"`
	Name      string `json:"name"`
	CatID     int    `json:"catId"`
	AttID     int    `json:"attId"`
}

//获取类目属性值
//https://open.jd.com/home/home#/doc/api?apiCateId=62&apiId=2821&apiName=jingdong.category.read.findValuesByAttrIdUnlimit
func (a *API) FindValuesByAttrId(categoryAttrId int) (findValuesByAttrIdResult []*FindValuesByAttrIdResult, maxOrder int, err error) {
	result, err := a.AccessAPI("jingdong.category.read.findValuesByAttrIdUnlimit", prodURL, map[string]interface{}{
		"categoryAttrId": categoryAttrId,
	})
	if err == nil {
		utils.Map2StructByJson(result["jingdong_category_read_findValuesByAttrIdUnlimit_responce"].(map[string]interface{})["findvaluesbyattridunlimit_result"], &findValuesByAttrIdResult, false)
	}
	if len(findValuesByAttrIdResult) > 0 {
		maxOrder = findValuesByAttrIdResult[len(findValuesByAttrIdResult)-1].OrderSort
	}
	return findValuesByAttrIdResult, maxOrder, err
}

//新增类目属性值
//https://open.jd.com/home/home#/doc/api?apiCateId=62&apiId=1262&apiName=jingdong.category.write.saveVenderAttrValue
func (a *API) SaveVenderAttrValue(attValue string, attributeId, categoryId, indexId int) (categoryAttrId int64, err error) {
	_, err = a.AccessAPI("jingdong.category.write.saveVenderAttrValue", prodURL, map[string]interface{}{
		"attValue":    attValue,
		"attributeId": attributeId,
		"categoryId":  categoryId,
		"indexId":     indexId,
	})
	result, _, err := a.FindValuesByAttrId(attributeId)
	for _, v := range result {
		if v.OrderSort == indexId {
			categoryAttrId = v.ID
		}
	}
	return categoryAttrId, err
}

//设置sku库存
//https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1224&apiName=jingdong.stock.write.updateSkuStock
func (a *API) UpdateSkuStock(skuId, stockNum int) (err error) {
	_, err = a.AccessAPI("jingdong.stock.write.updateSkuStock", prodURL, map[string]interface{}{
		"skuId":    skuId,
		"stockNum": stockNum,
	})
	return err
}

//修改sku京东价
//https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1253&apiName=jingdong.price.write.updateSkuJdPrice
//单位为元
func (a *API) UpdateSkuJdPrice(skuId int, jdPrice float64) (err error) {
	_, err = a.AccessAPI("jingdong.price.write.updateSkuJdPrice", prodURL, map[string]interface{}{
		"skuId":   skuId,
		"jdPrice": jdPrice,
	})
	return err
}

//商品上下架
//https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1251&apiName=jingdong.ware.write.upOrDown
//opType	下架类型：1表示自主上架 2表示自主下架
func (a *API) UpOrDown(wareId int64, opType int) (err error) {
	_, err = a.AccessAPI("jingdong.ware.write.upOrDown", prodURL, map[string]interface{}{
		"wareId": wareId,
		"opType": opType,
	})
	return err
}

//获取sku库存信息
//https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1239&apiName=jingdong.stock.read.findSkuStock
func (a *API) FindSkuStock(skuId int64) (err error) {
	_, err = a.AccessAPI("jingdong.stock.read.findSkuStock", prodURL, map[string]interface{}{
		"skuId": skuId,
	})
	return err
}

//修改商品图片
//https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1258&apiName=jingdong.image.write.update
func (a *API) ImageUpdate(wareId int64, imgIndex int, imgUrl string) (err error) {
	_, err = a.AccessAPI("jingdong.image.write.update", prodURL, map[string]interface{}{
		"wareId":   wareId,
		"imgIndex": imgIndex,
		"imgUrl":   imgUrl,
		"colorId":  "0000000000",
	})
	return err
}

type SearchWare4ValidResult struct {
	PageSize  int                           `json:"pageSize"`
	Data      []*SearchWare4ValidResultData `json:"data"`
	PageNo    int                           `json:"pageNo"`
	TotalItem int                           `json:"totalItem"`
}

type SearchWare4ValidResultData struct {
	WareID     int64  `json:"wareId"`
	WareStatus int    `json:"wareStatus"`
	CategoryID int    `json:"categoryId"`
	OnlineTime int64  `json:"onlineTime"`
	OuterID    string `json:"outerId"`
	Title      string `json:"title"`
	ItemNum    string `json:"itemNum"`
	ColType    int    `json:"colType"`
}

//搜索有效商品
//https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1587&apiName=jingdong.ware.read.searchWare4Valid
func (a *API) SearchWare4Valid(searchKey string, pageNo, pageSize int) (searchWare4ValidResult *SearchWare4ValidResult, err error) {
	param := make(map[string]interface{})
	if searchKey != "" {
		param["searchKey"] = searchKey
		param["searchField"] = "title"
	}
	if pageNo != 0 {
		param["pageNo"] = pageNo
	}
	if pageSize != 0 {
		param["pageSize"] = pageSize
	}
	result, err := a.AccessAPI("jingdong.ware.read.searchWare4Valid", prodURL, param)
	if err == nil {
		utils.Map2StructByJson(result["jingdong_ware_read_searchWare4Valid_responce"].(map[string]interface{})["page"], &searchWare4ValidResult, false)
	}
	return searchWare4ValidResult, err
}

type UpdateSkusResult struct {
	SkuID int64 `json:"skuId"`
}

//增加sku
//https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1383&apiName=jingdong.sku.write.updateSkus
func (a *API) UpdateSkus(updateSkusParam *UpdateSkusParam) (vendorSkuID string, err error) {
	var skus []*UpdateSkusResult
	data, _ := json.Marshal(updateSkusParam)
	result, err := a.AccessAPI2("jingdong.sku.write.updateSkus", prodURL, map[string]interface{}{
		"360buy_param_json": string(data),
	})
	if err == nil {
		utils.Map2StructByJson(result["jingdong_sku_write_updateSkus_responce"].(map[string]interface{})["skuList"], &skus, false)
		vendorSkuID = utils.Int64ToStr(skus[0].SkuID)
	}
	return vendorSkuID, err
}

//删除sku
//https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1323&apiName=jingdong.sku.write.deleteSku
func (a *API) DeleteSku(skuId int64) (err error) {
	_, err = a.AccessAPI("jingdong.sku.write.deleteSku", prodURL, map[string]interface{}{
		"skuId": skuId,
	})
	return err
}

type FindSkuByIdParam struct {
	Status    int     `json:"status"`
	JdPrice   float64 `json:"jdPrice"`
	SaleAttrs []struct {
		AttrID         string   `json:"attrId"`
		Index          int      `json:"index"`
		AttrValueAlias []string `json:"attrValueAlias"`
		AttrValues     []string `json:"attrValues"`
	} `json:"saleAttrs"`
	SkuID   int64  `json:"skuId"`
	WareID  int64  `json:"wareId"`
	OuterID string `json:"outerId"`
}

//获取单个sku
//https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1223&apiName=jingdong.sku.read.findSkuById
func (a *API) FindSkuById(skuId int64) (findSkuByIdParam *FindSkuByIdParam, err error) {
	result, err := a.AccessAPI2("jingdong.sku.read.findSkuById", prodURL, map[string]interface{}{
		"skuId": skuId,
		"field": "saleAttrs",
	})
	if err == nil {
		utils.Map2StructByJson(result["jingdong_sku_read_findSkuById_responce"].(map[string]interface{})["sku"], &findSkuByIdParam, false)
	}
	return findSkuByIdParam, err
}

type FindWareByIdResult struct {
	MultiCategoryID int `json:"multiCategoryId"`
	BrandID         int `json:"brandId"`
	Height          int `json:"height"`
	Features        []struct {
		FeatureValue string `json:"featureValue"`
		FeatureKey   string `json:"featureKey"`
	} `json:"features"`
	OfflineTime int64 `json:"offlineTime"`
	WareID      int64 `json:"wareId"`
	WareStatus  int   `json:"wareStatus"`
	CategoryID  int   `json:"categoryId"`
	Width       int   `json:"width"`
	OnlineTime  int64 `json:"onlineTime"`
	Images      []struct {
		ImgURL   string `json:"imgUrl"`
		ImgID    int64  `json:"imgId"`
		ColorID  string `json:"colorId"`
		ImgIndex int    `json:"imgIndex"`
	} `json:"images"`
	OuterID string  `json:"outerId"`
	Weight  float64 `json:"weight"`
	Title   string  `json:"title"`
	Length  int     `json:"length"`
	ItemNum string  `json:"itemNum"`
	ColType int     `json:"colType"`
}

//获取单个商品
//https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1244&apiName=jingdong.ware.read.findWareById
func (a *API) FindWareById(wareId int64) (findWareByIdResult *FindWareByIdResult, err error) {
	result, err := a.AccessAPI2("jingdong.ware.read.findWareById", prodURL, map[string]interface{}{
		"wareId": wareId,
		"field":  "features,weight,width,height,length,images,wareStatus,categoryId,brandId",
	})
	if err == nil {
		utils.Map2StructByJson(result["jingdong_ware_read_findWareById_responce"].(map[string]interface{})["ware"], &findWareByIdResult, false)
	}
	return findWareByIdResult, err
}

//更新商品市场价
//https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1248&apiName=jingdong.price.write.updateWareMarketPrice
func (a *API) UpdateWareMarketPrice(wareId int64, marketPrice float64) (err error) {
	_, err = a.AccessAPI2("jingdong.price.write.updateWareMarketPrice", prodURL, map[string]interface{}{
		"wareId":      wareId,
		"marketPrice": marketPrice,
	})
	return err
}

//获取商品下架原因
//https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1225&apiName=jingdong.ware.read.findOpReason
func (a *API) FindOpReason(wareId int64) (reason string, err error) {
	result, err := a.AccessAPI2("jingdong.ware.read.findOpReason", prodURL, map[string]interface{}{
		"wareId": wareId,
	})
	if err == nil {
		reason = result["jingdong_ware_read_findOpReason_responce"].(map[string]interface{})["opReason"].(map[string]interface{})["note"].(string)
	}
	return reason, err
}

//商品透图追加
//https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=2504&apiName=jingdong.transparentImage.write.add
func (a *API) TransparentImageAdd(wareId int64, imageUrl string) (err error) {
	_, err = a.AccessAPI2("jingdong.transparentImage.write.add", prodURL, map[string]interface{}{
		"wareId":   wareId,
		"colorId":  "0000000000",
		"imageUrl": imageUrl,
	})
	return err
}

type UpdateWareSaleAttrvalueAliasParam struct {
	WareID int64                   `json:"wareId"`
	Props  []*CreateSkuParamAttrs2 `json:"props"` //否	无	多级SKU属性，仅当属性可以下沉时才能设置，不验证必填！sku维度设置后，以sku上的属性为准！
}

type CreateSkuParamAttrs2 struct {
	AttrValueAlias []string `json:"attrValueAlias,omitempty"` //否	无	值别名，发布商品时不可设置
	AttrID         string   `json:"attrId"`                   //是	无	下沉到sku的属性ID 通过接口 jingdong.category.read.findAttrsByCategoryIdUnlimitCate 获取 features字段中attrLevel=1
	AttrValues     []string `json:"attrValues"`               //是	无	下沉到sku属性值 单选或者多选 通过接口jingdong.category.read.findValuesByAttrIdUnlimit获取 输入类型请手动输入
	Type           string   `json:"type"`                     //"com.jd.pop.ware.ic.api.domain.Prop"
	Type2          string   `json:"@type"`
}

//修改商品销售属性
//https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1381&apiName=jingdong.ware.write.updateWareSaleAttrvalueAlias
func (a *API) UpdateWareSaleAttrvalueAlias(param *UpdateWareSaleAttrvalueAliasParam) (err error) {
	data, _ := json.Marshal(param)
	_, err = a.AccessAPI2("jingdong.ware.write.updateWareSaleAttrvalueAlias", prodURL, map[string]interface{}{
		"360buy_param_json": string(data),
	})
	return err
}

type SearchSkuListResult struct {
	Status    int     `json:"status"`
	JdPrice   float64 `json:"jdPrice"`
	SkuID     int64   `json:"skuId"`
	WareID    int64   `json:"wareId"`
	OuterID   string  `json:"outerId"`
	SaleAttrs []struct {
		AttrID         string   `json:"attrId"`
		Index          int      `json:"index"`
		AttrValueAlias []string `json:"attrValueAlias"`
		AttrValues     []string `json:"attrValues"`
	} `json:"saleAttrs"`
	StockNum int `json:"stockNum"`
}

//搜索sku
//https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1227&apiName=jingdong.sku.read.searchSkuList
func (a *API) SearchSkuList(pageNo, pageSize int) (list []*SearchSkuListResult, totalCount int, err error) {
	result, err := a.AccessAPI2("jingdong.sku.read.searchSkuList", prodURL, map[string]interface{}{
		"pageNo":   pageNo,
		"pageSize": pageSize,
		"field":    "jdPrice,saleAttrs,stockNum",
	})
	if err == nil {
		utils.Map2StructByJson(result["jingdong_sku_read_searchSkuList_responce"].(map[string]interface{})["page"].(map[string]interface{})["data"], &list, false)
		totalCount = int(utils.Interface2Int64WithDefault(result["jingdong_sku_read_searchSkuList_responce"].(map[string]interface{})["page"].(map[string]interface{})["totalItem"], 0))
	}
	return list, totalCount, err
}

//搜索sku
//https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1227&apiName=jingdong.sku.read.searchSkuList
func (a *API) SearchSkuList2(wareIDs []int) (list []*SearchSkuListResult, totalCount int, err error) {
	result, err := a.AccessAPI2("jingdong.sku.read.searchSkuList", prodURL, map[string]interface{}{
		"wareId": wareIDs,
		"field":  "jdPrice,saleAttrs,stockNum",
	})
	if err == nil {
		utils.Map2StructByJson(result["jingdong_sku_read_searchSkuList_responce"].(map[string]interface{})["page"].(map[string]interface{})["data"], &list, false)
		totalCount = int(utils.Interface2Int64WithDefault(result["jingdong_sku_read_searchSkuList_responce"].(map[string]interface{})["page"].(map[string]interface{})["totalItem"], 0))
	}
	return list, totalCount, err
}
