<?php

namespace app\repository;

use app\model\SmsLog;
use app\service\Repository;
use Exception;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use think\facade\Log;
use think\Model;

/**
 * 通用域 相关操作
 *
 * Class CommonRepository
 * @package app\repository
 * @method self getInstance(Model $model = null) static
 */
class CommonRepository extends Repository
{
    public const SMS_TYPE_REGISTER      = 'register';//注册
    public const SMS_TYPE_LOGIN         = 'login';//登录
    public const SMS_TYPE_BINDING       = 'binding';//绑定
    public const SMS_TYPE_EDIT_PASSWORD = 'edit_password';//修改密码

    public const SMS_STATUS_OK      = 1;//短信验证通过
    public const SMS_STATUS_WAITING = 0;//验证码待检测

    /**
     * 检查短信验证码
     *
     * @param  string  $phone
     * @param  string  $code
     * @param  string  $type
     * @return bool
     * @throws DataNotFoundException
     * @throws DbException
     * @throws ModelNotFoundException
     */
    public function checkSms(string $phone, string $code, string $type): bool
    {
        $item = (new SmsLog())->where('phone', $phone)
            ->where('type', $type)
            ->where('code', $code)
            ->order('created_at', 'desc')
            ->order('id', 'desc')
            ->find();
        if (!$item) {
            return false;
        }

        if ($item['expired_at'] < date('Y-m-d H:i:s')) {
            return false;
        }

        return $item->save(['status' => self::SMS_STATUS_OK]);
    }

    /**
     * 日志记录
     *
     * @param  string  $msg
     * @param  Exception|null  $e
     * @param  string  $level
     * @param  string  $channel
     */
    public static function log(string $msg, Exception $e = null, string $level = 'error', string $channel = 'file')
    {
        if ($e != null) {
            $msg = sprintf("[%s]%s:%s %s", $msg, $e->getFile(), $e->getLine(), $e->getMessage());
        } else {
            $msg = sprintf("%s", $msg);

        }
        Log::channel($channel)->$level($msg);
    }
}