"""Базовые тесты моделей и структуры проекта."""

import pytest

from vmk_data_mcp.models import (
    GetListingInput,
    ListingResult,
    MetadataFilters,
    PaginationParams,
    SearchMetadataInput,
    SearchResult,
    SearchSimilarInput,
)


def test_pagination_defaults():
    p = PaginationParams()
    assert p.limit == 20
    assert p.offset == 0


def test_pagination_bounds():
    with pytest.raises(ValueError):
        PaginationParams(limit=0)
    with pytest.raises(ValueError):
        PaginationParams(limit=101)
    with pytest.raises(ValueError):
        PaginationParams(offset=-1)


def test_metadata_filters_empty():
    f = MetadataFilters()
    assert f.deal_type is None
    assert f.city is None


def test_search_similar_input():
    inp = SearchSimilarInput(query="двокімнатна квартира київ")
    assert inp.query == "двокімнатна квартира київ"
    assert inp.pagination.limit == 20
    # min_similarity зашит внутри tools.py через config (всегда 0.7)
    assert not hasattr(inp, "min_similarity")


def test_search_metadata_input_defaults():
    inp = SearchMetadataInput(query="центр міста")
    assert inp.query == "центр міста"
    assert inp.sort_by == "relevance"
    assert inp.pagination.limit == 20


def test_search_metadata_sort_by_validation():
    # Допустимое значение
    inp = SearchMetadataInput(query="test", sort_by="price_asc")
    assert inp.sort_by == "price_asc"
    # Недопустимое значение должно вызывать ошибку
    with pytest.raises(ValueError):
        SearchMetadataInput(query="test", sort_by="invalid_sort")


def test_get_listing_input():
    inp = GetListingInput(listing_id=42)
    assert inp.listing_id == 42


def test_listing_result_serializes():
    listing = ListingResult(id=1, title="Test")
    data = listing.model_dump()
    assert data["id"] == 1
    assert data["title"] == "Test"


def test_search_result_serializes():
    result = SearchResult(total=5, limit=10, offset=0, listings=[])
    data = result.model_dump()
    assert data["total"] == 5


def test_descriptions_contain_hints():
    """Проверяем, что Field descriptions содержат подсказки для агента."""
    schema = SearchSimilarInput.model_json_schema()
    query_desc = schema["properties"]["query"]["description"]
    assert "✓ Хорошо" in query_desc
    assert "✗ Плохо" in query_desc

    filter_schema = MetadataFilters.model_json_schema()
    city_desc = filter_schema["properties"]["city"]["description"]
    assert "ILIKE" in city_desc
    assert "Київ" in city_desc


def test_listing_result_scores_documented():
    """similarity_score и rank_score содержат описания."""
    listing = ListingResult(id=1, title="Test")
    # Просто проверяем что модель создаётся и сериализуется
    assert listing.similarity_score is None
    assert listing.rank_score is None


def test_nested_schema_generation():
    """Проверяем, что JSON-схема генерирует вложенные $defs для Filters и Pagination."""
    schema = SearchSimilarInput.model_json_schema()
    assert "$defs" in schema
    assert "MetadataFilters" in schema["$defs"]
    assert "PaginationParams" in schema["$defs"]
