import json
import random
from functools import lru_cache
from pathlib import Path

DICTIONARY_PATH = (
    Path(__file__).resolve().parents[1] / "seeds" / "data" / "name_dictionary.json"
)


@lru_cache(maxsize=1)
def _load_dictionary() -> dict[str, list[str]]:
    if not DICTIONARY_PATH.exists():
        return {}
    with open(DICTIONARY_PATH) as f:
        return json.load(f)


def get_naming_categories() -> list[str]:
    """Return sorted list of available naming category names."""
    return sorted(_load_dictionary().keys())


def get_words_for_category(category: str) -> list[str]:
    """Return the word list for a category, or empty list if not found."""
    return _load_dictionary().get(category, [])


def suggest_names(
    category: str,
    used_names: set[str],
    count: int = 10,
) -> list[str]:
    """Pick random name suggestions from a category, excluding used names.

    Returns up to `count` names. If the category is nearly exhausted,
    returns fewer.
    """
    words = get_words_for_category(category)
    if not words:
        return []

    available = [w for w in words if w not in used_names]
    if not available:
        return []

    return random.sample(available, min(count, len(available)))
