from __future__ import annotations

import json
import sys
from pathlib import Path


ROOT_DIR = Path(__file__).resolve().parents[1]
OVERRIDE_PATH = ROOT_DIR / "scripts" / "data" / "plant_name_overrides.json"


OUTLIER_FIXES: dict[str, dict[str, str]] = {
    "Bougainvillea glabra": {"ja": "テリハイカダカズラ"},
    "Aglaonema Red Valentine": {"zh": "红情人广东万年青"},
    "Polystichum munitum": {"zh": "剑蕨"},
    "Cypripedium acaule": {"ja": "ピンクレディスリッパ"},
    "Baccharis pilularis": {"ja": "バッカリス・ピルラリス", "zh": "巴卡里斯皮卢拉里斯"},
    "Cardamine concatenata": {"ja": "カルダミネ・コンカテナタ", "zh": "裂叶碎米荠"},
    "Euphorbia cyparissias": {"ja": "ユーフォルビア・キパリッシアス"},
    "Claytonia perfoliata": {"zh": "矿工生菜"},
    "Centranthus ruber": {"ja": "ベニカノコソウ", "zh": "红缬草"},
    "Chamaecrista fasciculata": {"zh": "束花决明"},
    "Ericameria nauseosa": {"ja": "エリカメリア・ナウセオサ", "zh": "灰兔刷"},
    "Anacamptis pyramidalis": {"ja": "アナカンプティス・ピラミダリス", "zh": "锥花红门兰"},
    "Apocynum androsaemifolium": {"zh": "蔓生罗布麻"},
    "Viburnum acerifolium": {"ja": "メープルリーフ・ビバーナム"},
    "Mycelis muralis": {"ja": "ミケリス・ムラリス", "zh": "米凯利斯穆拉利斯"},
    "Potentilla recta": {"ja": "ポテンティラ・レクタ"},
    "Clinopodium vulgare": {"ja": "クリノポディウム・ブルガレ"},
    "Rubus trivialis": {"ja": "ルブス・トリウィアリス", "zh": "匍匐悬钩子"},
    "Holodiscus discolor": {"ja": "ホロディスクス・ディスカラー", "zh": "霍洛迪斯库斯迪斯科洛尔"},
    "Quercus virginiana": {"ja": "バージニアライブオーク"},
    "Neltuma glandulosa": {"zh": "蜜刺豆"},
    "Tipularia discolor": {"ja": "ティピュラリア・ディスコロル", "zh": "提普拉里亚迪斯科洛尔"},
    "Orchis mascula": {"ja": "オルキス・マスキュラ"},
    "Glandularia bipinnatifida": {"zh": "裂叶美女樱"},
    "Marrubium vulgare": {"ja": "マルルビウム・ブルガレ"},
    "Spinulum annotinum": {"ja": "スピヌルム・アノティヌム", "zh": "间断石松"},
    "Asplenium platyneuron": {"ja": "アスプレニウム・プラティネウロン"},
    "Symphyotrichum lateriflorum": {"zh": "侧花紫菀"},
    "Draba verna": {"zh": "德拉芭维尔纳"},
    "Boehmeria cylindrica": {"zh": "筒序苎麻"},
    "Viburnum lantanoides": {"ja": "ビバーナム・ランタノイデス", "zh": "北美荚蒾"},
    "Polypodium vulgare": {"ja": "ポリポディウム・ブルガレ"},
    "Viburnum prunifolium": {"ja": "ビバーナム・プルニフォリウム", "zh": "李叶荚蒾"},
    "Calyptocarpus vialis": {"zh": "卡利普托卡普斯维亚利斯"},
    "Acmispon glaber": {"zh": "阿克米斯彭格拉贝尔"},
    "Rabelera holostea": {"zh": "拉贝莱拉霍洛斯特亚"},
    "Eupatorium serotinum": {"zh": "泽兰"},
    "Aralia nudicaulis": {"zh": "裸茎楤木"},
    "Impatiens capensis": {"ja": "アカボシツリフネソウ", "zh": "斑点凤仙花"},
    "Claytonia virginica": {"ja": "ハルヒメソウ", "zh": "春美草"},
    "Linaria vulgaris": {"ja": "ホソバウンラン", "zh": "欧洲柳穿鱼"},
    "Cercis canadensis": {"ja": "アメリカハナズオウ"},
    "Silene latifolia": {"ja": "ヒロハノマンテマ"},
    "Cerastium fontanum": {"ja": "ミミナグサ"},
    "Rubus odoratus": {"ja": "ルブス・オドラトゥス"},
    "Artemisia californica": {"ja": "カリフォルニアヨモギ", "zh": "加州蒿"},
    "Rubus allegheniensis": {"ja": "ルブス・アレゲニエンシス"},
    "Rubus ulmifolius": {"ja": "ルブス・ウルミフォリウス"},
    "Artemisia campestris": {"ja": "アルテミシア・カンペストリス"},
    "Quercus agrifolia": {"ja": "コーストライブオーク"},
    "Quercus macrocarpa": {"ja": "バーオーク"},
    "Quercus phellos": {"ja": "ウィローオーク"},
    "Quercus stellata": {"ja": "ポストオーク"},
    "Quercus lobata": {"ja": "バレーオーク"},
    "Eupatorium serotinum": {"ja": "ユーパトリウム・セロティヌム"},
    "Geum canadense": {"ja": "ゲウム・カナデンセ"},
    "Smilax bona-nox": {"ja": "スミラックス・ボナノクス"},
    "Dicentra cucullaria": {"ja": "ディケントラ・ククラリア", "zh": "兜状荷包牡丹"},
    "Ilex verticillata": {"ja": "ウィンターベリーヒイラギ"},
    "Ilex vomitoria": {"ja": "ヤウポンホーリー"},
    "Berberis nervosa": {"ja": "ベルベリス・ネルボサ"},
    "Aesculus californica": {"ja": "カリフォルニアバックアイ"},
    "Geum rivale": {"ja": "ゲウム・リバレ"},
    "Adenostoma fasciculatum": {"ja": "シャミーズ"},
    "Cirsium horridulum": {"ja": "キルシウム・ホリドゥルム", "zh": "鬃毛蓟"},
    "Rhododendron maximum": {"ja": "グレートロドデンドロン"},
    "Pulmonaria obscura": {"ja": "プルモナリア・オブスクラ"},
    "Berberis repens": {"ja": "ベルベリス・レペンス"},
    "Mirabilis laevis": {"ja": "ウィッシュボーンブッシュ", "zh": "鸡骨紫茉莉"},
    "Scutellaria galericulata": {"ja": "マーシュスカルキャップ"},
    "Aquilegia vulgaris": {"ja": "オダマキ", "zh": "耧斗菜"},
    "Urtica gracilis": {"zh": "细长荨麻"},
    "Eriophyllum confertiflorum": {"zh": "金西洋蓍草"},
    "Toxicodendron rydbergii": {"zh": "西部毒葛"},
    "Toxicodendron radicans": {"ja": "ポイズンアイビー"},
    "Dryopteris marginalis": {"zh": "边缘鳞毛蕨"},
    "Lupinus bicolor": {"zh": "二色羽扇豆"},
    "Sphaeralcea ambigua": {"zh": "杏色球锦葵"},
    "Adelinia grandis": {"zh": "太平洋犬舌草"},
    "Amauropelta noveboracensis": {"zh": "纽约蕨"},
    "Encelia californica": {"zh": "加州脆灌木"},
    "Cardamine californica": {"zh": "加州碎米荠"},
    "Castilleja indivisa": {"ja": "テキサス・ペイントブラシ", "zh": "德州印第安画笔"},
    "Campanulastrum americanum": {"zh": "高大风铃草"},
    "Thalictrum thalictroides": {"zh": "林地唐松草"},
    "Pedicularis canadensis": {"zh": "加拿大马先蒿"},
    "Pulmonaria obscura": {"zh": "暗色肺草"},
}


def main() -> None:
    try:
        sys.stdout.reconfigure(encoding="utf-8")
    except Exception:
        pass

    payload = json.loads(OVERRIDE_PATH.read_text(encoding="utf-8"))
    updated = 0
    samples: list[dict[str, str]] = []

    for key, locales in OUTLIER_FIXES.items():
        entry = payload.setdefault(key, {})
        changed = False
        for locale_key in ("ja", "zh"):
            value = locales.get(locale_key, "").strip()
            if not value:
                continue
            source_key = f"{locale_key}_source"
            if entry.get(locale_key) != value or entry.get(source_key) != "manual_outlier_fix":
                entry[locale_key] = value
                entry[source_key] = "manual_outlier_fix"
                changed = True
        if changed:
            updated += 1
        if len(samples) < 80:
            samples.append(
                {
                    "key": key,
                    "ja": entry.get("ja", ""),
                    "zh": entry.get("zh", ""),
                }
            )

    ordered = {name: payload[name] for name in sorted(payload)}
    OVERRIDE_PATH.write_text(json.dumps(ordered, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")

    print(
        json.dumps(
            {
                "updated": updated,
                "total_keys": len(OUTLIER_FIXES),
                "sample": samples,
            },
            ensure_ascii=False,
            indent=2,
        )
    )


if __name__ == "__main__":
    main()
