<?php
/**
	* @method 购物车
	* @author 许
	* @copyright 2017/8/3
	*/
class B2cShoppingCart extends B2cBase
{

	/**
	* @method 获取用户购物车数据
	* @param  $userId 用户ID int
	* @param  $status [boolean] 是否仅仅降价配件,true => 仅仅降价配件
	* @author xu
	* @copyright 2017/08/03
	* @return  成功：{'status':true,'data':arr} 失败：{'status':false,'data':'error'错误原因'}
	*/
	public function getUserCartInfo($userId,$status = false) 
	{	
		//参数判断
		if(empty($userId) || !LibFc::Int($userId))
			return LibFc::ReturnData(false,'用户ID参数错误！',0);

		// 单品
		$table = 'us_cart right join bc_product on car_pro_id=pro_id right join sh_shop on shop_id=pro_shop_id';
		$where = ' and car_prpa_id=0 and car_uid='.$userId.' and shop_status=1 and pro_count>0 and pro_status>0 ';
		if($status) $where .= ' and car_add_price>pro_sale_price ';
		$where .= ' order by car_add_time desc';
		$res = $this->get($table, ['us_cart.*','bc_product.*'], $where);
		$shopId = array_unique(array_column($res['data'], 'pro_shop_id'));
		$product = $res['data'];

		if(!empty($product))
		{
			// 主图
			$B2cProduct = new B2cProduct();
			$proId = array_column($product, 'pro_id');
			$res = $B2cProduct->getProductPic($proId);
			foreach($product as $k => $v)
			{
				$product[$k] = empty($res['data'][$v['pro_id']]) ? $v : array_merge($v,current($res['data'][$v['pro_id']]));
			}
			$temp = array();
			foreach ($product as $k => $v)
			{
				$temp[$v['pro_shop_id']][] = $v;
			}

			//店铺信息
			$B2cShop = new B2cShop();
			$res = $B2cShop->getShopMsg($shopId,['shop_id','shop_uid','shop_name','shop_domain','shop_status']); 
			$product = $res['data'];
			foreach($product as $k => $v)
			{
				$product[$k]['cart_pro'] = $temp[$v['shop_id']];
			}
		}

		// 降价配件
		if($status) return LibFc::ReturnData(true,$product);

		// 套餐
		$res = $this->getCarPack($userId);
		if(empty($res['data']))
			return LibFc::ReturnData(true,$product);
		if(empty($product))
			return LibFc::ReturnData(true,$res['data']);
		$package =  array_column($res['data'], null ,'shop_id');

		foreach ($product as $k => $v) {
			// 拼接
			$product[$k]['cart_pro'] = empty($package[$v['shop_id']])?$product[$k]['cart_pro']:array_merge($product[$k]['cart_pro'],$package[$v['shop_id']]['cart_pro']);
			// 店铺内排序
			$key_arrays = array();
			foreach ($product[$k]['cart_pro'] as $kk => $vv)
			{
				$key_arrays[] = $vv['car_add_time'];
			}
			array_multisort($key_arrays,SORT_DESC,$product[$k]['cart_pro']);
			$product[$k]['shop_max_time'] =  max(array_column($v['cart_pro'], 'car_add_time'));
		}

		// 店铺排序
		$key_arrays = array();
		foreach ($product as $k => $v) {
			$key_arrays[] = $v['shop_max_time'];
		}
		array_multisort($key_arrays,SORT_DESC,$product);

		return LibFc::ReturnData(true,$product);
	}


	/**
	* @method 获取用户购物车配件套餐
	* @param  $userId 用户ID int
	* @author xu
	* @copyright 2018/04/17
	* @return  array('status'=>true,'data'=>'8','code'=>)
	*/
	public function getCarPack($userId,$where='') 
	{	
		//参数判断
		if(empty($userId) || !LibFc::Int($userId))
			return LibFc::ReturnData(false,'用户ID参数错误！',0);

		// 返回值
		$returnData = array();
		
		// 配件套餐
		$where .= sprintf(' and car_prpa_id!=0 and car_uid=%d order by car_add_time desc ',$userId);
		$temp = ['car_uid','car_count','car_add_time','car_add_price','car_checked','prpa_id','prpa_price','prpa_btime','prpa_etime','prpa_shop_id','prpa_name','prpa_frt_id','prpa_manjian','car_prpa_id'];
		$res = $this->get('us_cart left join bc_product_pack on prpa_id=car_prpa_id ',$temp,$where);


		if(empty($res['data']))
			return LibFc::ReturnData(true,[]);

		$package = $res['data'];
		$prpaId = array_column($package, 'prpa_id');
		$shopId = array_unique(array_column($package, 'prpa_shop_id'));
	
		// 商品
		$table = 'bc_product_pack left join bc_product_pack_link on prpl_prpa_id = prpa_id left join bc_product on prpl_pro_id=pro_id ';
		$res = $this->get($table,['bc_product.*','bc_product_pack.prpa_id'], sprintf(" and prpa_id in (%s) order by prpl_seq asc ",implode(',', $prpaId)));
		$pro = $res['data'];

		// 主图 
		$B2cProduct = new B2cProduct();
		$proId = array_column($res['data'], 'pro_id');
		$res = $B2cProduct->getProductPic($proId);
		foreach($pro as $k => $v)
		{
			$pro[$k] = empty($res['data'][$v['pro_id']]) ? $pro[$k] : array_merge($pro[$k],current($res['data'][$v['pro_id']]));
		}
		$temp = array();
		foreach ($pro as $k => $v)
		{
			$temp[$v['prpa_id']][] = $v;
		}

		// 套餐+商品
		foreach ($package as $k => $v)
		{
			$package[$k]['package_pro'] = $temp[$v['prpa_id']];
		}

		// 按店铺分组
		$temp = array();
		foreach ($package as $k => $v)
		{
			$temp[$v['prpa_shop_id']][] = $v;
		}

		// 店铺信息
		$B2cShop = new B2cShop();
		$res = $B2cShop->getShopMsg($shopId,['shop_id','shop_uid','shop_name','shop_domain','shop_status']);
		$package = $res['data'];

		foreach ($package as $k => $v) {
			$package[$k]['cart_pro'] = $temp[$v['shop_id']];
			// 店铺内排序
			$key_arrays = array();
			foreach ($package[$k]['cart_pro'] as $kk => $vv)
			{
				$key_arrays[] = $vv['car_add_time'];
			}
			array_multisort($key_arrays,SORT_DESC,$package[$k]['cart_pro']);
			$package[$k]['shop_max_time'] =  max($key_arrays);
		}

		// 店铺排序
		$key_arrays = array();
		foreach ($package as $k => $v) {
			$key_arrays[] = $v['shop_max_time'];
		}
		array_multisort($key_arrays,SORT_DESC,$package);

		return LibFc::ReturnData(true,$package);
	}
	

	/**
	* @method 获取用户购物车商品数量
	* @param  $userId 用户ID int
	* @param  $status 仅限降价配件 boolean
	* @author xu
	* @copyright 2017/08/03
	* @return  array('status'=>true,'data'=>'8','code'=>)
	*/
	public function getCarGoodNum($userId,$status = false,$where='') 
	{	
		//参数
		if(!LibFc::Int($userId))
			return LibFc::ReturnData(false,'参数错误！');

		// 单品
		$table='us_cart left join bc_product on car_pro_id=pro_id left join sh_shop on shop_id=pro_shop_id';
		$where.=' and car_prpa_id=0 and car_uid='.$userId.' and pro_count>0  and shop_status=1  and pro_count>0 and pro_status>0 ';
		if($status)
			$where .= ' and car_add_price>pro_sale_price';
		
		$res = $this->get($table, ['car_pro_id'], $where);
		$count = count($res['data']);

		// 套餐
		if(!$status)
		{
			$where = sprintf(" and car_uid=%d and car_prpa_id!=0 ",$userId);
			$res = $this->get(" us_cart left join bc_product_pack on car_prpa_id=prpa_id ",['count(*) sum'],$where,true);
			$count += $res['data']['sum'];
		}

		return LibFc::ReturnData(true,$count);
	}



	/**
	* @method 删除购物车商品
	* @param  $_POST['PROID']; 商品ID array
	* @param  $userId  用户ID int
	* @author     xu
	* @copyright 2017-08-07
	* @return 成功：{'status':true,'data':'success','code':0} 失败：{'status':false,'data':'error'/'参数错误！','code':0}
	*/
	public function delShoppingCart($proId,$userId) 
	{	
		//参数
		if(!is_array($proId))
			$proId = [$proId];
		if(empty($proId = array_filter($proId)) || !LibFc::Int($userId))
			return LibFc::ReturnData(false,'参数错误！');

		//执行
		$table = "us_cart";
		$where = sprintf(" and car_pro_id in (%s) and car_uid=%d", implode(',',$proId) ,$userId);
		$this->del($table,$where);

		// 返回
		return LibFc::ReturnData(true,"success");	
	}


	/**
	 * @method    添加购物车
	 * @param     [int]     $proId   [产品ID]
	 * @param     [int]     $userId  [用户ID]
	 * @param     integer    $num     [添加的数量]
	 * @param     boolean    $isCheck [是否选中]
	 * @author    xu
	 * @return 
			成功 ["status"=>true, "data"=> 影响行数] 
			失败 ["status"=>false, "data"=> 错误信息] 
	 * @copyright 2017-08-14
	 */
	public function addCart($proId,$userId,$num=1,$isCheck=true)
	{
		// 参数
		if(!LibFc::Int($proId) || (!LibFc::Int($userId)) || !LibFc::Int($num) || $num<=0 )
		{
			return LibFc::ReturnData(false,'参数错误');
		}

		// 校验商品上架或者预售
		$res = $this->get('bc_product',['*'],sprintf(" and pro_id=%d and pro_status>0",$proId),true);
		$product = $res['data'];
		
		if(empty($product)) return LibFc::ReturnData(false,'商品未上架！');

		// 处理售价
		if(!empty($product['pro_promotion_price']) && 
			time()>$product['pro_promotion_btime'] && 
			time()<$product['pro_promotion_etime'] &&
			$product['pro_promotion_price']<$product['pro_sale_price'])
		{
			$price = $product['pro_promotion_price'];
		}
		else
		{
			$price = $product['pro_sale_price'];
		}

		// 校验商品是否当前用户的店铺的
		$res = $this->get('sh_shop',['*'],sprintf(" and shop_uid=%d ",$userId),true);
		if(!empty($res['data']) && ($res['data']['shop_id']==$product['pro_shop_id']))return LibFc::ReturnData(false,'用户不能添加自己的配件至购物车！'); 
	
		//允许超卖
		$res = $this->get('sh_shop',['*'],sprintf(" and shop_id=%d ",$product['pro_shop_id']),true);
		$shopArr = $res['data'];
		if($shopArr['shop_overbook']){
			$product['pro_count'] = 1000;
		}

		// 判定是否已经存在购物车之中
		$res = $this->get('us_cart',['*'],sprintf(" and car_uid=%d and car_pro_id=%d",$userId,$proId),true);
		if(in_array($product['pro_shop_id'],[732634,965832,250162]))
		{
			if($product['pro_shop_id']==732634)
			{
				$B2cCustom = new B2cCustom();
				$priceres=$B2cCustom->getProInfoByDy($userId,[$proId]);
			}
			if($product['pro_shop_id']==965832)
			{
				$B2cBDCustom = new B2cBDCustom();
				$priceres=$B2cBDCustom->getProInfoByDy($userId,[$proId]);
			}
			if($product['pro_shop_id']==250162)
			{
				$B2cTylCustom = new B2cTylCustom();
				$priceres = $B2cTylCustom->getProInfoByDy($userId,[$proId]);
			}
			
			if($priceres['data']){
				$price = $priceres['data'][0]['price'];	
			} 
		}

		if(!empty($res['data']))
		{
			$num = (($num+$res['data']['car_count'])>=$product['pro_count'])?$product['pro_count']:($num+$res['data']['car_count']);

			$temp = array(
					'car_count'=>$num,
					'car_add_time'=>time(),
					'car_add_price'=>$price,
					'car_checked' =>$isCheck
				);
			$this->set("us_cart",$temp,sprintf(" and car_uid=%d and car_pro_id=%d",$userId,$proId));
		}
		else
		{
			$num = ($num >= $product['pro_count']) ? $product['pro_count']:$num;
			$temp = array(
					'car_uid'=>$userId,
					'car_pro_id'=>$proId,
					'car_count'=>$num,
					'car_add_time'=>time(),
					'car_add_price'=>$price,
					'car_checked' =>1
				);
			$this->add("us_cart",$temp);
		}

		return LibFc::ReturnData(true,true);
	}


	/**
	 * @method    添加配件套餐到购物车
	 * @param     [int]     $prpaId   [套餐ID]
	 * @param     [int]     $userId  [用户ID]
	 * @param     integer    $num     [添加的数量]
	 * @param     boolean    $isCheck [是否选中]
	 * @author    xu
	 * @return 
			成功 ["status"=>true, "data"=> 影响行数] 
			失败 ["status"=>false, "data"=> 错误信息] 
	 * @copyright 2017-08-14
	 */
	public function addPackage($prpaId,$userId,$num=1,$isCheck=true)
	{
		// 参数
		if(!LibFc::Int($prpaId) || !LibFc::Int($userId) || !LibFc::Int($num) ||$num<=0)
			return LibFc::ReturnData(false,'参数错误');

		// 套餐信息
		$res = $this->get('sh_shop left join bc_product_pack on shop_id=prpa_shop_id ',['*'],sprintf(" and shop_status=1 and prpa_id=%d ",$prpaId),true);
		if(empty($res['data']))
			return LibFc::ReturnData(false,'套餐不存在！');
		if($res['data']['shop_uid'] == $userId)
			return LibFc::ReturnData(false,'用户不能添加自己的配件套餐至购物车！');
		$msg = $res['data'];

		// 已存在
		$res = $this->get('us_cart',['*'],sprintf(" and car_uid=%d and car_prpa_id=%d ",$userId,$prpaId),true);
		if(!empty($res['data']))
		{
			$num = $num + $res['data']['car_count'];
			$this->del('us_cart',sprintf(" and car_uid=%d and car_prpa_id=%d ",$userId,$prpaId));
		}
		
		// 数量
		$res = $this->get('bc_product_pack_link left join bc_product on prpl_pro_id=pro_id',['pro_count'],sprintf(" and prpl_prpa_id=%d",$prpaId));
		$maxNum =  max(array_column($res['data'], 'pro_count'));
		$num = ($num > $maxNum)?$maxNum:$num;

		// 新增
		$temp = [
			'car_uid' => $userId,
			'car_count' => $num,
			'car_add_time' => time(),
			'car_pro_id' => $prpaId,
			'car_add_price' => $msg['prpa_price'],
			'car_checked' => $isCheck?1:0,
			'car_prpa_id' => $prpaId
		];
		$res = $this->add('us_cart',$temp);

		return LibFc::ReturnData(true,true);
	}



	/**
	* @method 删除购物车配件套餐
	* @param  $prpaId; 配件套餐ID int|array
	* @param  $userId  用户ID int
	* @author     xu
	* @copyright 2017-08-07
	* @return 成功：{'status':true,'data':'success','code':0} 失败：{'status':false,'data':'error'/'参数错误！','code':0}
	*/
	public function delPackage($prpaId,$userId) 
	{	
		//参数
		if(!is_array($prpaId))
			$prpaId = [$prpaId];
		if(empty($prpaId = array_filter($prpaId,'LibFc::Int'))||!LibFc::Int($userId))
			return LibFc::ReturnData(false,'参数错误！');
		//删除
		$where = sprintf(" and car_prpa_id in (%s) and car_uid=%d",implode(',',$prpaId),$userId);
		$res = $this->del('us_cart',$where);
		return LibFc::ReturnData(true,"success");
	}

}