package controller

import (
	"github.com/gin-gonic/gin"
	"github.com/syyongx/php2go"
	"go_sku_server/pkg/common"
	"go_sku_server/service"
	"sync"
)


const goods_slice_count = 10 //每多少个型号id开启一个协程

/*
  查询商品详情(自营或者联营)
@doc  http://192.168.2.232:3000/project/128/interface/api/649

@param   goods_id                   支持批量,不建议超过40个,超过会导致处理时间超过2秒,进程异常 : 74564,65897,456464131
@param   power[newCustomer]         是否获取新客价  :true
@param   power[member]              是否获取会员价  :true
@param   power[mobile]              获取会员价时,用户有手机号时必填,用于会员价可见名单。活动价时必须,否则可能导致用户无法享受活动价 :13510507993
@param   power[email]               获取会员价时,用户有邮箱时必填,用于会员价可见名单。活动价时必须,否则可能导致用户无法享受活动价   ymx@ichunt.com
@param   power[user_id]             获取会员价时,必填,用于会员价可见名单。活动价时必须,否则可能导致用户无法享受活动价,如果用户未登录,可为空,用户是否可见活动价取决于配置 65139
@param   power[fast]                仅获取价格与库存 :1
@param   power[invoice]             增值税普通发票公司名字,活动价时必须,否则可能导致用户无法享受活动价  :深圳是猎芯科技有限公司
@param   power[special_invoice]     增值税专用发票公司名字,活动价时需要,否则可能导致用户无法享受活动价  : 深圳是猎芯科技有限公司
@param   power[verify_blacklist]    是否验证黑名单,用于折扣活动提交订单页面与后台下单 :true

*/

func Synchronization(ctx *gin.Context) {
    common.PrintDebugHeader(ctx) //开启debug调试

	zyService := service.ZiyingService{} //实例化自营查询
	lyService := service.LyService{} //实例化自营查询

	//抽取自营 或者联营 goods_id
    GoodsIdStr := ctx.Request.FormValue("goods_id")
	if GoodsIdStr == "" {
		common.Output(ctx,1001,"查询型号ID不得为空","")
		return
	}

	GoodsRes := sync.Map{}

	goodsIdArr := php2go.Explode(",",GoodsIdStr)
	wg := sync.WaitGroup{} //协程

	zyGoodsId := make([]string,0)
	lyGoodsId := make([]string,0)
	for _,goods_id := range goodsIdArr {
		if len(goods_id) < 19 { //自营
			zyGoodsId = append(zyGoodsId,goods_id)
			if len(zyGoodsId) >= goods_slice_count {

				common.PrintDebugHtml(ctx,"zy增加协程:")
				common.PrintDebugHtml(ctx,zyGoodsId)

				wg.Add(1)  //协程计数一
				go zyService.ZyGoodsDetail(ctx,zyGoodsId,&GoodsRes,&wg)
				zyGoodsId = zyGoodsId[:0:0]
			} 
		}else{  //联营
			lyGoodsId = append(lyGoodsId,goods_id)
			if len(lyGoodsId) >= goods_slice_count {
				common.PrintDebugHtml(ctx,"ly增加协程:")
				common.PrintDebugHtml(ctx,zyGoodsId)

				wg.Add(1)
				go lyService.LyGoodsDetail(lyGoodsId,&wg)
				lyGoodsId = lyGoodsId[:0:0]
			}
		}
	}

	if len(zyGoodsId) >0 {
		common.PrintDebugHtml(ctx,"zy增加协程:")
		common.PrintDebugHtml(ctx,zyGoodsId)
		wg.Add(1)  //协程计数一
		go zyService.ZyGoodsDetail(ctx,zyGoodsId,&GoodsRes,&wg)
	}

	if len(lyGoodsId) >= goods_slice_count {
		common.PrintDebugHtml(ctx,"ly增加协程:")
		common.PrintDebugHtml(ctx,zyGoodsId)
		wg.Add(1)
		go lyService.LyGoodsDetail(lyGoodsId,&wg)
	}

	wg.Wait()

	//异步map最后转成map
	temp := make(map[string]interface{})
	GoodsRes.Range(func(k, v interface{}) bool {
		s,_ := k.(string)
		temp[s] = v
		return true
	})

	common.Output(ctx,0,"查询成功",temp)
}

/*
健康监测
 */
func Health(ctx *gin.Context)  {
	ctx.String(200,"ok")
}