<?php
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Http\Utils\CustomCaptcha;
use App\Http\Utils\R;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Mews\Captcha\Captcha;

class CaptchaController extends Controller{
    function getCaptcha(Request $request, Captcha $captchaBuilder)
    {
        //获取laravel的session token,这里的思想是通过缓存token与验证码值来验证以避免重复提交同一hash问题
        $key = $request->cookie(app()->getNamespace() . "session");
        //创建自定义验证码对象,需要将构建器传入
        $captcha = new CustomCaptcha($captchaBuilder);
        //设置过期时间。我设置了两分钟
        $expiredAt = now()->addMinute(2);
        //将验证码值,session token放入缓存并设置过期时间
        Cache::put($key, ['captcha' => $captcha->getCode()], $expiredAt);
        //构建返回数组,包括有效期截止时间和BASE64格式图片
        $result = [
            'expired_at' => $expiredAt->toDateTimeString(),
            'captcha_img' => $captcha->getImg()
        ];
        //返回201 Created
        return R::ok($result);
    }

    //验证用户提交的验证码,返回值bool(私有方法)
    static function check_captcha($captcha,$session):bool{
        //通过传入的session获取缓存中的验证码对象,不存在则返回验证失败
        $captchaData = Cache::get($session);
        Cache::forget($session);
        if ($captchaData == null) {
            return false;
        }
        //判断传入的验证码与缓存是否相等
        if ($captcha == $captchaData['captcha']){
            return true;
        }else{
            return false;
        }
    }
}