"""
AKShare 金融数据脚本 - 共享工具模块

提供股票代码标准化、JSON输出、AKShare可用性检测等通用功能
"""

import sys
import json
import re
import os

# 抑制 tqdm 进度条输出到 stderr，避免污染 stdout 的 JSON
os.environ['TQDM_DISABLE'] = '1'


def normalize_code(code: str) -> str:
    """
    标准化股票代码
    A股: 6位纯数字 (如 600519)
    港股: 5位纯数字 (如 03888)
    支持: 600519, sh600519, sz000001, SH600519, 600519.SS, 03888 等
    """
    # 去除前后空白
    code = code.strip()
    # 去除常见前缀 sh/sz/SH/SZ (仅A股)
    code = re.sub(r'^(sh|sz|SH|SZ)', '', code)
    # 去除港股前缀 hk/HK
    code = re.sub(r'^(hk|HK)', '', code)
    # 去除常见后缀 .SS/.SZ/.HK
    code = re.sub(r'\.(SS|SZ|ss|sz|HK|hk)$', '', code)
    return code


def get_market_prefix(code: str) -> str:
    """
    根据股票代码判断市场前缀
    6xxxxx / 688xxx -> sh (上海)
    0xxxxx / 3xxxxx -> sz (深圳)
    """
    code = normalize_code(code)
    if code.startswith('6') or code.startswith('688'):
        return 'sh'
    elif code.startswith('0') or code.startswith('3'):
        return 'sz'
    return 'sh'  # 默认上海


def output_json(data: dict) -> None:
    """输出成功JSON到stdout"""
    print(json.dumps({"success": True, "data": data}, ensure_ascii=False))


def output_error(msg: str) -> None:
    """输出错误JSON到stdout"""
    print(json.dumps({"success": False, "error": msg}, ensure_ascii=False))


def check_akshare() -> str | None:
    """
    检测AKShare是否可用
    返回 None 表示可用，否则返回错误信息
    """
    try:
        import akshare
        return None
    except ImportError:
        return "AKShare 未安装，请运行: pip install akshare"


def format_large_number(num) -> str:
    """格式化大数字为易读格式"""
    if num is None:
        return "N/A"
    try:
        num = float(num)
        if abs(num) >= 1e12:
            return f"{num / 1e12:.2f}万亿"
        elif abs(num) >= 1e8:
            return f"{num / 1e8:.2f}亿"
        elif abs(num) >= 1e4:
            return f"{num / 1e4:.2f}万"
        else:
            return f"{num:.2f}"
    except (ValueError, TypeError):
        return str(num)


def safe_float(val, default=None) -> float | None:
    """安全转换为浮点数"""
    if val is None or val == '' or val == '-':
        return default
    try:
        return float(val)
    except (ValueError, TypeError):
        return default


def is_hk_code(code: str) -> bool:
    """
    判断是否为港股代码（5位数字）
    港股代码如: 03888(金山软件), 00700(腾讯), 09988(阿里)
    A股代码为6位数字: 600519(茅台), 000001(平安)
    """
    code = code.strip()
    return len(code) == 5 and code.isdigit()
