<?php


namespace app\api\controller;


use addons\epay\library\Service;
use app\common\controller\Api;
use Exception;
use GuzzleHttp\Client;
use think\Db;

/**
 * @ApiInternal
 */
class Notify extends Api
{
    protected $noNeedRight = ['*'];
    protected $noNeedLogin = ['*'];

    /**
     * 订单支付回调
     */
    public function orderNotify()
    {
        $paytype = $this->request->param('type');
        $pay     = Service::checkNotify($paytype);
        if (!$pay) {
            return '签名错误';
        }
        $data = $pay->verify();
        if (!is_array($data)) $data = json_decode($data, true);
        $model       = new \app\api\model\Order();
        $goodsmodel  = new \app\api\model\OrderGoods();
        $skumodel    = new \app\api\model\GoodsSpec();
        $goods_model = new \app\api\model\Goods();
        $buymodel    = new \app\api\model\UserBuylist();
        try {
            $out_trade_no = $data['out_trade_no'];
            $order        = $model
                ->where('order_no', $out_trade_no)
                ->where('pay_status', '10')
                ->where('order_status', '10')
                ->find();
            if (!$order) $this->error('订单不存在');
            $order->pay_status     = '20';
            $order->transaction_id = $data['transaction_id'];
            $order->pay_time       = time();
            $order->isUpdate()->save();
            // 减少库存
            $sales_actual = 0;
            $goods_ids    = [];
            $list         = $goodsmodel->where('order_id', $order['id'])->select();
            foreach ($list as $key => $value) {
                $goods_ids[]  = $value['goods_id'];
                $sales_actual += $value['total_num'];
                if ($value['deduct_stock_type'] == 20) {
                    $skumodel->where('goods_spec_id', $value['goods_spec_id'])->setDec('stock_num', $value['total_num']);
                    //增加规格销量
                    $skumodel->where('goods_spec_id', $value['goods_spec_id'])->setInc('goods_sales', $value['total_num']);
                }
            }
            // 增加销量
            $goods_model->whereIn('goods_id', $goods_ids)->setInc('sales_actual', $sales_actual);
            // 判断是否邀请成功
            $user = \app\api\model\User::get($order['user_id']);
            if ($user['invite_user_id'] > 0 && $user['invite_status'] != 1) {
                $user->invite_status = '1';
                $user->isUpdate()->save();
                $coupon = Db::name('coupon')->where('id', 1)->find();
                if ($coupon['endtime'] > time()) {
                    $data = [];
                    $time = time();
                    for ($i = 1; $i <= $coupon['send_number']; $i++) {
                        $data[] = [
                            'user_id'    => $user->invite_user_id,
                            'coupon_id'  => $coupon['id'],
                            'name'       => $coupon['name'],
                            'price'      => $coupon['price'],
                            'full_price' => $coupon['full_price'],
                            'endtime'    => $time + $coupon['days'] * 86400,
                            'createtime' => $time,
                        ];
                    }
                    Db::name('user_coupon')->insertAll($data);
                }
            }
            // 加入我常买
            $data = [];
            foreach ($list as $key => $value) {
                $data[] = [
                    'user_id'  => $order['user_id'],
                    'goods_id' => $value['goods_id'],
                    'sku_id'   => $value['goods_spec_id'],
                ];
            }
            $buymodel->isUpdate(false)->saveAll($data);
            // 给后台发送新订单提醒
            $client    = new Client();
            $http_port = config('socketio.http_port');
            $client->request('POST', 'http://'. $_SERVER['HTTP_HOST'] . ":{$http_port}/", [
                'form_params' => [
                    'type'    => 'publish',
                    'content' => '您有新的订单,请注意查收',
                    'to'      => '',
                ],
            ]);
        } catch (Exception $e) {
        }
        return $pay->success()->send();
    }


    /**
     * 订单退款回调
     */
    public function refund()
    {
        $paytype = $this->request->param('type');
        $pay     = Service::checkNotify($paytype, 'refund');
        if (!$pay) {
            echo '签名错误';
            return;
        }
        $data        = $pay->verify();
        $data        = json_decode($data, true);
        $model       = new \app\api\model\Order();
        $goodsmodel  = new \app\api\model\OrderGoods();
        $skumodel    = new \app\api\model\GoodsSpec();
        $goods_model = new \app\api\model\Goods();
        try {
            $out_trade_no = $data['out_refund_no'];
            $order        = $model
                ->where('refund_no', $out_trade_no)
                ->where('pay_status', '20')
                ->where('order_status', '10')
                ->find();
            if (!$order) $this->error('订单不存在');
            $order->refund_id    = $data['refund_id'];
            $order->refund_time  = time();
            $order->order_status = '20';
            $order->isUpdate()->save();
            // 增加库存
            $sales_actual = 0;
            $list         = $goodsmodel->where('order_id', $order['id'])->select();
            foreach ($list as $key => $value) {
                $sales_actual += $value['total_num'];
                if ($value['deduct_stock_type'] == 20) {
                    $skumodel->where('goods_spec_id', $value['goods_spec_id'])->setInc('stock_num', $value['total_num']);
                }
            }
            // 减少销量
            $goods_model->setDec('sales_actual', $sales_actual);
            //你可以在此编写订单逻辑
        } catch (Exception $e) {
        }
        echo $pay->success()->send();
    }
}