package model

import (
	"strings"

	"github.com/tidwall/gjson"
)

// 联营sku结构体
type LySku struct {
	LadderPrice       []LadderPrice `json:"-"`
	SpuId             string        `json:"spu_id"`
	OldGoodsId        int64         `json:"old_goods_id"`
	UpdateTime        int64         `json:"update_time"`
	CpTime            int64         `json:"cp_time"`
	GoodsStatus       int64         `json:"goods_status"`
	GoodsType         int64         `json:"goods_type"`
	SupplierId        int64         `json:"supplier_id"`
	Encoded           string        `json:"encoded"`
	BatchSn           string        `json:"batch_sn"`
	Moq               int64         `json:"moq"`
	Mpq               int64         `json:"mpq"`
	Multiple          int64         `json:"multiple"`
	Stock             int64         `json:"stock"`
	HkDeliveryTime    string        `json:"hk_delivery_time"`
	CnDeliveryTime    string        `json:"cn_delivery_time"`
	LadderPriceResult interface{}   `json:"ladder_price"`
	GoodsImages       string        `json:"goods_images"`
	Canal             string        `json:"canal"`
	IsExpire          int           `json:"is_expire,omitempty"`
	Packing           string        `json:"packing"`
	GoodsId           string        `json:"goods_id"`
	GoodsName         string        `json:"goods_name"`
	SkuName           string        `json:"sku_name"`
	BrandName         string        `json:"brand_name"`
	SupplierName      string        `json:"supplier_name"`
	Attrs             interface{}   `json:"attrs"`
	ScmBrand          interface{}   `json:"scm_brand"`
	AllowCoupon       int           `json:"allow_coupon"`
	BrandId           int64         `json:"brand_id"`
	//系数相关
	Coefficient   interface{}   `json:"coefficient,omitempty"`
	OriginalPrice []OriginPrice `json:"original_price,omitempty"`
	//数据库存的价格,因为数据库存的是什么币种都有可能,但是也要展示数据库存的,所以要有这个字段
	DatabasePrice interface{} `json:"database_price,omitempty"`
	SuppExtendFee interface{} `json:"supp_extend_fee"`
	IsBuy         int         `json:"is_buy"`
	OrgId         int         `json:"org_id"`
	//spu信息
	ClassID1  int         `json:"class_id1"`
	ClassID2  int         `json:"class_id2"`
	ClassID3  int         `json:"class_id3"`
	SpuName   string      `json:"spu_name"`
	Status    int         `json:"status"`
	ImagesL   string      `json:"images_l"`
	Encap     string      `json:"encap"`
	Pdf       string      `json:"pdf"`
	SpuBrief  string      `json:"spu_brief"`
	ClassName string      `json:"class_name,omitempty"`
	ErpTax    interface{} `json:"erp_tax"`

	GoodsSn      string  `json:"goods_sn"`
	GoodsDetails string  `json:"goods_details"`
	ClassName1   string  `json:"class_name1,omitempty"`
	ClassName2   string  `json:"class_name2,omitempty"`
	ClassName3   string  `json:"class_name3,omitempty"`
	Ratio        float64 `json:"ratio,omitempty"`
	RatioUs      float64 `json:"ratio_us,omitempty"`
	SpuDetail    string  `json:"spu_detail,omitempty"`

	AcType int `json:"ac_type"`
	//活动信息
	HasGiftActivity      int           `json:"has_gift_activity"`
	GiftActivity         GiftActivity  `json:"gift_activity"`
	ActivityInfo         PriceActivity `json:"activity_info"`
	StandardBrand        StandardBrand `json:"standard_brand"`
	GoodsTag             GoodsTag      `json:"goods_tag"`
	StockInfo            interface{}   `json:"stock_info"`
	SkuDetail            string        `json:"sku_detail"`
	SpuExtra             SpuExtra      `json:"spu_extra"`
	Eccn                 string        `json:"eccn"`
	DiscountRatio        DiscountRatio `json:"discount_ratio"`
	PriceRatioSort       int           `json:"price_ratio_sort"`
	PriceRatio           []PriceRatio  `json:"price_ratio"`
	Source               int           `json:"source"`
	OriginCurrencySymbol string        `json:"origin_currency_symbol,omitempty"`
	CustomizeRateRMB     float64
	CustomizeRateUs      float64
	SpuEccn              string        `json:"spu_eccn"`
	CustomPriceList      []CustomPrice `json:"custom_price_list"`
}

type DiscountRatio struct {
	Ratio    float64 `json:"ratio"`
	RatioUsd float64 `json:"ratio_usd"`
}

type PriceRatio struct {
	Ratio     float64 `json:"ratio"`
	RatioUsd  float64 `json:"ratio_usd"`
	Purchases int64   `json:"purchases,omitempty"`
}

type PriceActivity struct {
	ActivityCommon
	Ratio    float64 `json:"ratio,omitempty"`
	RatioUs  float64 `json:"ratio_us,omitempty"`
	SignText string  `json:"sign_text,omitempty"`
	Sign     string  `json:"sign,omitempty"`
	ShowName string  `json:"show_name,omitempty"`
	SignUrl  string  `json:"sign_url"`
}

type GiftActivity struct {
	ActivityCommon
	CanAdminOrder interface{}    `json:"can_admin_order"`
	ItemList      []ActivityItem `json:"items,omitempty"`
}

type ActivityCommon struct {
	HasActivity  bool   `json:"-"`
	ActivityId   int    `json:"activity_id,omitempty"`
	ActivityName string `json:"activity_name,omitempty"`
	AllowCoupon  int    `json:"-"`
	UserScope    int    `json:"user_scope,omitempty"`
}

type StandardBrand struct {
	StandardBrandId int    `json:"standard_brand_id,omitempty"`
	BrandName       string `json:"brand_name,omitempty"`
	BrandLogo       string `json:"brand_logo,omitempty"`
}

type GoodsTag struct {
	GoodsLabel     int      `json:"goods_label,omitempty"`
	GoodsLabelName string   `json:"goods_label_name,omitempty"`
	GoodsTag       []int    `json:"goods_tag,omitempty"`
	GoodsTagNames  []string `json:"goods_tag_names,omitempty"`
}

type StockInfo struct {
	Period           string `json:"period" bson:"period"`
	PeriodTime       int    `json:"-" bson:"period_time"`
	PeriodTimeFormat string `json:"period_time"`
	Stock            int    `json:"stock" bson:"stock"`
}

type SpuExtra struct {
	ImageList []struct {
		Name      string `bson:"name" json:"name"`
		Thumbnail string `bson:"thumbnail" json:"thumbnail"`
	} `bson:"image_list" json:"image_list"`

	SpuDetail string `bson:"spu_detail" json:"spu_detail"`
	SpuId     string `bson:"spu_id" json:"spu_id"`
}

type CustomPrice struct {
	PriceName   string        `json:"price_name"`
	LadderPrice []LadderPrice `json:"ladder_price"`
}

// 为什么不直接映射到结构,而要用gjson,因为redis存的数据结构不一定正常,可能类型不一致
func InitSkuData(sku string) (data LySku) {

	source := gjson.Get(sku, "source").Int()
	data.Source = int(source)

	goodsSn := gjson.Get(sku, "goods_sn").String()
	data.GoodsSn = goodsSn

	spuId := gjson.Get(sku, "spu_id").String()
	data.SpuId = spuId

	oldGoodsId := gjson.Get(sku, "old_goods_id").Int()
	data.OldGoodsId = oldGoodsId

	updateTime := gjson.Get(sku, "update_time").Int()
	data.UpdateTime = updateTime

	goodsStatus := gjson.Get(sku, "goods_status").Int()
	data.GoodsStatus = goodsStatus

	supplierId := gjson.Get(sku, "supplier_id").Int()
	data.SupplierId = supplierId

	goodsName := gjson.Get(sku, "goods_name").String()
	data.GoodsName = goodsName

	skuName := gjson.Get(sku, "goods_name").String()
	data.SkuName = skuName

	goodsType := gjson.Get(sku, "goods_type").Int()
	data.GoodsType = goodsType

	encoded := gjson.Get(sku, "encoded").String()
	data.Encoded = encoded

	batchSn := gjson.Get(sku, "batch_sn").String()
	data.BatchSn = batchSn

	moq := gjson.Get(sku, "moq").Int()
	data.Moq = moq

	mpq := gjson.Get(sku, "mpq").Int()
	data.Mpq = mpq

	data.OriginCurrencySymbol = "$"

	//递增量
	Multiple := gjson.Get(sku, "multiple").Int()
	if Multiple > 0 {
		data.Multiple = Multiple
	} else {
		if mpq > moq {
			data.Multiple = moq
		} else {
			data.Multiple = mpq
		}
	}

	//2023.5.6 如果是rochester ,递增量为1
	if supplierId == 3 {
		data.Multiple = 1
	}

	stock := gjson.Get(sku, "stock").Int()
	data.Stock = stock

	eccn := gjson.Get(sku, "eccn").String()
	data.Eccn = eccn

	isExpire := gjson.Get(sku, "is_expire").Int()
	data.IsExpire = int(isExpire)
	data.IsExpire = 0

	hkDeliveryTime := gjson.Get(sku, "hk_delivery_time").String()
	data.HkDeliveryTime = hkDeliveryTime

	cnDeliveryTime := gjson.Get(sku, "cn_delivery_time").String()
	data.CnDeliveryTime = cnDeliveryTime

	goodsDetail := gjson.Get(sku, "goods_details").String()
	data.GoodsDetails = goodsDetail

	goodsImages := gjson.Get(sku, "goods_images").String()
	goodsImages = strings.Replace(goodsImages, "http://img.ichunt.com", "https://img.ichunt.com", 1)
	goodsImages = strings.Replace(goodsImages, "http://image.ichunt.net", "https://image.ichunt.net", 1)
	goodsImages = strings.Replace(goodsImages, "https://image.ichunt.net", "https://imgscdn.ichunt.com", 1)
	data.GoodsImages = goodsImages

	canal := gjson.Get(sku, "canal").String()
	data.Canal = canal

	//组织id,默认都是猎芯,因为没有默认存到redis,所以默认是1
	orgId := gjson.Get(sku, "org_id").Int()
	if orgId != 0 {
		data.OrgId = int(orgId)
	} else {
		data.OrgId = 1
	}

	//加上紧急判断,如果是立创(L0001175)的商品,就修改内部编码
	if data.Canal == "L0001175" {
		data.Encoded = "10142-L"
	}

	cpTime := gjson.Get(sku, "cp_time").Int()
	data.CpTime = cpTime

	LadderPriceStr := gjson.Get(sku, "ladder_price").String()
	data.LadderPrice = getLadderPrice(LadderPriceStr)
	data.OriginalPrice = getOriginPrice(LadderPriceStr)
	data.DatabasePrice = getDatabasePrice(LadderPriceStr)

	return
}

// 获取联营商品的阶梯价
func getLadderPrice(ladderPriceStr string) (ladderPrice []LadderPrice) {
	ladderPriceArr := gjson.Parse(ladderPriceStr).Array()
	for _, price := range ladderPriceArr {
		ladderPrice = append(ladderPrice, LadderPrice{
			Purchases:   price.Get("purchases").Int(),
			PriceUs:     price.Get("price_us").Float(),
			PriceCn:     price.Get("price_cn").Float(),
			PriceAc:     price.Get("price_ac").Float(),
			CostPrice:   price.Get("cost_price").Float(),
			PriceCostUs: price.Get("price_cost_us").Float(),
			PriceCostCn: price.Get("price_cost_cn").Float(),
		})
	}
	if len(ladderPrice) == 0 {
		ladderPrice = []LadderPrice{}
		return
	}
	return
}

// 获取原始价格
func getOriginPrice(ladderPriceStr string) (ladderPrice []OriginPrice) {
	ladderPriceArr := gjson.Parse(ladderPriceStr).Array()
	for _, price := range ladderPriceArr {
		ladderPrice = append(ladderPrice, OriginPrice{
			Purchases: price.Get("purchases").Int(),
			PriceUs:   price.Get("price_us").Float(),
			PriceCn:   price.Get("price_cn").Float(),
			PriceAc:   price.Get("price_ac").Float(),
			CostPrice: price.Get("cost_price").Float(),
		})
	}
	if len(ladderPrice) == 0 {
		ladderPrice = []OriginPrice{}
		return
	}

	return
}

// 获取原始价格
func getDatabasePrice(ladderPriceStr string) (ladderPrice []DatabasePrice) {
	ladderPriceArr := gjson.Parse(ladderPriceStr).Array()
	for _, price := range ladderPriceArr {
		ladderPrice = append(ladderPrice, DatabasePrice{
			Purchases: price.Get("purchases").Int(),
			PriceUs:   price.Get("price_us").Float(),
			PriceCn:   price.Get("price_cn").Float(),
			PriceAc:   price.Get("price_ac").Float(),
			CostPrice: price.Get("cost_price").Float(),
		})
	}
	if len(ladderPrice) == 0 {
		ladderPrice = []DatabasePrice{}
		return
	}

	return
}