<?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;
use EasyWeChat;
use Log;
/**
 *
 * 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":40,"amount":2},{"product_id":41,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 );
		foreach ( $items as $key => $item ) {
			$items [$key] ['price'] = Product::find ( $item ['product_id'] )->price;
		}
		$order = $this->orderService->store ( $user, $address, $request->input ( 'remark' ), $items, $coupon );
		// 生成预付单
		$app = EasyWeChat::payment ();

		$result = $app->order->unify ( [ 
				'body' => '主妇无忧-普通商品',
				'out_trade_no' => $order->no,
				'total_fee' => $order->total_amount * 100,
				'spbill_create_ip' => '123.12.12.123', // 可选，如不传该参数，SDK 将会自动获取相应 IP 地址
				'notify_url' => 'https://www.zhufuwuyou.net/order/notify', // 支付结果通知网址，如果不设置则会使用配置里的默认地址
				'trade_type' => 'APP'
			// 'openid' => 'oUpF8uMuAJO_M2pxb1Q9zNjWeS6o'
		] );
		if ($result ['return_code'] == 'SUCCESS' && $result ['result_code'] == 'SUCCESS') {
			$resultNew = $app->jssdk->appConfig ( $result ['prepay_id'] ); // 第二次签名

		} 

		$resultNew ['out_trade_no'] = $order->no;
		$resultNew ['timestamp'] = time ();
		return $this->success ( $resultNew );
	}
	/**
	 *
	 * @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 (data) {int}  status 状态
	 * @apiSuccess (items) {int}  id 商品id 1:待支付 2:待收货 3:已完成
	 * @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) {
		$query = Order::query ()->
		// 使用 with 方法预加载，避免N + 1问题
		with ( [ 
				'items.product'
		] )->where ( 'user_id', $request->user_id );
		if ($request->exists ( 'status' ))
			$query->where ( 'status', $request->status );
		$orders = $query->orderBy ( 'created_at', 'desc' )->paginate ();
		return $this->success ( $orders );
	}
	/**
	 *
	 * @api {post} order/detail 订单详情
	 * @apiName order/detail
	 * @apiGroup order
	 * @apiParam  {int}  order_id  订单id
	 * @apiSuccess {int}  id order_id
	 * @apiSuccess {string}  no 订单编号
	 * @apiSuccess {JSON}  address 详细地址 
	 * @apiSuccess {string}  prodcut_amount 商品总金额 【此处逻辑有可能有变化，目前接口是写死的】
	 * @apiSuccess {string}  freight 运费  【此处逻辑有可能有变化，目前接口是写死的】
	 * @apiSuccess {string}  total_amount 总金额
	 * @apiSuccess (data) {List[Map]}  items 订单内商品
	 * @apiSuccess (data) {int}  status 状态
	 * @apiSuccess (items) {int}  id 商品id 1:待支付 2:待收货 3:已完成
	 * @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&order_id=177
	 */
	function detail(Request $request){
		$rules = [
				'order_id' => [
						'required'
				]
		];
	
		$validator = app ( 'validator' )->make ( $request->all (), $rules );
		if ($validator->fails ()) {
			return $this->throwErrors ( $validator );
		}
		$order=Order::query()->where('id',$request->order_id) ->with(['items.product'])->first();
		$order->freight=6;
		$order->prodcut_amount=$order->total_amount;
		return $this->success ( $order );
	}
	
	function notify(Request $request){
		Log::info('咨询回调成功:'.json_encode($request->all()));
	}
}
