import pytest
from flexoentity import Domain, DomainManager, DuplicateDomainError


# ---------------------------------------------------------------
# Setup/Teardown (clear DomainManager between tests)
# ---------------------------------------------------------------


@pytest.fixture(autouse=True)
def clear_domain_manager(sample_domain_manager):
    sample_domain_manager.clear()


# ---------------------------------------------------------------
# Domain creation + registration
# ---------------------------------------------------------------
def test_domain_registration(sample_domain_manager, sample_domain):

    sample_domain_manager.add(sample_domain)
    # Manager must know it now
    assert sample_domain_manager.get_by_domain_id("PY_ARITHM") is sample_domain


# ---------------------------------------------------------------
# Uniqueness: registering the same code twice must fail
# ---------------------------------------------------------------
def test_domain_uniqueness_enforced(sample_domain, sample_domain_manager):

    sample_domain_manager.add(sample_domain)
    with pytest.raises(DuplicateDomainError):
        sample_domain_manager.add(sample_domain)


# ---------------------------------------------------------------
# Lookup by FlexOID
# ---------------------------------------------------------------
def test_lookup_by_oid(sample_domain, sample_domain_manager):
    sample_domain_manager.add(sample_domain)
    found = sample_domain_manager.get_by_domain_id(sample_domain.domain_id)
    assert found is sample_domain

# ---------------------------------------------------------------
# JSON roundtrip should preserve identity and not regenerate FlexOID
# ---------------------------------------------------------------
def test_domain_json_roundtrip(sample_domain):
    sample_data = sample_domain.to_dict()
    loaded = Domain.from_dict(sample_data)

    # Same exact instance
    assert loaded == sample_domain

    # Same FlexOID
    assert str(loaded.flexo_id) == str(sample_domain.flexo_id)

