package service
/*
  等同于 php.search_server.middleBaseController
  联营请求外链后 更新或者新增到平台 (es,redis,rabmq)
 */
import (
	"github.com/gin-gonic/gin"
	"github.com/gomodule/redigo/redis"
	"github.com/syyongx/php2go"
	"search_server/middleware"
	"search_server/model"
	"search_server/pkg/common"
	"search_server/pkg/config"
	"search_server/pkg/es"
	"search_server/pkg/gredis"
	"search_server/pkg/mq"
	"search_server/pkg/mysql"
	"strconv"
	"strings"
	"fmt"
	"encoding/json"
)
//定义类名
type CommonLyService struct {
	supplier_over_time  map[string]int64
	supplierId int64 	//调用当前方法的供应商ID
	supplierName string //调用当前方法的供应商名称
	skuEsUpdataList []string	//组装批量更新es数据
	flag string  //调试开关
	flagStr string //调试输出内容
	ctx *gin.Context
}

//初始化类
func (t *CommonLyService) LyServerRun(){
	t.supplier_over_time = map[string]int64{
		"arrow":3600,
		"verical":3600,
		"mouser":3600,
		"master":3600,
		"tme":3600,
		"buerklin":3600,
	}
	t.ctx = middleware.Context
	t.ctx.MultipartForm()
	for requestName, requstValue := range t.ctx.Request.Form {
		if requestName == "flag" {
			t.flag = strings.TrimSpace(requstValue[0])
		}
	}
}

/*
联营公共类
联营大类,包括修改新增 sku es redis ,推送数据到队列让其他go服务更新数据到mysql
@param goods_list 请求联营格式化后的数据
@param supplier_info 供应商商品详情
*/
func (t *CommonLyService) GetSkuByGoodsSn(goodsList map[string]*model.LyClearGoodsList,supplierInfo *model.SUPPLIER_REDIS_INFO_) map[string]interface{}{
	t.LyServerRun(); //初始化变量

	redisRead := gredis.Conn("search_r")
	defer redisRead.Close()

	t.supplierId = supplierInfo.SupplierId
	t.supplierName = supplierInfo.SupplierNickname

	originGoods := make(map[string]interface{},0)

	for goods_sn, info := range goodsList {

		snSku := php2go.Md5(strings.ToLower(goods_sn))
		skuId,_ := gredis.String(redisRead.Do("HGET",config.Get("redis_all.SKU_UNIQUE_JUDGE").String(),snSku)) //查询唯一值,反查sku_id

		var sku_flag bool = false; //是否新增或者更新db+redis,为true则新增
		if skuId == "" { //为空,先创建sku
			lock_key := "searchapi_"+snSku;
			flag,_ := redis.Bool(redisRead.Do("SETNX", lock_key,php2go.Time()+2))
			if flag { //不存在锁,直接新增
				sku_flag = true
				redisRead.Do("EXP",lock_key,2) //给锁有效时间2秒
				//sku_id = t.writeSkuInfo(info)
			}else{ //存在锁

			}
		}
		print(info)
		print(sku_flag)
		//productList[goodsSn] = &LyClearGoodsList
	}

	fmt.Println(originGoods)
	return originGoods
}

/*
生成或者更新 sku信息
*/
func (t *CommonLyService) writeSkuInfo(skuInfo *model.LyClearGoodsList,skuId string,)  {
	redisWrite := gredis.Conn("search_w")
	defer redisWrite.Close()

	spuKey := common.GetKey(skuInfo.GoodsName+"_"+skuInfo.BrandName)
	spuId,_  := gredis.String(redisWrite.Do("HGET",config.Get("redis_all.SKU_UNIQUE_JUDGE").String(),spuKey))
	if spuId == "" { //不存在spu,创建新的spu
		spuId = t.writeSpuInfo(skuInfo)
	}

	if skuId == "" {
		skuId = common.CreateId("sku");
	}

	inSkuInfo := model.LySkuInfo{
       SpuId: spuId,
       Encoded: "",
       Moq: skuInfo.Moq,
	   Mpq: skuInfo.Increment,
	   OldGoodsId: 0,
	   GoodsType: 1,
       GoodsStatus: 1,
       BatchSn:"",
       Stock:skuInfo.Stock,
       HkDeliveryTime: "",
       CnDeliveryTime: "",
       LadderPrice: skuInfo.Tiered,
       UpdateTime: php2go.Time(),
       GoodsImages: "",
       Canal: "",
       SupplierId:t.supplierId,
	}

	jsonStr, _ := json.Marshal(inSkuInfo)
	redisWrite.Do("HSET","sku",spuId,jsonStr)

	skuKey := common.GetKey(skuInfo.GoodsSn+"_"+strconv.FormatInt(t.supplierId,10))
	redisWrite.Do("HSET",config.Get("redis_all.SKU_UNIQUE_JUDGE").String(),skuKey,skuId)

	//todo 如果是digikey新增,需要插入原始映射表
	if t.supplierId == 7 {
		redisWrite.Do("HSET",config.Get("redis_all.SKU_RAW_MAP").String(),skuKey,skuId)
	}

}

/*
生成spu
*/
func (t *CommonLyService) writeSpuInfo(skuInfo *model.LyClearGoodsList) string {
	redisWrite := gredis.Conn("search_w")
	defer redisWrite.Close()

	brand_key := common.GetKey(strings.ToLower(skuInfo.BrandName))
	brandId,_  := redis.Int64(redisWrite.Do("HGET", config.Get("redis_all.BRAND_NAME_ALL").String(),brand_key))
	if brandId == 0 {
		brandId,_  = redis.Int64(redisWrite.Do("HGET",config.Get("redis_all.SUPPLIER_BRAND_ALL").String(),brand_key))
		if brandId == 0  {
			brandId = t.writeBrandInfo(skuInfo)
		}
	}

	spuId := common.CreateId("spu")  //创建spu的id
	Spuinfo := model.LySpuInfo{
		ClassId1:0,
		ClassId2:0,
		ClassId3:0,
		BrandId:brandId,
		SpuName:skuInfo.GoodsName,
		Status:1,
		ImagesL:"",
		Encap:"",
		Pdf:"",
		SpuBrief:"",
		UpdateTime:php2go.Time(),
	}

	jsonStr, _ := json.Marshal(Spuinfo)
	redisWrite.Do("HSET","spu",spuId,jsonStr)

	spuKey := common.GetKey(skuInfo.GoodsName+"_"+skuInfo.BrandName)
	redisWrite.Do("HSET",config.Get("redis_all.SPU_UNIQUE_JUDGE").String(),spuKey,spuId)

	return spuId
}
/*
生成品牌
*/
func (t *CommonLyService) writeBrandInfo(skuInfo *model.LyClearGoodsList) int64 {
	var (
		dbSpu = mysql.Conn("spu") //spu实例化链接
		brandId int64  //品牌id
		brandkey = common.GetKey(skuInfo.BrandName) //品牌唯一值
		redisWrite = gredis.Conn("search_w")
	)
	defer redisWrite.Close()


	has, err := dbSpu.Table("brand").Where("brand_name = ?", skuInfo.BrandName).Cols("id").Get(&brandId)
	if err != nil {
		fmt.Println(err) //查询错误
		return 0
	}
	if has {//不存在品牌,则创建品牌
		sql :="insert into brand(brand_name,create_time,insert_type) values (?, ?, ?)"
		results, err := dbSpu.Exec(sql,skuInfo.BrandName, php2go.Time(),1)
		if err != nil {
			fmt.Println(err) //查询错误
			return 0
		}
		brandId,_ = results.LastInsertId()
	}
   //更新redis 品牌数据
	redisWrite.Do("HSET",config.Get("redis_all.BRAND_NAME_ALL").String(),brandkey,brandId)
	redisWrite.Do("HSET",config.Get("redis_all.BRAND").String(),brandkey,brandId)

	return brandId;
}
/*
组装推送到es数据
 */
func (t * CommonLyService) EsSkuInfo(skuInfo *model.LyClearGoodsList,spuId * string,brandId *string)  {
	sort := 1;  //排序
	if skuInfo.SinglePrice >0 && skuInfo.Stock >0 && skuInfo.Stock >= skuInfo.Increment && skuInfo.Stock >= skuInfo.Moq {
		sort = 31;
	}else if skuInfo.SinglePrice >0 && skuInfo.Stock >0 {
		sort = 30;
	}else if skuInfo.SinglePrice > 0  {
        sort = 28;
	}else if skuInfo.Stock >0 {
		sort = 29;
	}
	stock_sort := 1;
	if skuInfo.Stock > 0 {
		stock_sort = 3;
	}
	single_price_sort := 1;
	if skuInfo.SinglePrice > 0 {
		single_price_sort = 3;
	}

	nowTime := php2go.Time()

	param := map[string]interface{}{
		"goods_id":skuInfo.GoodsId,
		"goods_name":skuInfo.GoodsName,
		"auto_goods_name":php2go.Strtoupper(skuInfo.GoodsName),
		"brand_id":*brandId,
		"brand_name":skuInfo.BrandName,
		"supplier_name":t.supplierName,
		"class_id1":0,
		"class_id2":0,
		"class_id3":0,
		"spu_id":*spuId,
		"sale_time":nowTime,
		"create_time":nowTime,
		"update_time":nowTime,
		"single_price":skuInfo.SinglePrice,
		"stock":skuInfo.Stock,
		"goods_status":1,
		"status":1,
		"sort":sort,
		"encoded": "",
		"encap":"",
		"canal_new":"",
		"stock_sort":stock_sort,   //主要为库存为0的往后排服务
		"single_price_sort":single_price_sort,  //主要为单价为0的往后排服务
	}

	paramjson,_ := json.Marshal(param)
	t.skuEsUpdataList = append(t.skuEsUpdataList,`{"index":{"_index":"`+t.supplierName+`","_type":"goods","_id":"`+skuInfo.GoodsId+`"}}`)
	t.skuEsUpdataList = append(t.skuEsUpdataList,string(paramjson))

}

/*
推入队列=》(斌 go队列去消费更新db+mongodb..等操作)
*/
func (t * CommonLyService) updateSkuDB(skuInfo *model.LyClearGoodsList)  {
	if skuInfo.GoodsId == "" {
		return
	}
	param := map[string]interface{}{
		"pn":t.supplierName,
		"stock":skuInfo.Stock,
		"tiered":skuInfo.PriceTemp,
		"increment":skuInfo.Increment,
		"sku_id":skuInfo.GoodsId,
		"brand_name":skuInfo.BrandName,
		"goods_name":skuInfo.GoodsName,
		"goods_sn":skuInfo.GoodsSn,
	}
	paramjson,_ := json.Marshal(param)
	if t.flag == "101" {
		t.flagStr = "<br/><br/>";
		t.flagStr = "推送到go更新db:";
		t.flagStr =  string(paramjson);
		t.flagStr = "<br/><br/>";
	}
    mq.PushMsg(config.Get("rabmq_all.SEARCH_SKU_UPDATE_LIST").String(),string(paramjson))
}

/*
批量插入或者更新es
*/
func (t *CommonLyService) pushEs()  {
	if len(t.skuEsUpdataList) == 0 {
		if t.flag == "101" {
			t.flagStr += "<br/>没有可插入es的数据"
		}
		return
	}
	param := strings.Join(t.skuEsUpdataList, "\n")+"\n"
	result,_ := es.BulkES(param)  //批量插入
	if t.flag == "101" {
		t.flagStr += "<br/>"
		t.flagStr += "插入es:"
		t.flagStr += param
		t.flagStr += result
	}
}