# -*- coding: utf-8 -*-
"""Document AI / Amazon Textract / Azure AI Document Intelligence の月額を、公式単価と架空のページ数から計算する。
使い方: python calculator.py input.json [expected.json]
  expected.json は配布した20条件の検算用。自社の値に書き換えたときは付けずに実行する（付けると期待値と一致せず exit 1 になる）。
外部パッケージ不要（Python 3.10 以上）。ネットワーク接続なし。実文書は送らない。
単価は input.json に書いた値（確認日つき）だけを使う。公式ページが変わったら input.json を書き換える。
Invoice パーサーは 1カウント＝文書10ページまでなので、documents（文書数）と pages_per_document（1文書のページ数）から
文書あたりのカウント数（10ページごとに切り上げ）を出して掛ける。
"""
import json
import sys
from pathlib import Path


def tiered(pages, tiers):
    """tiers: [[上限ページ数 or None, 1,000ページあたりの単価], ...] を順に適用する。"""
    cost = 0.0
    done = 0
    for cap, rate in tiers:
        if cap is None or pages <= cap:
            cost += (pages - done) / 1000.0 * rate
            return cost
        cost += (cap - done) / 1000.0 * rate
        done = cap
    return cost


def price(sc, rates):
    svc = sc["service"]
    feat = sc["feature"]
    pages = sc["pages"]
    r = rates[svc]
    if svc == "google_document_ai":
        if feat == "invoice_parser":
            # 1カウント＝文書10ページまで。11〜20ページの文書は2カウント
            docs = sc.get("documents", pages)
            ppd = sc.get("pages_per_document", 1)
            counts_per_doc = -(-ppd // 10)
            return round(docs * counts_per_doc * r["invoice_parser_per_count"], 2)
        return round(tiered(pages, r[feat]), 2)
    if svc == "amazon_textract_us_west_oregon":
        return round(tiered(pages, r[feat]), 2)
    if svc == "azure_document_intelligence_s0":
        return round(tiered(pages, r[feat]), 2)
    raise ValueError("unsupported service: " + svc)


def main(argv):
    src = json.loads(Path(argv[1]).read_text(encoding="utf-8"))
    rows = []
    for sc in src["scenarios"]:
        rows.append({"id": sc["id"], "cost_usd": price(sc, src["rates"])})
    out = {"checked_at": src["checked_at"], "currency": "USD", "results": rows}
    if len(argv) > 2:
        exp = json.loads(Path(argv[2]).read_text(encoding="utf-8"))["expected"]
        ok = all(a == e for a, e in zip(rows, exp)) and len(rows) == len(exp)
        out["passed"] = ok
    print(json.dumps(out, ensure_ascii=False, indent=2))
    return 0 if out.get("passed", True) else 1


if __name__ == "__main__":
    raise SystemExit(main(sys.argv))
