from __future__ import annotations
from typing import TypeAlias, Dict, Tuple, Optional
import importlib
import pathlib
import inspect

from .types import agent_registry
from ..setup_logging import setup_logging
from .. import defines
from .base import Agent

logger = setup_logging(defines.logging_level)

__all__ = ["AnyAgent", "Agent", "agent_registry", "class_registry"]

# Type alias for Agent or any subclass
AnyAgent: TypeAlias = Agent  # BaseModel covers Agent and subclasses

class_registry: Dict[str, Tuple[str, str]] = (
    {}
)  # Maps class_name to (module_name, class_name)

package_dir = pathlib.Path(__file__).parent
package_name = __name__

for path in package_dir.glob("*.py"):
    if path.name in ("__init__.py", "base.py") or path.name.startswith("_"):
        continue

    module_name = path.stem
    full_module_name = f"{package_name}.{module_name}"

    try:
        module = importlib.import_module(full_module_name)

        # Find all Agent subclasses in the module
        for name, obj in inspect.getmembers(module, inspect.isclass):
            if (
                issubclass(obj, AnyAgent)
                and obj is not AnyAgent
                and obj is not Agent
                and name not in class_registry
            ):
                class_registry[name] = (full_module_name, name)
                globals()[name] = obj
                logger.info(f"Adding agent: {name}")
                __all__.append(name)  # type: ignore
    except ImportError as e:
        logger.error(f"Error importing {full_module_name}: {e}")
        raise e
    except Exception as e:
        logger.error(f"Error processing {full_module_name}: {e}")
        raise e
