"""5.10 买卡自托管多久回本。读 scenarios.py 里的场景，算每年替代掉的云端费用、电费和简单回本期。

用法：
    python3 payback.py              # 算 scenarios.py 里的全部场景，加上你的 MY_SETUP
    python3 payback.py --load 0.25  # 把所有 API 场景的负载率改成 25%，看满载假设有多重要
只用标准库，Python 3.8+ 都能跑。
"""
import argparse

from scenarios import MY_SETUP, SCENARIOS

HOURS_PER_YEAR = 24 * 365


def yearly(s, load):
    """返回 (每年替代掉的云端费用, 每年电费, 说明)。"""
    if s['compare'] == 'api':
        hours = HOURS_PER_YEAR * load
        out_m = s['output_tok_per_s'] * 3600 * hours / 1e6                     # 每年输出多少百万 token
        h = s['cache_hit_rate']
        in_price = h * s['price_input_cached'] + (1 - h) * s['price_input']      # 平均每百万输入 token 的价格
        per_m_out = s['input_per_output'] * in_price + s['price_output']         # 每产出百万输出 token 对应的 API 费用
        value = out_m * per_m_out
        note = f'负载 {load:.0%}，年产出 {out_m:,.0f} M 输出 token，每 M 输出对应 API ${per_m_out:,.2f}'
    elif s['compare'] == 'subscription':
        hours = HOURS_PER_YEAR          # 席位数是按整机满载产能折算的，--load 不作用于这类场景
        value = s['seats'] * s['usd_per_seat_year']
        note = f'{s["seats"]} 个席位 × ${s["usd_per_seat_year"]:,}/年'
    elif s['compare'] == 'my_bill':
        hours = s.get('hours_per_day', 24) * 365
        value = s['monthly_api_bill_usd'] * 12
        note = f'每月账单 ${s["monthly_api_bill_usd"]:,} × 12，机器每天开 {s.get("hours_per_day", 24)} 小时'
    else:
        raise ValueError(s['compare'])
    power = s['power_kw'] * s.get('pue', 1.0) * hours * s['usd_per_kwh']
    return value, power, note


def payback(hw, net):
    if net <= 0:
        return '回不了本（每年省下的钱还不够电费）'
    lo, hi = (hw, hw) if isinstance(hw, (int, float)) else hw
    y = (lo / net, hi / net)
    fmt = lambda v: f'{v:.2f} 年（{v * 12:.1f} 个月）'
    return fmt(y[0]) if lo == hi else f'{y[0]:.2f}–{y[1]:.2f} 年（{y[0] * 12:.1f}–{y[1] * 12:.1f} 个月）'


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument('--load', type=float, default=1.0, help='API 场景的负载率：一年里有多大比例的时间满载在跑（默认 1.0，即 24 小时满载）')
    args = ap.parse_args()
    for s in SCENARIOS + [MY_SETUP]:
        value, power, note = yearly(s, args.load)
        hw = s['hardware_usd']
        hw_txt = f'${hw:,}' if isinstance(hw, (int, float)) else f'${hw[0]:,}–${hw[1]:,}'
        print(f'\n## {s["name"]}')
        print(f'- 硬件 {hw_txt}；{note}')
        print(f'- 每年替代的云端费用 ${value:,.2f}，电费 ${power:,.2f}，净省 ${value - power:,.2f}')
        print(f'- 简单回本期：{payback(hw, value - power)}')
    print('\n只算了硬件和电费。机柜、网络、运维人力、停机冗余、硬件折旧和残值都没算，真实回本期只会更长。')


if __name__ == '__main__':
    main()
