"""Examine command for detailed object inspection."""

from mudlib.commands import CommandDefinition, register
from mudlib.entity import Entity
from mudlib.player import Player
from mudlib.thing import Thing
from mudlib.zone import Zone


def _find_object_in_inventory(name: str, player: Player) -> Thing | Entity | None:
    """Find an object in player inventory by name or alias."""
    name_lower = name.lower()
    for obj in player.contents:
        # Only examine Things and Entities
        if not isinstance(obj, (Thing, Entity)):
            continue

        # Match by name
        if obj.name.lower() == name_lower:
            return obj

        # Match by alias (Things have aliases)
        if isinstance(obj, Thing) and name_lower in (a.lower() for a in obj.aliases):
            return obj

    return None


def _find_object_at_position(name: str, player: Player) -> Thing | Entity | None:
    """Find an object on the ground at player position by name or alias."""
    zone = player.location
    if zone is None or not isinstance(zone, Zone):
        return None

    name_lower = name.lower()
    for obj in zone.contents_at(player.x, player.y):
        # Only examine Things and Entities
        if not isinstance(obj, (Thing, Entity)):
            continue

        # Match by name
        if obj.name.lower() == name_lower:
            return obj

        # Match by alias (Things have aliases)
        if isinstance(obj, Thing) and name_lower in (a.lower() for a in obj.aliases):
            return obj

    return None


async def cmd_examine(player: Player, args: str) -> None:
    """Examine an object in detail."""
    if not args.strip():
        await player.send("Examine what?\r\n")
        return

    target_name = args.strip()

    # Search inventory first
    found = _find_object_in_inventory(target_name, player)

    # Then search ground
    if not found:
        found = _find_object_at_position(target_name, player)

    # Not found anywhere
    if not found:
        await player.send("You don't see that here.\r\n")
        return

    # Show description (both Thing and Entity have description)
    desc = getattr(found, "description", "")
    if desc:
        await player.send(f"{desc}\r\n")
    else:
        await player.send("You see nothing special.\r\n")


register(CommandDefinition("examine", cmd_examine, aliases=["ex"], mode="*"))
