<?php


namespace App\Http\Middleware\Api;


use Illuminate\Http\Request;

use Closure;

class SwitchCompanyDb
{
    // 无需验证的路径
    protected   $except     = [
        'api/wechat_pay/notify',    // 微信支付回调无需通过验证
        'api/wechat_transfer/notify',    // 微信支付回调无需通过验证
        'api/question_bank/question_reception/wechat_transfer/notify',    // 题库微信支付回调无需通过验证
        'api/login/wxop_login_uri',      // 微信公众号登录
        'api/login/wxop_auth',      // 微信公众号登录
        'api/question_bank/question_reception/orders/jsapi_notify',  //题库小程序微信支付回调
        'api/live_push_notify/notify',        //直播推流回调
        'api/short_link/get_origin_url',        //解析短链
        'api/short_link/create'        //创建短链
    ];

    public function handle(Request $request, Closure $next)
    {
        // 当前路径
        $path                                                           = ltrim($request->getPathInfo(), '/');
        // 判断是否需要切换数据库
        if ( in_array($path, $this->except) )                           return $next($request);
        // 提现通知需要单独判断
        if( stripos('&'.$path,'api/wechat_transfer/notify') == 1 )      return $next($request);
        // 题库提现通知需要单独判断
        if( stripos('&'.$path,'api/question_bank/question_reception/wechat_transfer/notify') == 1 )      return $next($request);
        // 退款回调需要单独判断
        if( stripos('&'.$path,'api/wechat_pay/refund_notify') == 1 )    return $next($request);
        // 退款回调需要单独判断
        if( stripos('&'.$path,'api/login/wxop_auth') == 1 )             return $next($request);
        // 判断有没有companyid
        $companyId                                                      = $request->input('company_id', 0);
        // 没有获取appid对应的
        if( !$companyId )                                               {
            //从请求中获取appid
            $appId                                                      = $request->input('app_id', '');
            //通过corpId获取company_id
            $companyId                                                  = $appId ? (new Component)->getOne($appId,'company_id') :  $companyId;
            // 没有获取appid对应的
            if( !$companyId )                                           {
                // 店铺ID
                $shopId                                                 = $request->input('shop_id', 0);
                // 店铺查询商户ID
                $companyId                                              = $shopId ? (new Shop)->getOne($appId,'company_id') : $companyId;
                // 如果还是没有company_id
                if( !$companyId )                                       {
                    // 获取请求的域名来源
                    $domain                                             = $request->server('HTTP_REFERER');
                    // 如果有来源
                    if( $domain )                                       {
                        // 获取数据
                        $domain                                         = parse_url($domain, PHP_URL_HOST);
                        // 从域名中获取company_id
                        $companyId                                      = $domain ? (new CompanyDomainConfig)->getOne($domain,'company_id') : $companyId;
                    }
                }
            }
        }
        // 测试服默认访问商户1  大方无隅测试，正式服默认访问商户3 大方无隅测试
        $companyId                              = $companyId ? (int) $companyId : (config('app.env','') == 'local' ? 1 : 3);
        // 切换数据库
        $result                                 = (new CompanyDbConfig)->reconnectDb($companyId); 
        // 如果有错误
        if ( isset($result['error']) )          return json_send(['code'=>'no_company','msg'=>$result['error']]);
        // 商户ID
        $request['company_id']                  = $companyId;
        // 下一个中间件
        return                                  $next($request);
    }

}