<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use JiGuang\JSMS as JSMS;
use Illuminate\Support\Facades\Redis;
use App\Models\Check;
use App\Models\Product;
use App\Models\UserAddress;
use App\Services\OrderService;
use App\Models\User;
use App\Models\Order;

/**
 *
 * Copyright: Copyright (c) 2019
 *
 * @Description: 订单控制器
 * @version: v1.0.0
 * @author: fengyichao
 * @date: 2019年8月14日 下午3:14:34
 *
 * Modification History:
 * Date         Author          Version            Description
 *---------------------------------------------------------*
 * 2019年8月14日     fengyichao           v1.0.0               修改原因
 */
class OrderController extends ApiController {
	public function __construct(OrderService $orderService) {
		$this->orderService = $orderService;
	}

	/**
	 *
	 * @api {post} order/preview 订单预览
	 * @apiName order/preview
	 * @apiGroup order
	 * @apiParam  {json}  product_item  例：[{"product_id":1,"amount":"2"},{"product_id":1,"amount":"2"}]
	 * @apiSuccess {int}  amout 总价
	 * @apiSuccess {List[Map]}  product_list 商品列表
	 * @apiSuccess (product_list) {string} id 商品id
	 * @apiSuccess (product_list) {string} title 标题
	 * @apiSuccess (product_list) {string} image 商品图
	 * @apiSuccess (product_list) {int} amount 数量
	 * @apiSuccess {Object}  address 地址信息
	 * @apiSuccess (address) {int} id  地址id
	 * @apiSuccess (address) {string} contact_phone  电话 
	 * @apiSuccess (address) {string} full_address  详细地址
	 * @apiSuccess {int}  freight 运费
	 * @apiSuccess {int}  total_price 总价
	 * @apiSuccess {List[Map]}  pay_type_list 支付方式列表 
	 * @apiSuccess {int}  current_pay_type 当前支付方式
	 * @apiParamExample {curl} Example usage:
	 * http://59.110.137.245:8080/api/order/preview?token=c81e728d9d4c2f636f067f89cc14862c&product_item=[{"product_id":40,"amount":"2"},{"product_id":41,"amount":"2"}]
	 */
	function preview(Request $request){
		$rules = [
				'product_item' => [
						'required'
				]
		];
		
		$validator = app ( 'validator' )->make ( $request->all (), $rules );
		if ($validator->fails ()) {
			return $this->throwErrors ( $validator );
		}
		$products=json_decode($request->product_item);
		$productList=[];
		$totalPrice=0;
		foreach($products as $productItem){
			$product=Product::select(['id','title','image','price'])->find($productItem->product_id);
			$product->amount=(int)$productItem->amount;
			$productList[]=$product;
			$totalPrice+=$product->price*$product->amount;
		}
		
		$address=UserAddress::first();
		$data['product_list']=$productList;
		$data['address']=$address;
		$data['freight']=6;
		$data['total_price']=$totalPrice;
		$data['pay_type']=[1=>'微信支付'];
		$data['current_pay_type']=1;
		return $this->success ($data);
	}
	
	/**
	 *
	 * @api {post} order/create 订单提交
	 * @apiName order/create
	 * @apiGroup order
	 * @apiParam  {json}  product_item  例：[{"product_id":1,"amount":2},{"product_id":1,amount":2}]
	 * @apiParam  {int}  address_id 地址id
	 * @apiParam  {int}  pay_type 支付方式id
	 * @apiParamExample {curl} Example usage:
	 * http://59.110.137.245:8080/api/order/create?token=c81e728d9d4c2f636f067f89cc14862c&product_item=[{"product_id":40,"amount":"2"},{"product_id":41,"amount":"2"}]&address_id=5&pay_type=1
	 */
	function create(Request $request) {
		$coupon = null;
		$user = User::find ( $request->user_id );
		$address = UserAddress::find ( $request->input ( 'address_id' ) );
		$items = json_decode($request->product_item,true);
		$this->orderService->store ( $user, $address, $request->input ( 'remark' ), $items, $coupon );
		return $this->success ();
	}
	/**
	 *
	 * @api {post} order/list 订单列表
	 * @apiName order/list
	 * @apiGroup order
	 * @apiParam  {int}  status 订单状态 1:全部【默认为全部】 2:待收货 3:已完成
	 * @apiSuccess {List[Map]}  data 订单列表
	 * @apiSuccess (data) {int}  id order_id
	 * @apiSuccess (data) {string}  no 订单编号
	 * @apiSuccess (data) {int}  amount 商品数量 【请自行count items字段】
	 * @apiSuccess (data) {string}  total_amount 总计价格
	 * @apiSuccess (data) {List[Map]}  items 订单内商品
	 * @apiSuccess (items) {int}  id 商品id
	 * @apiSuccess (items) {sting}  price 支付时售价
	 * @apiSuccess (items) {object}  product 商品属性【会跟随商品数据实时变化】
	 * @apiSuccess (product) {string} title 商品标题
	 * @apiSuccess (product) {string} image 商品主图
	 * @apiParamExample {curl} Example usage:
	 * http://59.110.137.245:8080/api/order/list?token=c81e728d9d4c2f636f067f89cc14862c&status=1
	 */
	function list(Request $request){
		$orders = Order::query()
		// 使用 with 方法预加载，避免N + 1问题
		->with(['items.product'])
		->where('user_id', $request->user_id)
		->orderBy('created_at', 'desc')
		->paginate();
		return $this->success ($orders);
	}
}
