from app.core.config import Settings
from app.schema.registry import build_snapshot
from app.schema.vocabulary import build_vocabulary_index
from app.core.exceptions import AmbiguousRequestError


def _vocab():
    settings = Settings(
        schema_source_path="app/schema/oremus.sql",
        schema_customizations_path="schema_customizations.json",
        app_timezone="Asia/Kolkata",
    )
    snapshot = build_snapshot(settings.schema_source_path, settings.schema_customizations_path)
    return build_vocabulary_index(snapshot)


def test_generic_payment_does_not_silently_pick_one_payment_table():
    vocab = _vocab()
    try:
        vocab.resolve_table("payment")
    except AmbiguousRequestError:
        pass
    else:
        raise AssertionError("generic payment must remain ambiguous")
    try:
        vocab.resolve_table("transaction")
    except AmbiguousRequestError:
        pass
    else:
        raise AssertionError("generic transaction must remain ambiguous")


def test_generic_account_does_not_map_to_users():
    vocab = _vocab()
    try:
        vocab.resolve_table("account")
    except AmbiguousRequestError:
        pass
    else:
        raise AssertionError("generic account must remain ambiguous")


def test_specific_payment_aliases_remain_resolvable():
    vocab = _vocab()
    assert vocab.resolve_table("customer payment").schema_name == "zb_customer_payments"
    assert vocab.resolve_table("vendor payment").schema_name == "zb_vendor_payments"


def test_journal_resolves_to_the_journal_table():
    vocab = _vocab()
    assert vocab.resolve_table("journal entry").schema_name == "zb_journals"
    assert vocab.resolve_table("journal").schema_name == "zb_journals"


def test_purchase_order_is_not_mapped_to_bills():
    vocab = _vocab()
    assert vocab.resolve_table("purchase orders") is None
