import typing
from datetime import timedelta

from django.core.cache import cache
from django.utils.translation import gettext
from django.utils.translation import gettext_lazy as _

from djangoblog.utils import send_email

_code_ttl = timedelta(minutes=5)

# 验证邮件发送函数 - 向指定邮箱发送验证码邮件
def send_verify_email(to_mail: str, code: str, subject: str = _("Verify Email")):
    """发送重设密码验证码
    Args:
        to_mail: 接受邮箱
        subject: 邮件主题
        code: 验证码
    """
    html_content = _(
        "You are resetting the password, the verification code is：%(code)s, valid within 5 minutes, please keep it "
        "properly") % {'code': code}
    send_email([to_mail], subject, html_content)

# 验证码验证函数 - 检查用户输入的验证码是否正确
def verify(email: str, code: str) -> typing.Optional[str]:
    """验证code是否有效
    Args:
        email: 请求邮箱
        code: 验证码
    Return:
        如果有错误就返回错误str
    Node:
        这里的错误处理不太合理，应该采用raise抛出
        否测调用方也需要对error进行处理
    """
    cache_code = get_code(email)
    if cache_code != code:
        return gettext("Verification code error")

# 验证码存储函数 - 将验证码保存到缓存系统
def set_code(email: str, code: str):
    """设置code"""
    cache.set(email, code, _code_ttl.seconds)

# 验证码获取函数 - 从缓存系统中获取验证码
def get_code(email: str) -> typing.Optional[str]:
    """获取code"""
    return cache.get(email)
