# -*- coding: utf-8 -*-
"""BytePlus seed-2-0-pro-260328 の費用試算（稟議用・再現可能）。
前提を変えたいときは下の定数を編集して `python common/cost_estimate.py`。
料金: オンライン標準 [0,128K]階層 → 入力 $0.50/M, 出力 $3.00/M（バッチは入力$0.25/出力$1.50）。
"""

# ---- 単価（USD / 1M tokens, [0,128K]階層）----
# モデル別。online=オンライン標準, batch=バッチ推論
MODEL_PRICE = {
    "seed-2-0-pro-260328":  {"online": {"in": 0.50, "out": 3.00}, "batch": {"in": 0.25, "out": 1.50}},
    "seed-2-0-mini-260428": {"online": {"in": 0.10, "out": 0.40}, "batch": {"in": 0.05, "out": 0.20}},
    "seed-2-0-lite-260428": {"online": {"in": 0.25, "out": 2.00}, "batch": {"in": 0.125,"out": 1.00}},
}
MODEL = "seed-2-0-pro-260328"   # 既定
def PRICE_OF(model): return MODEL_PRICE[model]
USDJPY = 155.0   # ★稟議時の為替（要更新）

# ---- トークン前提（保守的＝高め）----
TOK_PER_IMAGE = 1500   # 画像1枚あたり（~768pxに縮小送信。高解像なら最大~2700）
TOK_TEXT_IN   = 500    # 指示文＋スキーマ（日本語）
TOK_OUT       = 150    # JSON出力（score/label/reason）

# ---- 方式ごとの構成 ----
TRACK_A = {"calls": 4, "imgs_per_call": 6}  # 4軸 ×（アンカー3＋フレーム3）
TRACK_B = {"calls": 5, "imgs_per_call": 1}  # 5軸 × 静止画1枚

def cost_per_video(track, mode="online", model=None):
    p = PRICE_OF(model or MODEL)[mode]
    in_tok = track["calls"] * (track["imgs_per_call"] * TOK_PER_IMAGE + TOK_TEXT_IN)
    out_tok = track["calls"] * TOK_OUT
    return in_tok/1e6 * p["in"] + out_tok/1e6 * p["out"]

def fmt(usd):
    return f"${usd:,.2f}  (¥{usd*USDJPY:,.0f})"

def scenario(n_videos, passes, mode="online"):
    a = cost_per_video(TRACK_A, mode); b = cost_per_video(TRACK_B, mode)
    per = (a + b) * n_videos * passes
    return per

# 課金対象は Track A（BytePlus VLM）のみ。Track B はOpenCVのローカル計算でAPI課金ゼロ。
def proj(n_videos, passes, mode="online", model=None):
    return cost_per_video(TRACK_A, mode, model) * n_videos * passes

if __name__ == "__main__":
    print("【課金対象は Track A（BytePlus VLM）のみ。Track B=OpenCVローカル処理で$0】")
    print(f"為替前提: 1 USD = ¥{USDJPY:.0f}（要更新）\n")
    print("=== モデル別 比較（Track Aのみ・オンライン）===")
    hdr = f"{'モデル':<22}{'1本':>14}{'本番686×3周':>18}{'稟議枠目安':>16}"
    print(hdr); print("-"*70)
    budget = {"seed-2-0-pro-260328": 200, "seed-2-0-mini-260428": 50, "seed-2-0-lite-260428": 100}
    for m in MODEL_PRICE:
        per = cost_per_video(TRACK_A, "online", m)
        full3 = proj(686, 3, "online", m)
        print(f"{m:<22}{fmt(per):>14}{fmt(full3):>18}{fmt(budget[m]):>16}")
    print("\n=== 既定(pro)の詳細 ===")
    realistic = proj(100,4) + proj(686,3)
    conservative = (proj(100,4) + proj(686,5)) * 1.3
    print(f"  現実的合計(pilot+本番3周): {fmt(realistic)} / 保守的(×1.3): {fmt(conservative)}")
    print("\n  ※miniは約5倍安いが精度は要検証。pilot100本でpro/miniを実測比較して選ぶのが推奨。")
