"""客户端复权示例：输入 API adjust=none 的一行；只转换 OHLC。

前复权 anchor_factor 必须由调用者从同代码、同周期选定基准日期取得，
所有分页/分块共用同一基准，不得每页取末行。None/非正/非有限因子不填 1。
本示例不推断成交量单位、不补齐缺失行、不保证因子时点可得性。
"""
from decimal import Decimal, InvalidOperation, localcontext


def _positive(value):
    try:
        number = Decimal(str(value))
        return number if number.is_finite() and number > 0 else None
    except (InvalidOperation, ValueError):
        return None


def adjust_bar(row, mode="none", *, anchor_factor=None):
    """返回新字典；输入必须是原始行情，禁止将已复权行重复计算。"""
    if mode not in ("none", "qfq", "hfq"):
        raise ValueError("mode must be none, qfq or hfq")
    if row.get("adjustmentStatus") not in (None, "raw"):
        raise ValueError("expected raw API data: request adjust=none")
    result = dict(row)
    if mode == "none":
        result["adjustmentStatus"] = "raw"
        return result
    factor = _positive(row.get("adjFactor"))
    anchor = _positive(anchor_factor) if mode == "qfq" else None
    status = ("missing_factor" if factor is None else
              "missing_anchor" if mode == "qfq" and anchor is None else "adjusted")
    result.update(rawClose=row.get("close"), adjustmentStatus=status,
                  preClose=None, change=None, pctChg=None)
    with localcontext() as context:
        context.prec = 34  # 与 API DECIMAL128 精度一致；无法恢复源 DOUBLE 已损失的精度
        multiplier = factor if mode == "hfq" else (
            factor / anchor if status == "adjusted" else None)
        for field in ("open", "high", "low", "close"):
            value = row.get(field)
            result[field] = (Decimal(str(value)) * multiplier
                             if status == "adjusted" and value is not None else None)
    return result
