<?php


namespace app\api\controller;


use app\api\model\GoodsSpec;
use app\api\model\SpecValue;
use app\common\controller\Api;
use think\Db;

/**
 * 购物车
 */
class Cart extends Api
{
//    protected $noNeedLogin = ['*'];
    protected $noNeedRight = ['*'];

    /**
     * @ApiTitle    (加入购物车)
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="sku_id", type="integer", required=true, description="规格id")
     * @ApiParams   (name="goods_id", type="integer", required=true, description="商品id")
     * @ApiParams   (name="number", type="integer", required=true, description="购买数量")
     * @ApiReturn   ({
    'code':'1',
    'msg':'SUCCESS'
    })
     */
    public function addCart()
    {
        $sku_id = $this->request->post('sku_id');
        $goods_id = $this->request->post('goods_id');
        $number = $this->request->post('number');

        if (!is_numeric($sku_id) || !is_numeric($goods_id) || !is_numeric($number)) $this->error('参数不合法');

        $data = [
            'user_id' => $this->auth->id,
            'sku_id' => $sku_id,
            'goods_id' => $goods_id,
        ];
        $model = new \app\api\model\Cart();
        $cart = $model->where($data)->find();
        if ($cart){
            $cart->setInc('number',$number);
        }else{
            $data['number'] = $number;
            $model->isUpdate(false)->save($data);
        }
        $this->success('SUCCESS');
    }


    /**
     * @ApiTitle    (删除购物车)
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="cart_ids", type="integer", required=true, description="购物车id 逗号隔开")
     * @ApiReturn   ({
    'code':'1',
    'msg':'SUCCESS'
    })
     */
    public function delCart()
    {
        $ids = $this->request->post('cart_ids');
        if (!$ids) $this->error('参数不可为空');
        $ids = explode(',',$ids);
        foreach ($ids as $key => $value){
            if (!is_numeric($value)) $this->error('参数不合法');
        }
        $model = new \app\api\model\Cart();
        $model->whereIn('id',$ids)->delete();
        $this->success('SUCCESS');
    }

    /**
     * @ApiTitle    (增加购物车数量)
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="id", type="integer", required=true, description="购物车id")
     * @ApiParams   (name="number", type="integer", required=true, description="增加数量")
     * @ApiReturn   ({
    'code':'1',
    'msg':'SUCCESS'
    })
     */
    public function addCartNumber()
    {
        $id = $this->request->post('id');
        $number = $this->request->post('number');

        if (!is_numeric($id)  || !is_numeric($number)) $this->error('参数不合法');

        $model = new \app\api\model\Cart();
        $order = $model->with('sku')->where('id',$id)->find();
        if ($number+$order['number'] > $order['sku']['stock_num']) $this->error('已达到最大库存,请勿重复提交');
        $model->where('id',$id)->setInc('number',$number);
        $this->success('SUCCESS');
    }

    /**
     * @ApiTitle    (减少购物车数量)
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="id", type="integer", required=true, description="购物车id")
     * @ApiParams   (name="number", type="integer", required=true, description="减少数量")
     * @ApiReturn   ({
    'code':'1',
    'msg':'SUCCESS'
    })
     */
    public function subCartNumber()
    {
        $id = $this->request->post('id');
        $number = $this->request->post('number');

        if (!is_numeric($id)  || !is_numeric($number)) $this->error('参数不合法');

        $model = new \app\api\model\Cart();
        if ($model->where('id',$id)->value('number') ==1){
            $this->error('购物车数量不可再减少');
        }else{
            $model->where('id',$id)->setDec('number',$number);
        }
        $this->success('SUCCESS');
    }

    /**
     * @ApiTitle    (购物车列表)
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiReturn   ({
    'code':'1',
    'msg':'SUCCESS'
    'data'
        {
            "id": 1, 购车id
            "user_id": 0,
            "goods_id": 21, 商品id
            "sku_id": 125, 规格id
            "number": 10, 购买数量
            "createtime": null,
            "goods": {
                "goods_id": 21,
                "goods_name": "小米Mix3",
                "image_text": "http://temporaryfood.qiniu.broing.cn123132", 封面图
                "images_text": [
                    "https://her-family.oss-cn-qingdao.aliyuncs.com/addons_store_uploads/20181105/ffc4440df18661948b9c2d4dd4ae419b.jpg",
                    "https://her-family.oss-cn-qingdao.aliyuncs.com/addons_store_uploads/20181105/83bf8f141969a9e3e607a768407fc7e0.jpg",
                    "https://her-family.oss-cn-qingdao.aliyuncs.com/addons_store_uploads/20181105/c5d85254fc17b1a1b0e2254470881e59.jpg"
                ],
                "down_image_text": "http://temporaryfood.qiniu.broing.cn/uploads/20220114/f8bb72e2ce3e70f0a9f54e6c0b4a6c14.png",
                "four_image_text": []
            },
            "sku": {
                "goods_spec_id": 125,
                "goods_price": "100.00", 价格
                "spec_sku_id": "40_54",
                "sku_name": "黑色 1" 规格名
            }
        }
    })
     */
    public function cartList()
    {
        $model = new \app\api\model\Cart();
        $list = $model
            ->with(['goods','sku'])
            ->where('user_id',$this->auth->id)
            ->order('createtime desc')
            ->select();
        foreach ($list as $key => $value){
            $value->getRelation('goods')->visible(['goods_name','goods_id']);
            $value->getRelation('sku')->visible(['goods_spec_id','goods_price','spec_sku_id']);
        }
        $list = collection($list)->toArray();
        foreach ($list as $k => &$val){
            $skuids = explode('_', $val['sku']['spec_sku_id']);
            $sku = Db::name('litestore_spec_value')->where('id','in',$skuids)->column('spec_value');
            $skuname = !empty($sku)?implode(' ',$sku):'';
            $val['sku']['sku_name'] = $skuname;
        }
        $this->success('SUCCESS',$list);
    }

    /**
     * @ApiTitle    (价格计算)
     * @ApiSummary ([{goods_id:22 goods_sku_id:106 number:2} {goods_id:23 goods_sku_id:66 number:2}])
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="data_json", type="string", required=true, description="下单的商品json数据")
     * @ApiParams   (name="goods_id", type="integer", required=false, description="商品id 此值不传 json数组注释用")
     * @ApiParams   (name="goods_sku_id", type="integer", required=false, description="规格id 此值不传 json数组注释用")
     * @ApiParams   (name="number", type="integer", required=false, description="购买数量 此值不传 json数组注释用")
     * @ApiReturn   ({
    'code':'1',
    'msg':'购物车页面价格'
    'data':
    "price": "37574.00" 总价
    })
     */
    public function priceCalculation()
    {
        $json = $this->request->param('data_json');
        if (!$json) $this->error('data_json参数不能为空');
//        $json = '[{"goods_id":22,"goods_sku_id":106,"number":2},{"goods_id":23,"goods_sku_id":66,"number":2}]';
        $json = str_replace('&quot;','"',$json);
        $data = json_decode($json,true);
        $goodsmodel = new \app\api\model\Goods();
        $skumodel = new GoodsSpec();
        $sum_price = 0; //总价格
        foreach ($data as $key => $value){
            if (!is_numeric($value['goods_id']) || !is_numeric($value['goods_sku_id']) || !is_numeric($value['number'])){
                $this->error('参数不合法');
            }
            $goods = $goodsmodel->where('goods_id',$value['goods_id'])->field('goods_id,goods_name,image,spec_type')->find();
            if (!$goods) $this->error('商品不存在');
            $sku = $skumodel->where('goods_spec_id',$value['goods_sku_id'])
                ->field('goods_spec_id,spec_sku_id,goods_price')->find();
            if (!$sku) $this->error('商品规格不存在');

            $sum_price = bcadd($sum_price,bcmul($sku['goods_price'],$value['number'],2),2);
        }
        $this->success('购物车页面价格',['price'=>$sum_price]);
    }
}