<?php
/**
  * @method 关键字管理
  * @author soul
  * @copyright 2016/3/31
  */
class B2cKeyword extends B2cBase
{
	/**
	  * @method 根据关键词搜索ID
	  * @param  word 关键词 array('奔驰'，'滤清器')
	  * @author xu
	  * @copyright 2017/9/20
	  * @return [["status"]=> bool(true) ["data"]=> array("奔驰"=>'14515','滤清器'=>'123213',...) ["code"]=>0]
	  */
	public function getKeywordKeyIds($word)
	{
		// 参数
		$temp = [];
		if(is_array($word) && !empty($word = array_filter($word)))
		{
			$word = array_map(function($v){return sprintf("'%s'",strtoupper(LibFc::Escape($v)));}, $word);
			// 执行
			$res = $this->get('bc_keyword',['key_id','key_txt'], sprintf(" and key_txt in (%s) ",implode(',', $word)));
			$temp = array_column($res['data'], 'key_id' ,'key_txt');
		}
		// 返回
		return LibFc::ReturnData(true, $temp);
	}

	/**
	  * @method 添加关键词
	  * @param  word 关键词 array('奔驰'，'滤清器')
	  * @author xu
	  * @copyright 2017/9/20
	  * @return [["status"]=> bool(true) ["data"]=> array("奔驰"=>'14515','滤清器'=>'123213',...) ["code"]=>0]
	  */
	public function addKeyword($word)
	{
		$res = $this->getKeywordKeyIds($word);
		$exist = $res['data'];
		$addArr = [];
		$this->B2CDb->Begin();
		foreach($word as $v)
		{
			$v = strtoupper(trim($v));
			if(!isset($exist[$v]))
			{
				$res = $this->add('bc_keyword', ['key_txt'=>$v]);
				$exist[$v] = $res['data'];
			}
		}
		$this->B2CDb->End();
		return LibFc::ReturnData(true, $exist);
	}

	/**
	  * @method 删除关键字
	  * @param  word 关键词 array('奔驰'，'滤清器')
	  * @author xu
	  * @copyright 2017/9/20
	  * @return [["status"]=> bool(true) ["data"]=> bool(true) ]
	  */
	public function delKeyword($word)
	{
		// 参数
		if(!is_array($word)) $word = [$word];
		$res = $this->getKeywordKeyIds($word);
		$delId = $res['data'];
		if(empty($delId))
			return LibFc::ReturnData(true, true);

		// 执行
		$this->B2CDb->Begin();
		$this->del('bc_product_keyword',sprintf(" and prk_key_id in (%s) ",implode(',', $delId)));// 关联表
		$this->del('bc_keyword',sprintf(" and key_id in (%s) ",implode(',', $delId)));// bc_keyword表
		$this->B2CDb->End();

		// 返回
		return LibFc::ReturnData(true, true);
	}

	/**
	  * @method 重置配件关键字关联
	  * @param  $dataArr 数据
	  * @param  $type   proId || shopId || all
	  * @author soul 2018/5/14
	  * @return [["status"]=> bool(true) ["data"]=> bool(true) ]
	  */
	public function resetProductKeyword($dataArr, $type = 'proId')
	{
		if(!empty($dataArr))
		{
			foreach($dataArr as $k=>$v)
			{
				$dataArr[$k] = (int) $v;
			}
			$dataArr = array_unique($dataArr);
		}

		//每次更新多少个？
		$per = 2000;
		$this->B2CDb->Begin();
		switch($type)
		{
			case 'proId':
				if(empty($dataArr)) break;
				$tempArr = [];
				$count = count($dataArr);
				$batchCounter = 0;
				foreach($dataArr as $k=>$v)
				{
					$tempArr[] = (int) $v;
					$batchCounter++;
					if($batchCounter == $per || ($k+1) == $count)
					{
						$this->resetProKeyword($tempArr);
						$tempArr = [];
						$batchCounter = 0;
					}
				}
			break;
			case 'all':
			case 'shopId':
				if($type != 'all' && empty($dataArr)) break;
				$where = $type == 'all'? ' and pro_shop_id IN (SELECT shop_id FROM sh_shop WHERE shop_status = 1)': sprintf(" and pro_shop_id in(%s)", implode(',', $dataArr));
				$res = $this->get('bc_product', ['count(*) count'],  $where, true);
				$count = (int) $res['data']['count'];
				$maxPage = ceil($count/$per);
				if($count > 0)
				{
					for($page = 1; $page <= $maxPage; $page++)
					{
						$res = $this->get('bc_product', ['pro_id'], $where.sprintf(" limit %d, %d", ($page-1)*$per, $per));
						if(!empty($res['data']))
						{
							$this->resetProKeyword(array_column($res['data'], 'pro_id'));
						}
					}
				}
			break;
		}
		$this->B2CDb->End();
		return LibFc::ReturnData(true, true);
	}



	/**
	  * @method 重置配件关键字关联
	  * @param  $proIdArr array 配件ID
	  * @author soul 2018/5/14
	  * @return [["status"]=> bool(true) ["data"]=> bool(true) ]
	  */
	private function resetProKeyword($proIdArr)
	{
		$LibYpApi = new LibYpApi();
		return $LibYpApi->Get('b2c/updateItemWordByEs', [], ['pro_id'=>implode(',', $proIdArr)]);

		if(empty($proIdArr)) return LibFc::ReturnData(false, 'resetProductKeyword 参数错误！');

		$proWordStrArr = [];
		$table = 'bc_product
		join bc_product_info on pri_pro_id=pro_id
		join bc_part on pro_part_id=part_id
		left join bc_part_small on pas_id = pro_pas_id';
		// 获取关键字
		$res = $this->get($table, ['pro_id', 'pro_name','pri_code', 'pri_keyword', 'part_name', 'part_keyword','pas_name'], sprintf(" and pro_id in (%s) ",implode(',', $proIdArr)));
		if($res['data'])
		{
			$proIds =array_column($res['data'],'pro_id');
			// 获取店铺分类
			$sortArr = [];
			$table = 'bc_product_sort 
			join sh_sort on sort_id = prs_sort_id';
			$sortRes = 	$this->get($table,['prs_pro_id,sort_name,sort_keyword'],sprintf(" AND prs_pro_id IN (%s)",implode(',',$proIds)));
			foreach ($sortRes['data'] as $val) 
			{
				$sortArr[$val['prs_pro_id']][] = $val['sort_name'].','.$val['sort_keyword'];
			}
			foreach ($res['data'] as $v)
			{
				$proWordStrArr[$v['pro_id']] = $v['pro_name'].','.$v['part_name'].','.$v['pas_name'].','.$v['pri_keyword'].','.$v['part_keyword'];
				if($sortArr[$v['pro_id']])
				{
					$proWordStrArr[$v['pro_id']] .= ','.implode(',',$sortArr[$v['pro_id']]);
				}
			}
		}
		//车型
		$proFormatKeywordArr = [];
		/*量过大取消 2023/5/31
		$res = $this->get('bc_product_model3_link',['pml3_pro_id', 'pml3_mod3_id'],sprintf(" and pml3_pro_id in (%s)", implode(',', $proIdArr)));
		if(!empty($res['data']))
		{
			$proModArr = [];
			$mod3Arr = [];
			foreach ($res['data'] as $v)
			{
				$proModArr[$v['pml3_pro_id']][] = $v['pml3_mod3_id'];
				$mod3Arr[$v['pml3_mod3_id']] = [];
			}

			$ComModel = new ComModel();
			$res = $ComModel->getModel(3,['mod3_id', 'brand_keyword', 'make_keyword', 'mod1_keyword', 'mod2_keyword', 'mod3_keyword'], sprintf("and mod3_id in(%s)", implode(',', array_keys($mod3Arr))));
			foreach($res['data'] as $vv)
			{
				$mod3Arr[$vv['pml3_mod3_id']] = LibFc::keyword($vv['brand_keyword'].','.$vv['make_keyword'].','.$vv['mod1_keyword'].','.$vv['mod2_keyword'].','.$vv['mod3_keyword']);
			}
			
			foreach($proModArr as $tproId=>$tmod3IdArr)
			{
				$proFormatKeywordArr[$tproId] = [];
				foreach($tmod3IdArr as $tmod3Id)
				{
					$proFormatKeywordArr[$tproId] = array_merge($proFormatKeywordArr[$tproId], $mod3Arr[$tmod3Id]);
				}
			}
		}*/
		
		$allKeyword = [];
		$proKeywordArr = [];
		foreach ($proWordStrArr as $tproId =>$str)
		{
			$wordArr = LibFc::keyword(trim($str, ','));
			if(isset($proFormatKeywordArr[$tproId]))
			{
				$wordArr = array_merge($wordArr, $proFormatKeywordArr[$tproId]);
			}
			$allKeyword = array_merge($allKeyword, $wordArr);
			$proKeywordArr[$tproId] = $wordArr;
		}
	
		$hasProKeyIdArr = [];
		$res = $this->get('bc_product_keyword',['prk_pro_id','prk_key_id'],sprintf(" and prk_pro_id in (%s) ",implode(',',$proIdArr)));
		foreach($res['data'] as $v)
		{
			$hasProKeyIdArr[$v['prk_pro_id']][] = $v['prk_key_id'];
		}
		$this->B2CDb->Begin();

		$res = $this->addKeyword($allKeyword);
		$allKeywordIdArr = $res['data'];
		$proKeywordIdArr = [];
		foreach($proKeywordArr as $proId=>$wordArr)
		{
			$proKeywordIdArr[$proId] = [];
			foreach($wordArr as $word)
			{
				if(isset($allKeywordIdArr[$word]))
				{
					$proKeywordIdArr[$proId][] = $allKeywordIdArr[$word];
				}
			}
		}
		
		foreach($proIdArr as $proId)
		{
			//新增的
			$tempAddArr = [];
			if(isset($proKeywordIdArr[$proId]) && isset($hasProKeyIdArr[$proId]))
			{
				$tempAddArr = array_diff($proKeywordIdArr[$proId], $hasProKeyIdArr[$proId]);
			}
			else if(!isset($hasProKeyIdArr[$proId]) && isset($proKeywordIdArr[$proId]))
			{
				$tempAddArr = $proKeywordIdArr[$proId];
			}
			if(!empty($tempAddArr))
			{
				$addAnyArr = [];
				foreach($tempAddArr as $keyId)
				{
					$addAnyArr[] = ['prk_pro_id'=>$proId,'prk_key_id'=>$keyId];
				}
				$this->addAny('bc_product_keyword',['prk_pro_id', 'prk_key_id'], $addAnyArr);
			}

			//删除
			$tempDelArr = [];
			if(isset($proKeywordIdArr[$proId]) && isset($hasProKeyIdArr[$proId]))
			{
				$tempDelArr = array_diff($hasProKeyIdArr[$proId], $proKeywordIdArr[$proId]);
			}
			else if(!isset($proKeywordIdArr[$proId]) && $hasProKeyIdArr[$proId])
			{
				$tempDelArr = $hasProKeyIdArr[$proId];
			}
			if(!empty($tempDelArr))
			{
				$this->del('bc_product_keyword', sprintf(" and prk_pro_id=%d and prk_key_id in (%s)", $proId, implode(',', $tempDelArr)));
			}
		}
		$this->B2CDb->End();
		return LibFc::ReturnData(true, true); 
	}



	/**
	  * @method 重置店铺的关键字关联
	  * @param  $shopIds 店铺ID array(shop1.shop2)
	  * @author xu
	  * @copyright 2017/10/9
	  * @return [["status"]=> bool(true) ["data"]=> bool(true) ]
	  */
	public function resetShopKeyword($shopIds)
	{	
		// 参数
		if(!is_array($shopIds))
			$shopIds = [$shopIds];
		if(empty($shopIds = array_filter($shopIds,'LibFc::Int')))
			return LibFc::ReturnData(false, 'resetShopKeyword 参数错误！');


		$shopKeyword = [];
		$where = sprintf(" and shop_id in (%s) ",implode(',', $shopIds));
		$res = $this->get('sh_shop left join us_user_base on shop_uid=ub_uid',['shop_id','shop_name','shop_profile','ub_username'],$where);
		foreach ($res['data'] as $key => $value)
		{
			$shopKeyword[$value['shop_id']] = LibFc::keyword($value['shop_name'].';'.$value['shop_profile'].';'.$value['ub_username']);
		}
		//预留其它关键字,(单单文字)
		$allKeyword = [];
		foreach($shopKeyword as $wordArr)
		{
			$allKeyword = array_merge($allKeyword, $wordArr);
		}
		// 获取当前已经存在的店铺ID=》关键词id数组
		$hasShopKeyIdArr = [];
		$res = $this->get('sh_shop_keyword',['shk_shop_id','shk_key_id'],sprintf(" and shk_shop_id in (%s) ",implode(',',$shopIds)));
		foreach($res['data'] as $v)
		{
			$hasShopKeyIdArr[$v['shk_shop_id']][] = $v['shk_key_id'];
		}
		$this->B2CDb->Begin();
		// 新关键词入库
		$res = $this->addKeyword($allKeyword);

		// 现在对关键词《=》关键词ID
		$allKeywordIdArr = $res['data'];
		$shopKeywordIdArr = [];

		// 获得在刷新之前就存在的array('shopid'=》array('关键词id','关键词id-2'))
		foreach($shopKeyword as $shopId=>$wordArr)
		{
			$shopKeywordIdArr[$shopId] = [];
			foreach($wordArr as $word)
			{
				if(isset($allKeywordIdArr[$word]))
				{
					$shopKeywordIdArr[$shopId][] = $allKeywordIdArr[$word];
				}
			}
		}

		// 对所有店铺ID进行循环
		foreach($shopIds as $shopId)
		{
			//新增的
			$tempAddArr = [];
			if(isset($shopKeywordIdArr[$shopId]) && isset($hasShopKeyIdArr[$shopId]))
			{
				$tempAddArr = array_diff($shopKeywordIdArr[$shopId], $hasShopKeyIdArr[$shopId]);
			}
			else if(!isset($hasShopKeyIdArr[$shopId]) && isset($shopKeywordIdArr[$shopId]))
			{
				$tempAddArr = $shopKeywordIdArr[$shopId];
			}
			// 对所有的关键词ID入库
			foreach($tempAddArr as $keyId)
			{
				$this->add('sh_shop_keyword',array('shk_shop_id'=>$shopId,'shk_key_id'=>$keyId));
			}

			//删除
			$tempDelArr = [];
			if(isset($shopKeywordIdArr[$shopId]) && isset($hasShopKeyIdArr[$shopId]))
			{
				$tempDelArr = array_diff($hasShopKeyIdArr[$shopId], $shopKeywordIdArr[$shopId]);
			}
			else if(!isset($shopKeywordIdArr[$shopId]) && $hasShopKeyIdArr[$shopId])
			{
				$tempDelArr = $hasShopKeyIdArr[$shopId];
			}
			if(!empty($tempDelArr))
			{
				$this->del('sh_shop_keyword', sprintf(" and shk_shop_id=%d and shk_key_id in (%s)", $shopId, implode(',', $tempDelArr)));
			}
		}
		$this->B2CDb->End();
		return LibFc::ReturnData(true, true); 
	}


}