"""Instance identity: generation, persistence, rename-by-edit."""

import json

import pytest

from navi.identity import (
    InstanceIdentity,
    ensure_identity,
    generate_name,
    load_identity,
)


def test_generated_name_is_adjective_animal():
    for _ in range(50):
        name = generate_name()
        assert "-" in name
        adj, animal = name.split("-", 1)
        assert adj.isalpha() and animal.isalpha()
        assert adj == adj.lower()


def test_generated_names_vary():
    names = {generate_name() for _ in range(80)}
    assert len(names) > 1


def test_ensure_creates_file_and_is_stable(tmp_path):
    path = tmp_path / "instance.json"
    first = ensure_identity(path)
    assert path.exists()
    second = load_identity(path)
    assert first.name == second.name
    assert first.instance_id == second.instance_id
    # idempotent: ensure on an existing file never regenerates
    third = ensure_identity(path)
    assert third.instance_id == first.instance_id


def test_rename_by_editing_file(tmp_path):
    path = tmp_path / "instance.json"
    ensure_identity(path)
    data = json.loads(path.read_text())
    data["name"] = "renamed-by-hand"
    path.write_text(json.dumps(data))
    assert load_identity(path).name == "renamed-by-hand"


def test_load_missing_file_raises(tmp_path):
    with pytest.raises(Exception):
        load_identity(tmp_path / "absent.json")


def test_identity_dataclass_fields():
    ident = InstanceIdentity(name="quiet-otter", instance_id="uuid-x", created_at="t")
    assert ident.name == "quiet-otter"