<?php
/**
  * @method 店铺套餐接口
  * @author liao
  * @copyright 2017/9/26
  */
class B2cPack extends B2cBase
{
	/**
	 * @method    获取该配件的有效套餐
	 * @param     [int]          $shopId  [店铺id]
	 * @param     [type]         $proId  [配件id]
	 * @author     廖
	 * @copyright 2017-10-19
	 * @return ['status'=>true,'data'=>['prpa_id'=>xxx,'prpa_price'=>xxx,....]]
	 */
	public function getProductPack($packId)
	{
		if(LibFc::Int($packId))
		{
			$res = $this->get('bc_product_pack left join bc_product_pack_link on prpa_id=prpl_prpa_id left join sh_shop on prpa_shop_id=shop_id left join bc_product on prpl_pro_id=pro_id',['prpl_prpa_id','pro_id','pro_name','pro_count','pro_sale_price','pro_promotion_price','pro_promotion_btime','pro_promotion_etime'],sprintf('and prpl_prpa_id=%d and shop_status>0 and pro_status>0 and pro_count>0 order by prpl_seq desc',$packId));
			$allProIdArr = array_unique(array_column($res['data'],'pro_id'));
			$data[$packId] = array_combine(array_column($res['data'], 'pro_id'), $res['data']);
			//整合数据
			if(!empty($allProIdArr))
			{
				$B2cProduct = new B2cProduct();
				$re = $B2cProduct->getProductPic($allProIdArr);
				foreach ($data[$packId] as $key => $value) 
				{
					$data[$packId][$key] =isset($re['data'][$key][0])? array_merge($value,$re['data'][$key][0]):$value;
				}
			}
			return LibFc::ReturnData(true,$data);
		}
		else return LibFc::ReturnData(false,'参数不正确');
	}
	/**
	 * @method    setGroup   	保存组合
	 * @param     [int]     	$shopId  [店铺id]
	 * @param     [int]     	$grpId   [组合id]
	 * @param     [array]     	$dataArr [数据]
	 * @param     [str]     	$order 	 [限定]
	 * @author     廖
	 * @copyright 2017-12-22
	 * @return     ['status'=>true,'data'=>0]
	 */
	public function saveGroup($shopId,$grpId='',$dataArr,$order)
	{
		if (LibFc::Int($shopId) && !empty($dataArr['group']) && in_array($order, ['add','edit']))
		{
			$groupIdArr = array_unique(array_filter(array_column($dataArr['group'], 'proId'),'LibFc::Int'));

			if (count($groupIdArr) > 50) 
				return LibFc::ReturnData(false,'只能添加 50 个配件已下的组合！!');

			if (!empty($groupIdArr))
			{
				//判断零件id 是否合法
				$res = $this->get('bc_product',['count(*) count'],sprintf('and pro_shop_id=%s and pro_id in(%s) and pro_status > 0', $shopId, implode(',',$groupIdArr)),true);
				if ($res['data']['count'] != count($groupIdArr))
					return LibFc::ReturnData(false,'零件不合法！');

				switch ($order) 
				{
					case 'add':
						//判断零件组合是否已经满
						$res = $this->get('bc_product_group',['count(*) count'],sprintf('and prg_shop_id=%d', $shopId),true);
						if ($res['data']['count'] >= 50)
							return LibFc::ReturnData(false,'最多只能添加 50 个组合！');

						// 判断配件是否已存在组合
						$res = $this->get('bc_product_group left join bc_product_group_link on prg_id=prgl_prg_id',['count(*) count'],sprintf('and prg_shop_id=%d and prgl_pro_id in (%s)',$shopId,implode(',',$groupIdArr)),true);
						if ($res['data']['count'] > 0)
							return LibFc::ReturnData(false,'某件配件已经存在组合中!');
						
						//开启事务
						$data = [
							'prg_shop_id' => $shopId,
							'prg_atime'=>time()
						];
						if(!empty($dataArr['prg_name']))
							$data['prg_name'] = $dataArr['prg_name'];
						if(!empty($dataArr['prg_status']))
							$data['prg_status'] = $dataArr['prg_status'] == '1' ? '1' : '0';

						$this->B2CDb->Begin();
						$id = $this->add('bc_product_group',$data,'');

						//bc_product_group_link
						foreach ($dataArr['group'] as $key => $value) 
						{
							if (!in_array($key, $groupIdArr))
								continue;
							$data = [
								'prgl_prg_id'=>$id['data'],
								'prgl_pro_id'=>$key,
							];
							if(LibFc::Int($value['sort']))
								$data['prgl_pro_seq'] = $value['sort'];
							if(!empty($value['name']))
								$data['prgl_pro_name'] = $value['name'];
							$this->add('bc_product_group_link',$data,'');
						}
						$this->B2CDb->End();
						return LibFc::ReturnData(true,true);	
						break;
					
					case 'edit':
						if (LibFc::Int($grpId))
						{
							// 验证组合id 合法性
							$res = $this->get('bc_product_group',['count(*) count'],sprintf('and prg_shop_id=%d and prg_id=%d', $shopId, $grpId),true);
							if ($res['data']['count'] < 1)
								return LibFc::ReturnData(false,'该组合不存在!');
							//判断组合合法性
							$res = $this->get('bc_product_group_link',['count(*) count'],sprintf(' and prgl_pro_id in (%s) and prgl_prg_id !=%d',implode(',', $groupIdArr), $grpId),true);
							if ($res['data']['count'] > 0)
								return LibFc::ReturnData(false,'某件配件已经存在组合中!');

							// 查询该组合已有的配件id
							$res = $this->get('bc_product_group_link',['prgl_pro_id'],sprintf('and prgl_prg_id=%d',$grpId));
							$oldIdArr = array_column($res['data'], 'prgl_pro_id');

							$inArr = array_diff($groupIdArr, $oldIdArr);
							$delArr = array_diff($oldIdArr, $groupIdArr);
							$upArr = array_intersect($oldIdArr, $groupIdArr);

							$data = [];
							if(isset($dataArr['prg_name']))
								$data['prg_name'] = $dataArr['prg_name'];
							if(isset($dataArr['prg_status']))
								$data['prg_status'] = $dataArr['prg_status'] == '1' ? '1' : '0';
							$data['prg_etime'] = time();
							//开启事务
							$this->B2CDb->Begin();
							//更新bc_product_group
							$this->set('bc_product_group',$data,sprintf('and prg_id=%d and prg_shop_id=%d', $grpId, $shopId));
							//删
							if (!empty($delArr))
								$this->del('bc_product_group_link',sprintf('and prgl_prg_id = %s and prgl_pro_id in (%s)', $grpId, implode(',', $delArr)));
							//改
							if (!empty($upArr))
							{
								foreach ($upArr as $value) 
								{
									echo $value;
									print_r($dataArr['group'][$value]);
									if (!empty($dataArr['group'][$value]))
									{
										$data = [
											'prgl_pro_seq' => LibFc::int($dataArr['group'][$value]['sort']) ? $dataArr['group'][$value]['sort'] : 99,
											'prgl_pro_name' => !empty($dataArr['group'][$value]['name']) ? $dataArr['group'][$value]['name'] : ''
										];
										$this->set('bc_product_group_link',$data,sprintf('and prgl_prg_id = %s and prgl_pro_id = %s', $grpId, $value));
									}
								}
							}
							//增
							if (!empty($inArr))
							{
								foreach ($inArr as $value) 
								{
									$data = [
										'prgl_prg_id'=>$grpId,
										'prgl_pro_id'=>$value,
									];
									if (!empty($dataArr['group'][$value]['sort']))
										$data['prgl_pro_seq'] = LibFc::int($dataArr['group'][$value]['sort']) ? $dataArr['group'][$value]['sort'] : 99;
									if (!empty($dataArr['group'][$value]['name']))
										$data['prgl_pro_name'] = $dataArr['group'][$value]['name'];

									$this->add('bc_product_group_link',$data,'');
								}
							}
							$this->B2CDb->End();
							return LibFc::ReturnData(true,true);
						}
						break;
				}
			} else
			{
				return LibFc::ReturnData(false,'组合不能为空!');
			}
		}
		return LibFc::ReturnData(false,'参数不正确!');
	}
	/**
	 * @method    setGroup   获取组合信息
	 * @param     [int]     $shopId  [店铺id]
	 * @param     [int]     $groupId [组合id]
	 * @author     廖
	 * @copyright 2017-12-22
	 * @return     ['status'=>true,'data'=>0]
	 */
	public function getGroup($shopId,$groupId)
	{
		if(LibFc::Int($shopId) && LibFc::Int($groupId))
		{
			$res = $this->get('bc_product_group left join bc_product_group_link on prg_id=prgl_prg_id',['*'],sprintf('and prg_id=%d and prg_shop_id=%d order by prgl_pro_seq asc',$groupId,$shopId));

			if(!empty($res['data']))
			{
				$proId = array_column($res['data'],'prgl_pro_id');
				if(!empty($proId))
				{
					//获取配件信息
					$proInfo = $this->get('bc_product',['pro_id','pro_name','pro_sale_price','pro_promotion_price','pro_count','pro_promotion_btime','pro_promotion_etime'],sprintf('and pro_id in (%s)',implode(',',$proId)));
					$proInfo = array_column($proInfo['data'],null,'pro_id');
					//获取图片
					$B2cProduct = new B2cProduct();
					$pic = $B2cProduct->getProductPic($proId);
					foreach ($res['data'] as $key => $value) 
					{
						$res['data'][$key] =isset($pic['data'][$value['prgl_pro_id']][0])? array_merge($value,$proInfo[$value['prgl_pro_id']],$pic['data'][$value['prgl_pro_id']][0]):array_merge($value,$proInfo[$value['prgl_pro_id']]);
					}
				}
				return $res;
			}
		}
		return LibFc::ReturnData(false,'参数不正确');
	}
	/**
	 * @method    delGroup  删除组合
	 * @param     [arr]     $groupId  [组合id]
	 * @author     廖
	 * @copyright 2017-12-22
	 * @return     ['status'=>true,'data'=>0]
	 */
	function delGroup($groupId)
	{
		if(!is_array($groupId)) $groupId = explode(',',$groupId);
		$groupId = array_filter($groupId,'LibFc::Int');
		if(!empty($groupId))
		{
			$this->B2CDb->Begin();
			$this->del('bc_product_group',sprintf('and prg_id in (%s)',implode(',',$groupId)));
			$this->del('bc_product_group_link',sprintf('and prgl_prg_id in (%s)',implode(',',$groupId)));
			$this->B2CDb->End();
			return LibFc::ReturnData(true,true);
		}
		return LibFc::ReturnData(false,'参数不正确');
	}
	/**
	 * @method    getGroupByPro  获取配件组合
	 * @param     [int]     $proId  [配件id]
	 * @author     廖
	 * @copyright 2017-12-22
	 * @return     ['status'=>true,'data'=>0]
	 */
	function getGroupByPro($shopId,$proId)
	{
		if(LibFc::Int($shopId) && LibFc::Int($proId))
		{
			$res = $this->get('bc_product_group left join bc_product_group_link on prg_id=prgl_prg_id left join bc_product on prgl_pro_id=pro_id',['prg_id','prg_name','prgl_pro_id','prgl_pro_name','pro_id','pro_name'],sprintf('and prg_id in (select prgl_prg_id from bc_product_group_link where prgl_pro_id=%d) and prg_status=1 and prg_shop_id=%d and pro_status>0 and pro_count>0 order by prgl_pro_seq asc',$proId,$shopId));
			$proId = array_column($res['data'],'prgl_pro_id');
			$proInfo = array_column($res['data'],null,'pro_id');
			if(!empty($res['data']))
			{
				if(!empty($proId))
				{
					//获取图片
					$B2cProduct = new B2cProduct();
					$pic = $B2cProduct->getProductPic($proId);
					foreach ($res['data'] as $key => $value) 
					{
						if(!empty($proInfo[$value['prgl_pro_id']]) && isset($pic['data'][$value['prgl_pro_id']][0]))
						{
							$res['data'][$key] =isset($pic['data'][$value['prgl_pro_id']][0])? array_merge($value,$proInfo[$value['prgl_pro_id']],$pic['data'][$value['prgl_pro_id']][0]):array_merge($value,$proInfo[$value['prgl_pro_id']]);
						}
					}
				}
				return $res;
			}
			return LibFc::ReturnData(true,'没有参数!');
		}
		return LibFc::ReturnData(false,'参数不正确');
	}
}