package wholesale

import (
	"context"
	"git.oa00.com/supply-chain/service/client"
	"git.oa00.com/supply-chain/service/lib/bean"
	"github.com/shopspring/decimal"
)

type sku struct {
}

type source uint

const (
	SkuSourceSupplier source = 2 // 供应链供应商渠道
)

const (
	SkuAdjustTypeRate   = 1 // 加价比例
	SkuAdjustTypeAmount = 2 // 加价金额

	SkuPlatformStatusUp   = 1 // 平台上架
	SkuPlatformStatusDown = 2 // 平台下架

	SkuSourceStatusUp   = 1 // 供应商上架
	SkuSourceStatusDown = 2 // 供应商下架

	SkuHandleNone  = 1 // 未处理
	SkuHandleFinal = 2 // 已处理

	SkuAuditStatusNone   = 0 // 无
	SkuAuditStatusWait   = 1 // 待审核
	SkuAuditStatusAdopt  = 2 // 审核通过
	SkuAuditStatusReject = 3 // 审核驳回

	ProfitGtZero = 1 // 利润比大于0
	ProfitEqZero = 2 // 利润比等于0
	ProfitLtZero = 3 // 利润比小于0
)

type ArgsSkuAdd struct {
	SourceSkuId       string             // 源skuId
	SourceGroupSkuIds []string           // 源skuId关系数组
	SourceStatus      uint               // 源状态
	Name              string             // 商品名称
	BrandId           uint               // 品牌id
	ThirdCategoryId   uint               // 三级分类id
	SupplyPrice       decimal.Decimal    // 采购价
	GuidePrice        decimal.Decimal    // 指导价-建议售价
	Size              string             // 尺码
	Color             string             // 颜色
	Tax               string             // 税率
	TaxName           string             // 税收名称
	TaxCode           string             // 税收编码
	Unit              string             // 销售单位
	UpcCode           string             // 商品条码
	Source            source             // 商品来源
	Content           string             // 商品详情
	Length            decimal.Decimal    // 长
	Width             decimal.Decimal    // 宽
	Height            decimal.Decimal    // 高
	Weight            decimal.Decimal    // 重
	PackingRate       uint               // 装箱率
	StartingBatch     uint               // 起批量
	InitialFreight    decimal.Decimal    // 起批运费
	Imgs              []SkuImg           // 商品图片 第一张主图
	Specifications    []SkuSpecification // 商品参数信息
}

type SkuImg struct {
	Path string `json:"path"`
}

type SkuSpecification struct {
	Name       string         `json:"name"`
	Attributes []SkuAttribute `json:"attributes"`
}

type SkuAttribute struct {
	Name  string   `json:"name"`
	Value []string `json:"value"`
}

// Add @Title 添加商品
func (s *sku) Add(ctx context.Context, args ArgsSkuAdd) error {
	reply := 0
	xClient, err := client.GetClient(s)
	if err != nil {
		return err
	}
	return xClient.Call(ctx, "Add", args, &reply)
}

type ArgsSkuAdjust struct {
	ApplyUserId uint            // 修改人
	SkuIds      []uint          // 商品id
	AdjustType  uint            // 加价类型
	AdjustPrice decimal.Decimal // 加价金额
}

// Adjust @Title 加价
func (s *sku) Adjust(ctx context.Context, args ArgsSkuAdjust) error {
	reply := 0
	xClient, err := client.GetClient(s)
	if err != nil {
		return err
	}
	return xClient.Call(ctx, "Adjust", args, &reply)
}

type ArgsSkuLists struct {
	Search SkuListsSearch
	Page   bean.Page
}

type SkuListsSearch struct {
	Id                 uint            // 瑞库客id
	Name               string          // 商品名称
	SourceId           uint            // 所属供应商 1=京东
	SourceSkuId        uint            // 供应商skuId
	BrandId            uint            // 品牌Id
	BrandIds           []uint          // 品牌Ids
	FirstCategoryId    uint            // 一级分类Id
	FirstCategoryIds   []uint          // 一级分类ids
	SecondCategoryId   uint            // 二级分类Id
	SecondCategoryIds  []uint          // 二级分类Ids
	ThirdCategoryId    uint            // 三级分类Id
	ThirdCategoryIds   []uint          // 三级分类Ids
	AdjustType         uint            // 加价规则
	MaxSupplyPrice     decimal.Decimal // 最大采购价格
	MinSupplyPrice     decimal.Decimal // 最小采购价格
	CustomerProfitRate uint            // 客户利润比 1=大于0 2=等于0 3=小于0
	Handle             uint            // 处理状态
	AuditStatus        uint            // 审核状态
	SourceStatus       uint            // 供应商下架状态
	PlatformStatus     uint            // 平台下架状态
	UpcCode            string          // 商品条码
	Length             decimal.Decimal // 长
	Width              decimal.Decimal // 宽
	Height             decimal.Decimal // 高
	Weight             decimal.Decimal // 重
	PackingRate        uint            // 装箱率
	StartingBatch      uint            // 起批量
	InitialFreight     decimal.Decimal // 起批运费
}

type ReplySkuList struct {
	Lists []SkuItem `json:"lists"`
	Total int64     `json:"total"`
}

type SkuItem struct {
	Id                 uint            `json:"id"`
	Name               string          `json:"name"`               // 名称
	BrandName          string          `json:"brandName"`          // 品牌名称
	FirstCategoryId    uint            `json:"firstCategoryId"`    // 一级分类id
	SecondCategoryId   uint            `json:"secondCategoryId"`   // 二级分类id
	ThirdCategoryId    uint            `json:"thirdCategoryId"`    // 三级分类id
	SupplyPrice        decimal.Decimal `json:"supplyPrice"`        // 采购价
	GuidePrice         decimal.Decimal `json:"guidePrice"`         // 指导价
	ImgUrl             string          `json:"imgUrl"`             // 商品主图
	PlatformStatus     uint            `json:"platformStatus"`     // 平台状态 1=上架 2=下架
	SourceId           uint            `json:"sourceId"`           // 所属供应商
	SourceName         string          `json:"sourceName"`         // 供应商名称
	SourceSkuId        string          `json:"sourceSkuId"`        // 源skuId
	SourceStatus       uint            `json:"sourceStatus"`       // 供应商状态 1=上架 2=下架
	CustomerPrice      decimal.Decimal `json:"customerPrice"`      // 供货最高价
	CustomerProfitRate decimal.Decimal `json:"customerProfitRate"` // 供货利润率 供货利润/供货最高价%
	CustomerDiscount   decimal.Decimal `json:"customerDiscount"`   // 折扣
	AdjustType         uint            `json:"adjustType"`         // 加价类型
	AdjustPrice        decimal.Decimal `json:"adjustPrice"`        // 加价金额
	AfterAdjustType    uint            `json:"afterAdjustType"`    // 改价后加价类型
	AfterAdjustPrice   decimal.Decimal `json:"afterAdjustPrice"`   // 改价后加价金额
	AfterPrice         decimal.Decimal `json:"afterPrice"`         // 改价后金额
	AfterDiscount      decimal.Decimal `json:"afterDiscount"`      // 改价后折扣
	AdjustAuditStatus  uint            `json:"adjustAuditStatus"`  // 改价审核状态
	Reason             string          `json:"reason"`             // 改价驳回原因
	UpcCode            string          `json:"upcCode"`            // 商品条码
	Color              string          `json:"color"`              // 颜色
	Size               string          `json:"size"`               // 尺寸
	Attributes         []AttributeItem `json:"attributes"`         // 商品属性
	Length             decimal.Decimal `json:"length"`             // 长
	Width              decimal.Decimal `json:"width"`              // 宽
	Height             decimal.Decimal `json:"height"`             // 高
	Weight             decimal.Decimal `json:"weight"`             // 重
	PackingRate        uint            `json:"packingRate"`        // 装箱率
	StartingBatch      uint            `json:"startingBatch"`      // 起批量
	InitialFreight     decimal.Decimal `json:"initialFreight"`     // 起批运费
}

type AttributeItem struct {
	GroupName string `json:"groupName"`
	Name      string `json:"name"`
	Value     string `json:"value"`
}

// Lists @Title 商品列表
func (s *sku) Lists(ctx context.Context, args ArgsSkuLists) (reply ReplySkuList, err error) {
	xClient, err := client.GetClient(s)
	if err != nil {
		return
	}
	err = xClient.Call(ctx, "Lists", args, &reply)
	return
}

type SkuEsSearch struct {
	SourceId           uint            // 所属供应商
	SourceSonId        uint            // 沙马供应商的供应商Id
	SourceSkuId        uint            // 供应商SkuId
	SourceStatus       uint            // 供应商上下架状态 1=上架 2=下架
	PlatformStatus     uint            // 平台上下架状态 1=上架 2=下架
	AuditStatus        uint            // 改价审核状态 1=待审核 2=通过 3=驳回
	SkuId              uint            // Sku编码
	SupplySkuId        uint            // 供应商Sku编码
	SkuName            string          // 商品名称
	UpcCode            string          // 商品条码
	BrandId            uint            // 品牌id
	BrandName          string          // 品牌名称 全词匹配
	FirstCategoryId    uint            // 一级分类id
	FirstCategoryName  string          // 一级分类名称 全词匹配
	SecondCategoryId   uint            // 二级分类id
	SecondCategoryName string          // 二级分类名称 全词匹配
	ThirdCategoryId    uint            // 三级分类id
	ThirdCategoryName  string          // 三级分类名称 全词匹配
	AdjustType         uint            // 加价规则 1=比例 2=金额
	Handel             uint            // 处理状态
	MaxSupplyPrice     decimal.Decimal // 最高金额
	MinSupplyPrice     decimal.Decimal // 最低金额
	MinDiscount        decimal.Decimal // 最低折扣
	MaxDiscount        decimal.Decimal // 最高折扣
	AdjustMinDiscount  decimal.Decimal // 改价后最小折扣
	AdjustMaxDiscount  decimal.Decimal // 改价后最大折扣
	Length             decimal.Decimal // 长
	Width              decimal.Decimal // 宽
	Height             decimal.Decimal // 高
	Weight             decimal.Decimal // 重
	PackingRate        uint            // 装箱率
	StartingBatch      uint            // 起批量
	InitialFreight     decimal.Decimal // 起批运费
}
type ArgsSkuListsEs struct {
	Search SkuEsSearch
	Page   bean.Page
}

// ListsEs @Title es商品列表 目前最大10000条数据,超出不显示
func (s *sku) ListsEs(ctx context.Context, args ArgsSkuListsEs) (reply ReplySkuList, err error) {
	xClient, err := client.GetClient(s)
	if err != nil {
		return
	}
	err = xClient.Call(ctx, "ListsEs", args, &reply)
	return
}

type SkuInfo struct {
	Id                 uint               `json:"id"`
	Name               string             `json:"name"`
	SourceSkuId        string             `json:"jdSkuId"`
	SupplyPrice        decimal.Decimal    `json:"supplyPrice"`
	CustomerPrice      decimal.Decimal    `json:"customerPrice"`
	GuidePrice         decimal.Decimal    `json:"guidePrice"`
	Profit             decimal.Decimal    `json:"profit"`
	CustomerProfitRate decimal.Decimal    `json:"customerProfitRate"`
	UpcCode            string             `json:"upcCode"`
	Color              string             `json:"color"`
	Size               string             `json:"size"`
	FirstCategoryName  string             `json:"firstCategoryName"`
	SecondCategoryName string             `json:"secondCategoryName"`
	ThirdCategoryName  string             `json:"thirdCategoryName"`
	BrandName          string             `json:"brandName"`
	Content            string             `json:"content"`
	Tax                string             `json:"tax"`
	TaxName            string             `json:"taxName"`
	TaxCode            string             `json:"taxCode"`
	Unit               string             `json:"unit"`
	Imgs               []SkuImgItem       `json:"imgs"`
	Reason             string             `json:"reason"`
	Specifications     []SkuSpecification `json:"specification"`
	PlatformStatus     uint               `json:"platformStatus"`
	SourceStatus       uint               `json:"sourceStatus"`
	SourceName         string             `json:"sourceName"`
	AdjustType         uint               `json:"adjustType"`
	AdjustPrice        decimal.Decimal    `json:"adjustPrice"`
	Length             decimal.Decimal    `json:"length"`         // 长
	Width              decimal.Decimal    `json:"width"`          // 宽
	Height             decimal.Decimal    `json:"height"`         // 高
	Weight             decimal.Decimal    `json:"weight"`         // 重
	PackingRate        uint               `json:"packingRate"`    // 装箱率
	StartingBatch      uint               `json:"startingBatch"`  // 起批量
	InitialFreight     decimal.Decimal    `json:"initialFreight"` // 起批运费
}

type SkuImgItem struct {
	Id   uint   `json:"id"`
	Path string `json:"path"`
}

// Info @Title 商品信息
func (s *sku) Info(ctx context.Context, skuId uint) (reply SkuInfo, err error) {
	xClient, err := client.GetClient(s)
	if err != nil {
		return
	}
	err = xClient.Call(ctx, "Info", skuId, &reply)
	return
}

type ArgsSkuOnShelves struct {
	SkuIds []uint
}

type ArgsSkuDownShelves struct {
	SkuIds []uint
}

// OnShelves @Title 上架
func (s *sku) OnShelves(ctx context.Context, args ArgsSkuOnShelves) error {
	reply := 0
	xClient, err := client.GetClient(s)
	if err != nil {
		return err
	}
	return xClient.Call(ctx, "OnShelves", args, &reply)
}

// DownShelves @Title 下架
func (s *sku) DownShelves(ctx context.Context, args ArgsSkuDownShelves) error {
	reply := 0
	xClient, err := client.GetClient(s)
	if err != nil {
		return err
	}
	return xClient.Call(ctx, "DownShelves", args, &reply)
}

// GetImgs @Title 获取预览图
func (s *sku) GetImgs(ctx context.Context, skuId uint) (reply []SkuImgItem, err error) {
	xClient, err := client.GetClient(s)
	if err != nil {
		return nil, err
	}
	err = xClient.Call(ctx, "GetImgs", skuId, &reply)
	return
}

type ArgsReplaceImg struct {
	SkuId uint
	Id    uint
	Path  string
}

// ReplaceImg @Title 替换图片
func (s *sku) ReplaceImg(ctx context.Context, args ArgsReplaceImg) (err error) {
	reply := 0
	xClient, err := client.GetClient(s)
	if err != nil {
		return err
	}
	err = xClient.Call(ctx, "ReplaceImg", args, &reply)
	return
}

type ArgsSkuChangePrice struct {
	SourceSkuId string          // 源skuId
	SupplyPrice decimal.Decimal // 采购价
	GuidePrice  decimal.Decimal // 指导价-建议售价
	Source      source          // 商品来源
}

// ChangePrice @Title 更新价格
func (s *sku) ChangePrice(ctx context.Context, args ArgsSkuChangePrice) (err error) {
	reply := 0
	xClient, err := client.GetClient(s)
	if err != nil {
		return err
	}
	err = xClient.Call(ctx, "ChangePrice", args, &reply)
	return
}

type ArgsSkuChangeData struct {
	SourceSkuId     string             // 源skuId
	SourceStatus    uint               // 源状态
	Name            string             // 商品名称
	BrandId         uint               // 品牌id
	ThirdCategoryId uint               // 三级分类id
	SupplyPrice     decimal.Decimal    // 采购价
	GuidePrice      decimal.Decimal    // 指导价-建议售价
	Size            string             // 尺码
	Color           string             // 颜色
	Tax             string             // 税率
	Unit            string             // 销售单位
	UpcCode         string             // 商品条码
	Source          source             // 商品来源
	Specifications  []SkuSpecification // 商品参数信息
	Imgs            []string           // 商品图片
	Length          decimal.Decimal    // 长
	Width           decimal.Decimal    // 宽
	Height          decimal.Decimal    // 高
	Weight          decimal.Decimal    // 重
	PackingRate     uint               // 装箱率
	StartingBatch   uint               // 起批量
	InitialFreight  decimal.Decimal    // 起批运费
}

// ChangeData @Title 更新商品信息
func (s *sku) ChangeData(ctx context.Context, args ArgsSkuChangeData) (err error) {
	reply := 0
	xClient, err := client.GetClient(s)
	if err != nil {
		return err
	}
	err = xClient.Call(ctx, "ChangeData", args, &reply)
	return
}

type ByIdsSkuItem struct {
	Id                 uint            `json:"id"`
	Name               string          `json:"name"`               // 名称
	BrandName          string          `json:"brandName"`          // 品牌名称
	FirstCategoryId    uint            `json:"firstCategoryId"`    // 一级分类id
	SecondCategoryId   uint            `json:"secondCategoryId"`   // 二级分类id
	ThirdCategoryId    uint            `json:"thirdCategoryId"`    // 三级分类id
	SupplyPrice        decimal.Decimal `json:"supplyPrice"`        // 采购价
	GuidePrice         decimal.Decimal `json:"guidePrice"`         // 指导价
	ImgUrl             string          `json:"imgUrl"`             // 商品主图
	PlatformStatus     uint            `json:"platformStatus"`     // 平台状态 1=上架 2=下架
	SourceName         string          `json:"sourceName"`         // 供应商名称
	SourceSkuId        string          `json:"sourceSkuId"`        // 源skuId
	SourceStatus       uint            `json:"sourceStatus"`       // 供应商状态 1=上架 2=下架
	CustomerPrice      decimal.Decimal `json:"customerPrice"`      // 供货最高价
	CustomerProfitRate decimal.Decimal `json:"customerProfitRate"` // 供货利润率 供货利润/供货最高价%
	AdjustType         uint            `json:"adjustType"`         // 加价类型
	AdjustPrice        decimal.Decimal `json:"adjustPrice"`        // 加价金额
	AfterAdjustType    uint            `json:"afterAdjustType"`    // 改价后加价类型
	AfterAdjustPrice   decimal.Decimal `json:"afterAdjustPrice"`   // 改价后加价金额
	Handle             uint            `json:"handle"`             // 1=未处理 2=已处理
	Reason             string          `json:"reason"`             // 驳回原因
	Size               string          `json:"size"`
	Color              string          `json:"color"`
	Specifications     []SpecItem      `json:"specifications"`
	Length             decimal.Decimal `json:"length"`         // 长
	Width              decimal.Decimal `json:"width"`          // 宽
	Height             decimal.Decimal `json:"height"`         // 高
	Weight             decimal.Decimal `json:"weight"`         // 重
	PackingRate        uint            `json:"packingRate"`    // 装箱率
	StartingBatch      uint            `json:"startingBatch"`  // 起批量
	InitialFreight     decimal.Decimal `json:"initialFreight"` // 起批运费
}

type SpecItem struct {
	Id        uint   `json:"id"`
	SkuId     uint   `json:"skuId"`
	Name      string `json:"name"`
	Value     string `json:"value"`
	GroupName string `json:"groupName"`
}

// FindByIds @Title 根据Ids查询sku信息
func (s *sku) FindByIds(ctx context.Context, ids []uint) (reply []ByIdsSkuItem, err error) {
	xClient, err := client.GetClient(s)
	if err != nil {
		return nil, err
	}
	err = xClient.Call(ctx, "FindByIds", ids, &reply)
	return
}

// AuthPut @Title 根据sourceSkuId查询供应链是否入库 true=入库 false=没有入库
func (s *sku) AuthPut(ctx context.Context, sourceSkuIds []uint) (reply bool) {
	xClient, err := client.GetClient(s)
	if err != nil {
		return false
	}
	err = xClient.Call(ctx, "AuthPut", sourceSkuIds, &reply)
	return
}