<?php

namespace App\Console\Commands\Miniprogram;

use App\Service\Miniprogram\Wechat\AccessTokenService;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redis;

class WechatAccessToken extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'Miniprogram:WechatAccessToken {--appid= : 小程序appid} {--secret= : 小程序secret}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '微信小程序维护';

    /**
     * Execute the console command.
     */
    public function handle()
    {
        $appid = $this->option('appid');
        $secret = $this->option('secret');
        if($appid && $secret) {
            $miniprograms = [(object)[
                'appid' => $appid, 'appsecret' => $secret
            ]];
        } else {
            $miniprograms = DB::table('miniprogram')
                ->where(['type' => 1, 'status' => 1])
                ->select('appid', 'appsecret')
                ->get();
        }

        foreach ($miniprograms as $miniprogram) {
            $ttl = Redis::ttl(AccessTokenService::getAccessTokenRedisKey($miniprogram->appid));
            if($ttl > 600) {
                continue;
            }
            try {
                $accessTokenInfo = AccessTokenService::getAccessToken($miniprogram->appid, $miniprogram->appsecret);
            } catch (\Exception $exception) {
                myLog('wechat-miniprogram')->info('刷新小程序accessToken失败', [
                    'appid' => $miniprogram->appid,
                    'exceptionMessage' => $exception->getMessage(),
                    'exceptionCode' => $exception->getCode()
                ]);
                continue;
            }

            Redis::setex(AccessTokenService::getAccessTokenRedisKey($miniprogram->appid),
                $accessTokenInfo['expires_in'], $accessTokenInfo['access_token']);
        }
    }
}