
import json, datetime, pathlib

HKT = datetime.timezone(datetime.timedelta(hours=8))
now_hkt = datetime.datetime.now(HKT)
run_date = now_hkt.strftime('%Y-%m-%d')

findings = [
    {
        "company": "Eastman Chemical Company",
        "funds": [],
        "severity": "MEDIUM",
        "risk_type": "信用評等（Credit Rating）",
        "summary": "Moody's 將 Eastman 展望由穩定下調為負面，原因是 2026 年營運現金流低於預期且槓桿率仍偏高。",
        "detail": (
            "Moody's 將 Eastman 信用展望由 stable 改為 negative，主要因 2026 年 OCF 弱於預期（前三季 $377M 對比去年 $468M）、"
            "槓桿偏高。Q3 2026 調整後 EPS $1.84 及收入 $2.385B 均低於一致預估（$1.94 / $2.41B）。"
            "JPMorgan 同步調降評級至 Neutral，目標價砍至 $66。公司發行 $600M 4.5% 票據並已還清餘下 $150M 定期貸款。"
            "目前 S&P 評級 BBB、Moody's Baa2 不變，但 negative outlook 代表若 OCF 持續未改善，有下調評等風險。"
        ),
        "sources": ["uk.investing.com", "eastman.com", "stocktitan.net"],
        "action": "持續追蹤 Moody's 正式評等行動；若下調至 Baa3 或 S&P 調至 BBB-，需向 Siegfried 投委會報告是否符合 WhiteList 信用底線。"
    },
    {
        "company": "Fresenius SE & Co. KGaA",
        "funds": [],
        "severity": "LOW",
        "risk_type": "治理／高層異動（Governance）",
        "summary": "Fresenius Kabi 部門 CEO 易人（Antonelli 離任、Mahl 接任，2026-11-01 生效），業務整體保持正向軌道。",
        "detail": (
            "監事會任命 Dr. Marc-Alexander Mahl 自 2026-11-01 接掌 Kabi 管理委員會，取代 Pierluigi Antonelli（因私人原因離任）。"
            "同步拆分 Nutrition 為獨立業務單位，由 Sébastien Guery 領導。CFO Sara Hennicken 合約延長至 2032 年。"
            "財務面：H1 2026 收入成長、利潤提升、槓桿持續降低，信用展望正向。Q3 結果明日（11-04）發布。"
        ),
        "sources": ["marketscreener.com"],
        "action": "11-04 Q3 結果發布後確認業績是否符合預期；留意 Kabi 新任 CEO 政策方向。低風險，維持觀察。"
    },
    {
        "company": "Heidelberg Materials AG",
        "funds": [],
        "severity": "MEDIUM",
        "risk_type": "現金流／財務（M&A 槓桿）",
        "summary": "2026 年多筆大型收購（澳洲 Maas Group ~$1.2B、NCC 業務約 700M EUR 等）推升槓桿風險，同時能源成本升高導致全年展望下調。",
        "detail": (
            "Heidelberg Materials 2026 年積極擴張：① 澳洲 Maas Group 收購約 $1.2B；"
            "② 與 CRH 聯合收購 NCC 工業業務（骨材+瀝青）約 700M EUR；③ 美國 AmeriTex；"
            "④ 土耳其 Akcansa 多數控股；⑤ 秘魯 Cementos Inka。"
            "能源成本偏高壓縮利潤，全年 EBITDA 展望因此下調。Q3 結果明日（11-04）發布，可能引發信評機構更新槓桿評估。"
        ),
        "sources": ["reuters.com", "marketscreener.com", "morningstar.com"],
        "action": "11-04 Q3 結果後確認淨負債比率及收購完成進度；若淨債務/EBITDA 升至 3x 以上，應提報是否影響 WhiteList 信用評分標準。"
    },
    {
        "company": "Ingersoll Rand Inc.",
        "funds": [],
        "severity": "LOW",
        "risk_type": "財務狀況良好（No Material Risk）",
        "summary": "Q3 2026 業績強勁，訂單年增 21%，槓桿僅 1.6x，ILC Dover 訴訟已基本化解，整體無重大信用風險。",
        "detail": (
            "Q3 2026：收入 $2.065B（+6% YoY）、調整後 EBITDA $584M（+7%）、自由現金流 $623M。"
            "訂單 $2.345B 年增 21%，流動性 $3.9B，槓桿 1.6x 淨負債/EBITDA，較去年改善。"
            "ILC Dover 保險理賠 $425M 已確認，Q4 剩餘款項預計到位。M&A 小型可控。"
        ),
        "sources": ["investors.irco.com", "businesswire.com"],
        "action": "維持定期觀察，無需立即行動。下次巡查確認 ILC Dover 剩餘款項是否如期在 Q4 到位。"
    },
    {
        "company": "International Flavors & Fragrances Inc.",
        "funds": [],
        "severity": "HIGH",
        "risk_type": "M&A／資產出售（Portfolio Transformation）",
        "summary": "IFF 執行大規模資產剝離：食品成分業務以 $4.3B 出售予 CVC，另出售大豆業務及草本業務，公司實體與收入規模顯著縮小。",
        "detail": (
            "IFF 2026 年宣布/完成三筆重大資產出售："
            "① Food Ingredients 業務出售予 CVC Capital Partners，企業價值約 $4.3B（~10x EBITDA）；"
            "② 大豆壓榨、濃縮物及卵磷脂業務出售予 Bunge；"
            "③ 草本萃取、維生素礦物質及食品增強業務出售予 SuanNutra（Carbyne Equity Partners 旗下）。"
            "出售後 IFF 聚焦 Scent/Taste 及 Health & Biosciences，收入規模大幅縮小。"
            "Q2 EPS $0.82、收入 $1.95B 遠低於一致預估（$1.09 / $2.68B）。"
            "計劃以超過 $1B 剝離款項還債，啟動 $2.5B 股票回購計劃。Q3 結果今日（11-03）盤後發布。"
        ),
        "sources": ["ir.iff.com", "fiscal.ai", "simplywall.st"],
        "action": (
            "Entity/業務實體重大變更：需確認 IFF 作為 WhiteList 候選的信用評估基礎是否需要更新。"
            "具體行動：① 確認剝離後主體名稱及組織架構是否影響作業協議對手方身分；"
            "② 今日 Q3 結果發布後確認信評機構（S&P BBB / Moody's Baa3）是否調整評等或展望；"
            "③ 若評等機構調整，需提報 Siegfried 投委會。"
        )
    },
]

data_dir = pathlib.Path('/root/.openclaw-cooper/workspace/whitelist_monitor/data')
data_dir.mkdir(parents=True, exist_ok=True)

high = [f for f in findings if f["severity"] == "HIGH"]
medium = [f for f in findings if f["severity"] == "MEDIUM"]
low = [f for f in findings if f["severity"] == "LOW"]

day_report = {
    "run_date": run_date,
    "weekday": "Tuesday",
    "batch_range": "6-10",
    "whitelist_total": 22,
    "batch_size": 5,
    "high_count": len(high),
    "medium_count": len(medium),
    "low_count": len(low),
    "monthly_flag": len(high) > 0,
    "findings": findings,
    "case3_summary": [
        f"[{f['severity']}] {f['company']}（New 候選）— {f['risk_type']}：{f['summary'][:60]}"
        for f in findings if f["severity"] in ["HIGH", "MEDIUM"]
    ]
}

(data_dir / "wl_monitor_latest.json").write_text(json.dumps(day_report, ensure_ascii=False, indent=2))
(data_dir / f"wl_monitor_{run_date}.json").write_text(json.dumps(day_report, ensure_ascii=False, indent=2))
print(f"JSON saved: wl_monitor_latest.json + wl_monitor_{run_date}.json")
print(f"HIGH: {len(high)}, MEDIUM: {len(medium)}, LOW: {len(low)}")
print("case3_summary:")
for s in day_report["case3_summary"]:
    print(f"  {s}")
