<?php

namespace addons\shopro\controller\order;

use think\Db;
use addons\shopro\controller\Common;
use addons\shopro\service\order\OrderCreate;
use addons\shopro\service\order\OrderOper;
use app\admin\model\shopro\order\Order as OrderModel;
use app\admin\model\shopro\Pay as PayModel;
use addons\shopro\library\express\Express as ExpressLib;
//订单
class Order extends Common
{

    protected $noNeedLogin = [];
    protected $noNeedRight = ['*'];

    //订单列表
    public function index()
    {
        $user = auth_user();
        $params = $this->request->param();
        $type = $params['type'] ?? 'all';

        $orders = OrderModel::where('user_id', $user->id)->with(['items', 'invoice']);

        switch ($type) {
            case 'unpaid':
                $orders = $orders->unpaid();
                break;
            case 'groupon_ing':
                $orders = $orders->paid()->nosend()->groupon_ing();
                break;
            case 'nosend':
                $orders = $orders->pretendPaid()->nosend();
                break;
            case 'noget':
                $orders = $orders->pretendPaid()->noget();
                break;
            case 'nocomment':
                $orders = $orders->paid()->nocomment();
                break;
        }

//        $orders = $orders->order('id', 'desc')->paginate(request()->param('list_rows', 10))->toArray();
        $orders = $orders->order('id', 'desc')->autopage()->select();

        $orderModel = new OrderModel();
        foreach ($orders as &$order) {
            $order = $orderModel->setOrderItemStatusByOrder($order);
        }

        $this->success('获取成功', $orders);
    }

    //订单详情
    public function detail()
    {
        $user = auth_user();
        $id = $this->request->param('id');
        $merchant_trade_no = $this->request->param('merchant_trade_no');
        $transaction_id = $this->request->param('transaction_id');

        $order = OrderModel::where('user_id', $user->id)->with(['items', 'address', 'invoice']);

        if ($id) {
            $order = $order->where(function ($query) use ($id) {
                return $query->where('id', $id)->whereOr('order_sn', $id);
            });
        } else if ($merchant_trade_no) {
            $pay = PayModel::where('pay_sn', $merchant_trade_no)->findOrFail();
            $order = $order->where('id', $pay->order_id);
        } else {
            $this->error('参数错误');
        }

        $order = $order->find();
        if (!$order) {
            $this->error(__('No Results were found'));
        }

        $order->pay_types_text = $order->pay_types_text;
        // 处理未支付订单 item status_code
        $order = $order->setOrderItemStatusByOrder($order);     // 这里订单转 数组了

        // 更新包裹信息(5分钟缓存)
        (new ExpressLib)->updateOrderExpress($order['id']);
        
        $this->success('获取成功', $order);
    }


    public function itemDetail()
    {
        $user = auth_user();

        $id = $this->request->param('id');
        $item_id = $this->request->param('item_id');

        if (!$id || !$item_id) {
            $this->error('参数错误');
        }

        $order = OrderModel::with(['items' => function ($query) use ($item_id) {
            $query->where('id', $item_id);
        }])->where('user_id', $user->id)->where('id', $id)->find();
        if (!$order || !$order->items) {
            $this->error(__('No Results were found'));
        }

        $order = $order->setOrderItemStatusByOrder($order);     // 这里订单转 数组了
        $item = $order['items'][0];

        $this->success('获取成功', $item);
    }

    //计算订单
    public function calc()
    {
        $params = $this->request->param();

        //购物车
        $cart = input('cart',0);
        if(!empty($cart)){
            unset($params['goods_list']);
            // 多个商品
            $carts = (new \app\admin\model\shopro\Cart)
                ->whereIn('id', $cart)
                ->order(['id' => 'desc'])
                ->select();
            $goods_list = [];
            foreach ($carts as $cart) {
                $goods_list[] = [
                    'goods_id'           => $cart['goods_id'],
                    'goods_sku_price_id' => $cart['goods_sku_price_id'],
                    'goods_num'          => $cart['goods_num'],
                ];
            }
            $params['goods_list'] = empty($goods_list) ? '' : json_encode($goods_list);
        }
        //购物车

        $this->svalidate($params, ".calc");

        $orderCreate = new OrderCreate($params);
        $result = $orderCreate->calc();

        if (isset($result['msg']) && $result['msg']) {
//            $this->error($result['msg'], 1, $result);
            $this->error($result['msg']);
        } else {
            $this->success('计算成功', $result);
        }
    }

    //创建订单
    public function create()
    {
        $params = $this->request->param();

        //购物车
        $cart = input('cart',0);
        if(!empty($cart)){
            unset($params['goods_list']);
            // 多个商品
            $carts = (new \app\admin\model\shopro\Cart)
                ->whereIn('id', $cart)
                ->order(['id' => 'desc'])
                ->select();
            $goods_list = [];
            foreach ($carts as $cart) {
                $goods_list[] = [
                    'goods_id'           => $cart['goods_id'],
                    'goods_sku_price_id' => $cart['goods_sku_price_id'],
                    'goods_num'          => $cart['goods_num'],
                ];
            }
            $params['goods_list'] = empty($goods_list) ? '' : json_encode($goods_list);
        }
        //购物车

        $this->svalidate($params, ".create");

        $orderCreate = new OrderCreate($params);
        $result = $orderCreate->calc('create');

        $order = $orderCreate->create($result);

        $this->success('订单添加成功', $order);
    }



    /**
     * 获取用户可用和不可用优惠券
     *
     * @param Request $request
     * @return void
     */
    public function coupons() 
    {
        $params = $this->request->param();
        $this->svalidate($params, ".create");

        $orderCreate = new OrderCreate($params);
        $result = $orderCreate->getCoupons();

        $this->success('获取成功', $result);
    }

    //取消原因
    public function cancel_reason(){
        $data = [
            '收货地址或者手机号填错了',
            '忘记支付密码/余额不足',
            '无法正常支付',
            '不想买了',
            '其他原因',
        ];

        $this->success(1, $data);
    }

    // 取消订单,未支付的才可以
    public function cancel()
    {
        $user = auth_user();
        $id = $this->request->param('id');
        $reason = $this->request->param('reason');

        $order = Db::transaction(function () use ($id, $user, $reason) {
            $order = OrderModel::canCancel()->where('user_id', $user->id)->with(['items', 'invoice'])->lock(true)->where('id', $id)->find();
            if (!$order) {
                $this->error(__('No Results were found'));
            }

            $orderOper = new OrderOper();
            $order = $orderOper->cancel($order, $user, 'user', $reason);

            return $order;
        });
        // 订单未支付,处理 item 状态
        $order = $order->setOrderItemStatusByOrder($order);     // 这里订单转 数组了

//        $this->success('取消成功', $order);
        $this->success('取消成功');
    }


    // 订单申请全额退款,支付的且未发货的才可以
    public function applyRefund()
    {
        $user = auth_user();
        $id = $this->request->param('id');
        $reason = $this->request->param('reason');

        $order = OrderModel::paid()->where('user_id', $user->id)->where('id', $id)->find();
        if (!$order) {
            $this->error(__('No Results were found'));
        }

        $order = Db::transaction(function () use ($order, $user, $reason) {
            $orderOper = new OrderOper();
            $order = $orderOper->applyRefund($order, $user, 'user',$reason);

            return $order;
        });

        $order = OrderModel::with(['items', 'invoice'])->find($id);
        $order = $order->setOrderItemStatusByOrder($order);     // 这里订单转 数组了
//        $this->success('申请成功', $order);
        $this->success('申请成功');
    }

    // 确认收货(货到付款的确认收货在后台)
    public function confirm()
    {
        $user = auth_user();
        $id = $this->request->param('id');

        $order = OrderModel::paid()->where('user_id', $user->id)->where('id', $id)->find();
        if (!$order) {
            $this->error(__('No Results were found'));
        }

        $order = Db::transaction(function () use ($order, $user) {
            $orderOper = new OrderOper();
            $order = $orderOper->confirm($order, [], $user, 'user');

            return $order;
        });

        $order = OrderModel::with(['items', 'invoice'])->find($id);
//        $this->success('收货成功', $order);
        $this->success('收货成功');
    }


    // 评价
    public function comment()
    {
        $user = auth_user();
        $params = $this->request->param();
        $id = $params['id'] ?? 0;
        $params['comments'] = json_decode(htmlspecialchars_decode($params['comments']),true);
        $this->svalidate($params, ".comment");

        $comments = $params['comments'] ?? [];
        foreach ($comments as $comment) {
            $this->svalidate($comment, ".comment_item");
        }

        $order = OrderModel::paid()->where('user_id', $user->id)->where('id', $id)->find();
        if (!$order) {
            $this->error(__('No Results were found'));
        }

        $order = Db::transaction(function () use ($order, $params, $user) {
            $orderOper = new OrderOper();
            $order = $orderOper->comment($order, $params['comments'], $user, 'user');

            return $order;
        });

//        $this->success('评价成功', $order);
        $this->success('评价成功');
    }



    /**
     * 用户是否存在未支付的,当前团的订单
     *
     * @param Request $request
     * @return void
     */
    public function unpaidGrouponOrder()
    {
        $user = auth_user();

        $params = $this->request->param();
        $activity_id = $params['activity_id'] ?? 0;

        if ($user && $activity_id) {
            $order = OrderModel::unpaid()->where('user_id', $user->id)
                ->where('activity_id', $activity_id)
                ->whereIn('activity_type', ['groupon', 'groupon_ladder'])->find();
        }

        $this->success('获取成功', $order ?? null);
    }


    // 删除订单
    public function delete()
    {
        $user = auth_user();
        $id = $this->request->param('id');

        $order = OrderModel::canDelete()->where('user_id', $user->id)->where('id', $id)->find();
        if (!$order) {
            $this->error('订单不存在或不可删除');
        }

        Db::transaction(function () use ($order, $user) {
            $orderOper = new OrderOper();
            $orderOper->delete($order, $user, 'user');
        });

        $this->success('删除成功');
    }
}