"""短信 provider 共享基座:业务异常 + provider 无关的 mock 校验。

各 provider(jiguang / aliyun)都 `from .base import SmsError`,api 层也从包入口拿到同一个
`SmsError` —— 保证无论用哪个 provider,异常类型与 HTTP 码映射语义一致。
"""
from __future__ import annotations

from app.core.config import settings


class SmsError(Exception):
    """业务异常。`status_code` 决定 api 层翻成哪个 HTTP 码:
    过频/每日超限 = 429(客户端等会再来),供应商不可用 = 503,手机号无效 = 400。
    """

    def __init__(self, message: str, status_code: int = 429) -> None:
        super().__init__(message)
        self.status_code = status_code


def mock_verify(code: str) -> bool:
    """mock 模式校验:放行任意 SMS_CODE_LENGTH 位数字(provider 无关,测试/开发便利,不真校验)。"""
    return len(code) == settings.SMS_CODE_LENGTH and code.isdigit()
