<?php

namespace Modules\Channel\Http\Controllers;

use Catch\Base\CatchController;
use EasyWeChat\OpenPlatform\Application;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Modules\Channel\Models\WechatAuthorizationInfo;
use Modules\Channel\Services\WechatOpenPlatform\WechatOpenPlatformService;
use Modules\Common\Errors\Errors;
use Modules\Common\Exceptions\CommonBusinessException;
use Modules\User\Http\Controllers\UserTrait;

class WechatOpenPlatformController extends CatchController
{
    use UserTrait;
    // 授权跳转页
    public function preauth(Request $request) {
        $currentUser = $this->getCurrentUser();
        $componentInfo = WechatOpenPlatformService::getComponentInfoByCompanyUid($currentUser->pid);
        $app = WechatOpenPlatformService::buildApplication($componentInfo);
        $url = $app->createPreAuthorizationUrl(url('/api/channel/openPlatform/auth/'.$componentInfo->app_id), []);
        return $url;
    }

    public function auth(Request $request, $component_appid) {
        $auth_code = $request->input('auth_code');
        $componentInfo = WechatOpenPlatformService::getComponentInfoByAppid($component_appid);
        $app = WechatOpenPlatformService::buildApplication($componentInfo);
        $client = $app->getClient();
        $response = $client->post('/cgi-bin/component/api_query_auth', [
            'component_appid' => $component_appid,
            'authorization_code' => $auth_code
        ]);
        $authorizer_appid = $response['authorization_info']['authorizer_appid'];
        $authorizer_refresh_token = $response['authorization_info']['authorizer_refresh_token'];
        $currentUser = $this->getCurrentUser();
        WechatAuthorizationInfo::updateOrCreate([
            'authorizer_appid' => $authorizer_appid,
            'component_appid' => $component_appid,
            'user_id' => $currentUser->id,
            'puser_id' => $currentUser->pid,
        ], [
            'authorizer_refresh_token' => $authorizer_refresh_token
        ]);

        return view('wechat.openPlatform.authSuccess')->with('url', url('/'));
    }

    /**
     * 处理授权事件
     * @param Request $request
     * @param $component_appid
     */
    public function authorCommand(Request $request, $component_appid) {
        $componentInfo = WechatOpenPlatformService::getComponentInfoByAppid($component_appid);
        $app = WechatOpenPlatformService::buildApplication($componentInfo);
        $server = $app->getServer();

        $server->handleAuthorized(function($message, \Closure $next) {
            myLog('authorCommand')->info('handleAuthorized', ['message' => $message]);
            return $next($message);
        });


        return $server->serve();
    }

    public function infoCommand(Request $request, $authorizer_appid, $component_appid) {
        $componentInfo = WechatOpenPlatformService::getComponentInfoByAppid($component_appid);
        $app = WechatOpenPlatformService::buildApplication($componentInfo);

        $server = $app->getServer();

        return $server->serve();
    }
}