import webbrowser
import secrets
import string
import datetime
from typing import Optional

def alert(
        message: str,
        level: str = "INFO",
        show_timestamp: bool = True,
        level_width: int = 7  # 级别字段固定宽度（含括号），确保对齐
) -> None:
    """
    无依赖终端提示工具，带时间戳和级别标识

    参数:
        message: 提示内容（支持多行字符串）
        level: 级别标识（DEBUG/INFO/WARN/ERROR/SUCCESS，默认INFO）
        show_timestamp: 是否显示时间戳（默认显示）
        level_width: 级别字段宽度（默认7字符，如[DEBUG  ]）
    """
    # 1. 处理时间戳（中文格式，补零对齐）
    timestamp = ""
    if show_timestamp:
        now = datetime.datetime.now()
        # 格式：YYYY年MM月DD日HH:MM:SS（月/日/时/分/秒均补零为2位）
        timestamp = now.strftime(f"%Y/%m/%d %H:%M:%S")

    # 2. 处理级别（转大写+固定宽度，确保视觉对齐）
    level_upper = level.upper().strip()
    # 常见级别映射（未识别的级别直接用输入值）
    level_map = {
        "DEBUG": "[DEBUG]  ",
        "INFO": "[INFO]   ",
        "WARN": "[WARN]   ",
        "ERROR": "[ERROR]  ",
        "SUCCESS": "[SUCCESS]"
    }
    # 若级别在映射中则用预设格式，否则自定义（固定宽度左对齐）
    level_str = level_map.get(level_upper, f"[{level_upper.ljust(level_width - 2)}]")

    # 3. 组装输出内容（分层清晰，多行消息自动缩进）
    parts = []
    if show_timestamp:
        parts.append(f"[{timestamp}]")  # 时间戳用[]包裹
    parts.append(level_str)  # 级别用[]包裹+固定宽度
    parts.append(message)  # 消息内容（支持多行）

    # 4. 打印（多行消息自动保持缩进，避免格式混乱）
    output = " ".join(parts)
    print(output)


def random_password(length: int = 12) -> str:
    chars = string.ascii_letters + string.digits + "!@#$%^&*"
    return ''.join(secrets.choice(chars) for _ in range(length))

def open_in_browser(url: str):
    webbrowser.open(url)

