#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Tests for tools/character_snapshotter.py
Verifies schema v1 validity, abstract skill roles (Builder vs Finisher),
JSON serialization, and Markdown evolution journal generation.
"""

import json
import pytest
from pathlib import Path
from tools.character_snapshotter import (
    build_character_snapshot,
    save_snapshot,
    update_evolution_journal,
    SNAPSHOTS_DIR,
    EVOLUTION_MD
)


def test_character_snapshot_schema_v1():
    snapshot = build_character_snapshot(
        character_name="TEST_HERO",
        level=92,
        class_name="Monk",
        ascendancy="Martial Artist",
        league="Forbidden Rites",
        cur_es=5200,
        max_es=5200,
        cur_ward=300,
        cur_mana=900,
        combo_builder_gem="MonkTempestFlurry",
        finisher_gem="MonkTempestBell"
    )

    # 1. Root structure
    assert snapshot["schema_version"] == "autopoe2.character_snapshot/v1"
    assert "timestamp_local" in snapshot
    assert "timestamp_utc" in snapshot
    assert "character" in snapshot
    assert "vitals" in snapshot
    assert "skill_loadout" in snapshot
    assert "keystones_and_ascendancy" in snapshot
    assert "equipped_weapon" in snapshot
    assert "evolution_context" in snapshot

    # 2. Character details
    char = snapshot["character"]
    assert char["name"] == "TEST_HERO"
    assert char["level"] == 92
    assert char["class"] == "Monk"
    assert char["defense_type"] == "Chaos Inoculation (CI)"
    assert char["life_invariant"] == "HP 1/1 (Chaos Immune)"

    # 3. Vitals
    vitals = snapshot["vitals"]
    assert vitals["life_current"] == 1
    assert vitals["life_max"] == 1
    assert vitals["energy_shield_current"] == 5200
    assert vitals["energy_shield_max"] == 5200

    # 4. Abstract skill roles
    skills = snapshot["skill_loadout"]
    assert skills["slot_Q"]["role"] == "COMBO_BUILDER"
    assert skills["slot_Q"]["current_gem"] == "MonkTempestFlurry"
    assert skills["slot_R"]["role"] == "COMBO_FINISHER"
    assert skills["slot_R"]["current_gem"] == "MonkTempestBell"
    assert skills["slot_RMB"]["role"] == "SUSTAINED_AOE_BUFF"
    assert skills["slot_MMB"]["role"] == "GAP_CLOSER_DEBUFF"
    assert skills["slot_T"]["role"] == "PRE_BUFF_INITIATION"
    assert skills["slot_LMB"]["role"] == "PRIMARY_CLEAR"
    assert skills["slot_SPACE"]["role"] == "MOBILITY_IFRAME"
    assert skills["slot_F"]["role"] == "SKILL_8"


def test_save_snapshot_and_evolution_journal(tmp_path, monkeypatch):
    test_snapshots_dir = tmp_path / "snapshots"
    test_evolution_md = tmp_path / "CHARACTER_EVOLUTION.md"

    import tools.character_snapshotter as cs
    monkeypatch.setattr(cs, "SNAPSHOTS_DIR", test_snapshots_dir)
    monkeypatch.setattr(cs, "EVOLUTION_MD", test_evolution_md)

    snapshot = build_character_snapshot(
        character_name="BEONGUSI",
        level=90,
        combo_builder_gem="MonkTempestFlurry",
        finisher_gem="MonkTempestBell"
    )

    # Test JSON save
    saved_file = cs.save_snapshot(snapshot)
    assert saved_file.exists()
    assert saved_file.suffix == ".json"

    with open(saved_file, "r", encoding="utf-8") as f:
        loaded = json.load(f)
    assert loaded["character"]["name"] == "BEONGUSI"
    assert loaded["skill_loadout"]["slot_Q"]["current_gem"] == "MonkTempestFlurry"

    # Test Markdown journal update
    cs.update_evolution_journal(snapshot)
    assert test_evolution_md.exists()

    with open(test_evolution_md, "r", encoding="utf-8") as f:
        md_text = f.read()

    assert "NHẬT KÝ TIẾN HÓA & NÂNG CẤP NHÂN VẬT" in md_text
    assert "BEONGUSI" in md_text
    assert "COMBO_BUILDER" in md_text
    assert "MonkTempestFlurry" in md_text
    assert "MonkTempestBell" in md_text
