<?php

namespace App\Service\Wechat;

use App\Exception\BusinessException;
use App\Helper\Curl;
use App\JsonRpc\UserExternalServiceInterface;
use Hyperf\Config\Annotation\Value;
use Hyperf\Di\Annotation\Inject;

/**
 * 微信授权处理服务层
 */
class AuthService
{
    /**
     * 考勤系统小程序APPID
     *
     * @var string
     */
    #[Value("app.wechat_punch_card_appid")]
    protected string $appid;

    /**
     * 考勤系统小程序APPSecret
     *
     * @var string
     */
    #[Value("app.wechat_punch_card_secret")]
    protected string $secret;

    /**
     * 用户中心对外RPC服务
     *
     * @var UserExternalServiceInterface
     */
    #[Inject]
    protected UserExternalServiceInterface $userExternalService;

    /**
     * 微信通过code获取session信息请求地址
     *
     * @var string
     */
    protected string $wechat_auth_url = 'https://api.weixin.qq.com/sns/jscode2session';

    /**
     * 通过微信授权新建用户
     *
     * @param string $code
     * @return array
     */
    public function codeToOpenID(string $code) : array
    {
        $url = $this->wechat_auth_url . '?' . http_build_query([
            'appid' => $this->appid,
            'secret' => $this->secret,
            'js_code' => $code,
            'grant_type' => 'authorization_code'
        ]);

        $result = Curl::get($url);
        $res = $this->userExternalService->wechatNewUser($result['data']['openid']);

        if (!$res['code'] !== 200) {
            throw new BusinessException($res['code'], $res['msg']);
        }

        return ['openid' => $result['data']['openid']];
    }
}