"""
短信发送测试脚本
用法: python test_sms.py
"""
import os
import sys
import django

# 初始化 Django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
django.setup()

from utils.sms import get_sms_client, generate_code, send_sms_code, verify_sms_code


def test_direct_send():
    """测试1: 直接调用 SDK 发送"""
    print('=' * 50)
    print('测试1: 直接调用阿里云 SMS SDK')
    print('=' * 50)

    client = get_sms_client()
    if not client.client:
        print('[FAIL] SMS SDK 未初始化，检查 alibabacloud_dysmsapi20170525 是否安装')
        return False

    code = generate_code()
    phone = '13725102796'
    print(f'手机号: {phone}')
    print(f'验证码: {code}')
    print(f'签名: {client.sign_name}')
    print(f'模板: {client.template_code}')
    print('发送中...')

    ok, err = client.send_code(phone, code)
    if ok:
        print(f'[OK] 发送成功! 请查收短信，验证码: {code}')
    else:
        print(f'[FAIL] 发送失败: {err}')
    return ok


def test_full_flow():
    """测试2: 完整流程（发送 + 校验）"""
    print()
    print('=' * 50)
    print('测试2: 完整流程（发送 + 存库 + 校验）')
    print('=' * 50)

    phone = '13725102796'

    # 发送
    print(f'[1/3] 发送验证码到 {phone}...')
    ok, err = send_sms_code(phone)
    if not ok:
        print(f'[FAIL] 发送失败: {err}')
        return False
    print('[OK] 发送成功')

    # 从数据库读取验证码
    from apps.users.models import SmsCode
    record = SmsCode.objects.filter(phone=phone, is_used=False).order_by('-created_at').first()
    if not record:
        print('[FAIL] 数据库中未找到验证码记录')
        return False
    print(f'[2/3] 数据库记录: code={record.code}, expire_at={record.expire_at}')

    # 校验
    valid, err = verify_sms_code(phone, record.code)
    if valid:
        print('[OK] 验证码校验通过')
    else:
        print(f'[FAIL] 校验失败: {err}')
    return valid


if __name__ == '__main__':
    print('阿里云短信服务测试')
    print(f'AK: {os.environ.get("ALIYUN_ACCESS_KEY_ID", "使用默认值")}')
    print()

    # 测试1: 只测 SDK 连通性
    ok = test_direct_send()

    if ok:
        # 测试2: 需要数据库连通
        try:
            test_full_flow()
        except Exception as e:
            print(f'\n[SKIP] 完整流程测试跳过（数据库连接问题）: {e}')

    print()
    print('测试完成')
