from __future__ import annotations

import json
from pathlib import Path

from ac_coach_mcp.content import CarInfo, ContentLibrary, TrackLayoutInfo
from ac_coach_mcp.paths import EnvironmentPaths
from ac_coach_mcp.training import materialize_training_setup, recommend_training_curriculum


def test_recommend_training_curriculum_prefers_repeatable_learning_combos() -> None:
    library = ContentLibrary(
        cars={
            "abarth500": CarInfo(
                folder_name="abarth500",
                name="Abarth 500 EsseEsse",
                brand="Abarth",
                tags=["fwd", "manual", "street"],
                car_class="street",
                drive_layout="fwd",
                transmission="manual",
                bhp=160.0,
                torque_nm=230.0,
                weight_kg=1025.0,
                top_speed_kmh=211.0,
                power_to_weight_kg_per_hp=6.4,
                official=True,
                setup_seed_path=Path("seed.ini"),
                setup_count=1,
            ),
            "ks_mazda_rx7_spirit_r": CarInfo(
                folder_name="ks_mazda_rx7_spirit_r",
                name="Mazda RX-7 Spirit R",
                brand="Mazda",
                tags=["rwd", "manual", "street"],
                car_class="street",
                drive_layout="rwd",
                transmission="manual",
                bhp=276.0,
                torque_nm=314.0,
                weight_kg=1270.0,
                top_speed_kmh=256.0,
                power_to_weight_kg_per_hp=4.6,
                official=True,
                setup_seed_path=Path("seed.ini"),
                setup_count=1,
            ),
            "lotus_evora_gtc": CarInfo(
                folder_name="lotus_evora_gtc",
                name="Lotus Evora GTC",
                brand="Lotus",
                tags=["rwd", "race"],
                car_class="race",
                drive_layout="rwd",
                transmission="semiautomatic",
                bhp=450.0,
                torque_nm=460.0,
                weight_kg=1205.0,
                top_speed_kmh=None,
                power_to_weight_kg_per_hp=2.68,
                official=True,
                setup_seed_path=Path("seed.ini"),
                setup_count=1,
            ),
        },
        tracks={
            "ks_vallelunga/club_circuit": TrackLayoutInfo(
                track="ks_vallelunga",
                layout="club_circuit",
                layout_id="ks_vallelunga/club_circuit",
                name="Vallelunga - Club",
                length_m=1746.0,
                tags=["circuit", "original"],
                run="clockwise",
            ),
            "ks_brands_hatch/indy": TrackLayoutInfo(
                track="ks_brands_hatch",
                layout="indy",
                layout_id="ks_brands_hatch/indy",
                name="Brands Hatch - Indy",
                length_m=1929.0,
                tags=["circuit", "original"],
                run="clockwise",
            ),
            "ks_red_bull_ring/layout_national": TrackLayoutInfo(
                track="ks_red_bull_ring",
                layout="layout_national",
                layout_id="ks_red_bull_ring/layout_national",
                name="Red Bull Ring National",
                length_m=2336.0,
                tags=["circuit", "original"],
                run="clockwise",
            ),
        },
        setup_seeds={},
    )

    recommendation = recommend_training_curriculum(library)
    stages = {item["stage"]: item for item in recommendation["curriculum"]}
    assert stages["smooth_inputs"]["car_model"] == "abarth500"
    assert stages["rwd_momentum"]["car_model"] == "ks_mazda_rx7_spirit_r"
    assert stages["race_braking"]["car_model"] == "lotus_evora_gtc"


def test_materialize_training_setup_uses_existing_seed(tmp_path: Path) -> None:
    assetto_root = tmp_path / "assettocorsa"
    (assetto_root / "content" / "cars" / "abarth500" / "ui").mkdir(parents=True)
    (assetto_root / "content" / "tracks" / "magione" / "ui").mkdir(parents=True)
    (assetto_root / "content" / "cars" / "abarth500" / "ui" / "ui_car.json").write_text(
        json.dumps(
            {
                "name": "Abarth 500",
                "brand": "Abarth",
                "tags": ["fwd", "manual", "street"],
                "class": "street",
                "specs": {"bhp": "160bhp", "weight": "1025kg"},
            }
        ),
        encoding="utf-8",
    )
    (assetto_root / "content" / "tracks" / "magione" / "ui" / "ui_track.json").write_text(
        json.dumps({"name": "Magione", "length": "2507", "tags": ["circuit"]}),
        encoding="utf-8",
    )

    documents_root = tmp_path / "Documents" / "Assetto Corsa"
    seed_dir = documents_root / "setups" / "abarth500" / "generic"
    seed_dir.mkdir(parents=True)
    seed_path = seed_dir / "last.ini"
    seed_path.write_text(
        "[CAR]\nMODEL=abarth500\n[FUEL]\nVALUE=30\n[ABS]\nVALUE=2\n[TRACTION_CONTROL]\nVALUE=3\n",
        encoding="utf-8",
    )

    paths = EnvironmentPaths(
        project_root=tmp_path,
        assetto_root=assetto_root,
        documents_root=documents_root,
        cfg_root=documents_root / "cfg",
        logs_root=documents_root / "logs",
        out_root=documents_root / "out",
        aim_root=documents_root / "aim",
        content_manager_root=None,
        moza_pit_house_root=None,
        moza_telemetry_root=None,
        moza_pending_root=None,
        codex_config=tmp_path / ".codex" / "config.toml",
        sessions_root=tmp_path / "data" / "sessions",
        runtime_root=tmp_path / "data" / "runtime",
        plans_root=tmp_path / "data" / "plans",
    )

    result = materialize_training_setup(
        paths,
        car_model="abarth500",
        track=None,
        track_layout=None,
        profile_id="discipline_baseline",
        setup_name="training.ini",
    )
    output = Path(result["output_path"]).read_text(encoding="utf-8")
    assert "VALUE=12" in output
    assert "VALUE=1" in output
