package service

import (
	"github.com/gin-gonic/gin"
	"github.com/gomodule/redigo/redis"
	"github.com/iancoleman/orderedmap"
	"github.com/syyongx/php2go"
	"github.com/tidwall/gjson"
	"go_sku_server/model"
	"go_sku_server/pkg/common"
	"go_sku_server/pkg/gredis"
)
//自营公共函数类
/*
 计算单个sku总锁库数量
 */
func (qs *ZiyingService) skuLockNum(c *redis.Conn,goodsId string)  int64{
	reply, err := redis.Values((*c).Do("hvals", "Self_StockLock"+goodsId))
	if err != nil {
		return 0;
	}

	var albums []int64
	if err := redis.ScanSlice(reply, &albums); err != nil {
		return  0;
	}
	if len(albums) == 0 {
        return 0;
	}else{
		var all int64 = 0
		for _,n := range albums {
			all = all+n
		}
		return all
	}
}

/*
 获取自营活动价
*/
func (qs *ZiyingService) ActivityPrice(ctx *gin.Context,SkuInfo string,c *redis.Conn)  *orderedmap.OrderedMap {
	 //新客价处理
	if ctx.Request.FormValue("power[newCustomer]") == "true" ||
	   ctx.Request.FormValue("power[newCustomer]") == "1" {
		goodsActivityPrice,_ := gredis.String((*c).Do("get","Self_ActivityPrice_10000_NewCustomer"))
		if goodsActivityPrice != "" {
           data :=  qs.HDActivityPrice(ctx,goodsActivityPrice,SkuInfo,"5")
			if data != nil {
				return data
			}
		}

    }
    //团购限制
	data :=  qs.HDGoodsLimit(gjson.Get(SkuInfo,"goods_id").String(),gjson.Get(SkuInfo,"stock").String(),c)
	if data != nil {
		return data
	}
    //活动价
	GoodsActivityPrice,_ := gredis.String((*c).Do("get","Self_ActivityPrice_10000"))
	if GoodsActivityPrice != "" {
		data :=  qs.HDActivityPrice(ctx,GoodsActivityPrice,SkuInfo,"2")
		if data != nil {
			return data
		}
	}
	//会员价
	GoodsActivityPrice,_ = gredis.String((*c).Do("get","Self_ActivityPrice_10000_Member"))
	if GoodsActivityPrice != "" {
		data :=  qs.HDActivityPrice(ctx,GoodsActivityPrice,SkuInfo,"3")
		if data != nil {
			return data
		}
	}

	return nil
}

/*
 计算活动价

ac_type说明: 0 没有活动
活动名称 	ac_type 类型
限时限量活动 	1 	    自营
活动价   	2 	    自营 and 联营
会员价 	    3 	    自营 and 联营
折扣价(废除)4 	    自营 and 联营
新客价   	5 	    自营 and 联营
自营系数 	6 	    自营
团购价 	    7 	    联营
折扣价 	    8 	    自营 and 联营

*/
func (qs *ZiyingService) HDActivityPrice(ctx *gin.Context,GoodsActivityPrice string,SkuInfo string,Actype string)  *orderedmap.OrderedMap {
	visible_roster := gjson.Get(GoodsActivityPrice,"visible_roster").String()
	activity_id := gjson.Get(GoodsActivityPrice,"activity_id").String()
	is_part := gjson.Get(GoodsActivityPrice,"is_part").String()
	activity_type := gjson.Get(GoodsActivityPrice,"activity_type").String()

	Ratio := true //是否符合活动价
	if Actype == "5" { //新客价
		ratio_goods_id := gjson.Get(GoodsActivityPrice,"goods_id").String() //活动型号id
		ratio_brand_id := gjson.Get(GoodsActivityPrice,"brand_id").String() //活动品牌id
		ratio_class_id := gjson.Get(GoodsActivityPrice,"class_id").String() //活动分类id

		//指定参与新客价型号
		if ratio_goods_id != "" {
			if php2go.Stripos(","+ratio_goods_id+",",","+gjson.Get(SkuInfo,"goods_id").String()+",",0) == -1 {
				 Ratio = false; //不符合新客价
				 goto End
			}
		}
		//指定品牌
		if ratio_brand_id != "" {
			if php2go.Stripos(","+ratio_brand_id+",",","+gjson.Get(SkuInfo,"brand_id").String()+",",0) == -1 {
				Ratio = false; //不符合新客价
				goto End
			}
		}
		//指定分类
		if ratio_class_id != "" {
			if php2go.Stripos(","+ratio_class_id+",",","+gjson.Get(SkuInfo,"class_id2").String()+",",0) == -1 {
				Ratio = false; //不符合新客价
				goto End
			}
		}
	}else{
		if !common.GInArray(GoodsActivityPrice,"brand_id",gjson.Get(SkuInfo,"brand_id").String()) {
			Ratio = false; //不符合活动价
			goto End
		}
		if !common.GInArray(GoodsActivityPrice,"class_id",gjson.Get(SkuInfo,"class_id2").String()) {
			Ratio = false; //不符合活动价
			goto End
		}

		//会员价处理
		if Actype == "3" && is_part == "1" && visible_roster != "" {
            visible_roster = ","+visible_roster+","
			if php2go.Stripos(visible_roster,","+ctx.Request.FormValue("power[user_id]")+",",0) == -1 ||
				php2go.Stripos(visible_roster,","+ctx.Request.FormValue("power[mobile]")+",",0) == -1 ||
				php2go.Stripos(visible_roster,","+ctx.Request.FormValue("power[email]")+",",0) == -1	{
				Ratio = false; //不符合新客价
				goto End
			}
		}
		//处理黑名单,只有折扣活动才有黑名单,并且是下单页面,debug
		if Actype == "2" &&
			activity_id != "" &&
		    activity_type == "2" &&
			ctx.Request.FormValue("power[verify_blacklist]") == "true" {

			//redisConn := gredis.Conn("search_r")
			//defer redisConn.Close();
			//
			//blacklist, _ := redis.String(redisConn.Do("hget", "activity_roster",activity_id+"_1"))
			//blacklist_type := config.Cfg.Section("blacklist_type").KeysHash()
			//
			//blacklistArr := php2go.Explode(",",blacklist)
			//for p,d := range blacklist_type {
			//
			//	//backval,ok := blacklist_type[d]
			//
			//	if php2go.Stripos(visible_roster,","+middleware.REQUEST["power[user_id]"]+",",0) == -1 {
			//		Ratio = false; //不符合新客价
			//		goto End
			//	}
			//}
		}

	}

End: //最终执行
	if Ratio {
		discount_type := gjson.Get(GoodsActivityPrice,"discount_type").String()
		ratio := gjson.Get(GoodsActivityPrice,"ratio").Float()  //当前活动折扣

		ladder_price_arr := gjson.Get(SkuInfo,"ladder_price").Array()

		A := orderedmap.New();
		ladderType := make([]model.LadderPrice,0)
		for _,v := range ladder_price_arr{
			if Actype != "7" || (Actype =="7" && discount_type != "") || discount_type == "1" {
				price_cn := v.Get("price_cn").Float()
				price_ac := php2go.Round(price_cn*ratio/100)

				ladderType = append(ladderType, model.LadderPrice{
					Purchases: v.Get("Purchases").Int(),
					PriceUs: v.Get("price_us").Float(),
					PriceCn: price_cn,
					PriceAc: price_ac,

				})
			}
		}
        A.Set("ratio",ratio)
        A.Set("ac_type",Actype)
        A.Set("allow_coupon",ratio)
        A.Set("activity_end_time",ratio)
        A.Set("activity_info",ratio)
        return A
	}
    return nil
}

/*
 获取当前锁住的库存
 */
func (qs *ZiyingService) HDGoodsLimit(SkuID string,Stock string,c *redis.Conn)  *orderedmap.OrderedMap {

	GoodsLimit, _ := redis.String((*c).Do("get", "Self_GoodsLimit_"+SkuID))
	if GoodsLimit == "" {
		return nil
	}
	start_time := gjson.Get(GoodsLimit,"start_time").Int()
	end_time := gjson.Get(GoodsLimit,"end_time").Int()
	buy_stock := gjson.Get(GoodsLimit,"buy_stock").Float()
	ac_stock := gjson.Get(GoodsLimit,"ac_stock").Float()
	schedule := gjson.Get(GoodsLimit,"schedule").Float()
	allow_coupon := gjson.Get(GoodsLimit,"allow_coupon").Int()

	if start_time < php2go.Time() && end_time >php2go.Time() {
		buy := buy_stock/ac_stock*100
		schedule := common.MyRound(buy+schedule,2)
		if schedule < 100 {
			A := orderedmap.New();
            //拼接梯度价格
			ladder_price_arr := gjson.Get(GoodsLimit,"ac_price").Array()
			ladderType := make([]model.LadderPrice,0)
			for _,v := range ladder_price_arr{
				ladderType = append(ladderType, model.LadderPrice{
					Purchases: v.Get("Purchases").Int(),
					PriceCn: v.Get("price_cn").Float(),
					PriceAc: v.Get("price_ac").Float(),
				})
			}

			now_stock := ac_stock*((100-schedule)/100)

			A.Set("ac_type",1)
			A.Set("ac_id",gjson.Get(GoodsLimit,"id").Int())
			A.Set("ladder_price",ladderType)
			A.Set("ac_stock",ac_stock)
			A.Set("stock",now_stock)
			A.Set("schedule",schedule)
			A.Set("activity_end_time",end_time)
			if allow_coupon >0 {
				A.Set("allow_coupon",allow_coupon)
			}else{
				A.Set("allow_coupon",1)
			}
			//活动库存大于当前可售库存,强制结束活动
			if now_stock > common.MyFloat64(Stock) || now_stock == 0 {
               return nil
			}

            return A
		}
		
	}
	return nil
}