<?php

namespace app\api\controller;

use app\api\logic\PayLogic;
use app\common\basics\Api;
use app\common\enum\OrderEnum;
use app\common\enum\PayEnum;
use app\common\model\Client_;
use app\common\model\order\OrderTrade;
use app\common\model\order\Order;
use app\common\model\order\OrderLog;
use app\common\server\AliPayServer;
use app\common\server\JsonServer;
use app\common\model\Test;
use app\common\server\WeChatPayServer;
use app\common\server\WeChatServer;
use app\common\model\integral\IntegralOrder;

/**
 * Class Pay
 * @package app\api\controller
 */
class Pay extends Api
{
    public $like_not_need_login = ['notifyMnp', 'notifyOa', 'notifyApp', 'aliNotify'];

    /**
     * @notes 支付入口
     * @return \think\response\Json
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     * @author suny
     * @date 2021/7/13 6:13 下午
     */
    public function unifiedpay()
    {
        $post = $this->request->post();
        if(!isset($post['pay_way'])) {
            return JsonServer::error('请选择支付方式');
        }
        if ($post['from'] == 'order') {
            // 更新支付方式
            $order = Order::findOrEmpty($post['order_id']);
            $order->pay_way = $post['pay_way'];
            $order->save();
            $pay_way = $order['pay_way'];
        }
        if ($post['from'] == 'trade') {
            $order = Order::where('trade_id', $post['order_id'])->findOrEmpty();
            // 更新支付方式
            Order::where('trade_id', $post['order_id'])->update(['pay_way' => $post['pay_way']]);
            $pay_way = $post['pay_way'];
        }
        if ($post['from'] == 'recharge') {
            $pay_way = isset($post['pay_way']) ? $post['pay_way'] : PayEnum::WECHAT_PAY;
        }

        // 积分订单
        if ($post['from'] == 'integral') {
            $order = IntegralOrder::findOrEmpty($post['order_id']);
            IntegralOrder::where('id', $post['order_id'])->update(['pay_way' => $post['pay_way']]);
            $pay_way = $post['pay_way'];
        }

        // order,trade方式金额为0直接走余额支付
        if (isset($order) && $order['order_amount'] == 0) {
            $result = PayLogic::balancePay($post['order_id'], $post['from']);
            return $result;
        }
        switch ($pay_way) {
            case OrderEnum::PAY_WAY_BALANCE://余额支付
                $result = PayLogic::balancePay($post['order_id'], $post['from']);
                break;
            case OrderEnum::PAY_WAY_WECHAT://微信支付
                // openid为空 且在小程序或公众号中支付时 必填openid
                if (empty($post['openid']) && in_array($this->client, [Client_::mnp, Client_::oa])) {
                    //微信支付时必须传openid过来
                    return JsonServer::error('缺少openid');
                }
                $result = PayLogic::wechatPay($post['order_id'], $post['from'], $this->client, $post['openid'] ?? '');
                break;
            case OrderEnum::PAY_WAY_ALIPAY://支付宝支付
                $result = PayLogic::aliPay($post['order_id'], $post['from'],$this->client);
                $data = [
                    'code' => 10001,
                    'msg' => '发起成功',
                    'data' => $result,
                    'show' => 0,
                ];
                return json($data);
                break;
        }

        return $result;

    }



    /**
     * @notes 小程序回调
     * @throws \EasyWeChat\Kernel\Exceptions\Exception
     * @author suny
     * @date 2021/7/13 6:13 下午
     */
    public function notifyMnp()
    {

        $config = WeChatServer::getPayConfig(Client_::mnp);
        return WeChatPayServer::notify($config);
    }


    /**
     * @notes 公众号回调
     * @throws \EasyWeChat\Kernel\Exceptions\Exception
     * @author suny
     * @date 2021/7/13 6:13 下午
     */
    public function notifyOa()
    {

        $config = WeChatServer::getPayConfig(Client_::oa);
        return WeChatPayServer::notify($config);
    }


    /**
     * @notes APP回调
     * @throws \EasyWeChat\Kernel\Exceptions\Exception
     * @author suny
     * @date 2021/7/13 6:14 下午
     */
    public function notifyApp()
    {

        $config = WeChatServer::getPayConfig(Client_::ios);
        return WeChatPayServer::notify($config);
    }



    /**
     * @notes 支付宝回调
     * @return bool
     * @author suny
     * @date 2021/7/13 6:14 下午
     */
    public function aliNotify()
    {
        $data = $this->request->post();
        $result = (new AliPayServer())->verifyNotify($data);
        if (true === $result) {
            echo 'success';
        } else {
            echo 'fail';
        }
    }
}