"""
genesis_types.manifests — Pydantic models for Genesis agent and capability manifests.

PURPOSE:
    Defines the canonical schemas for:
    - AgentManifest: Describes a Genesis agent (capabilities, model, context)
    - CapabilityManifest: The current runtime capability state of Genesis OS
    - MCPServerManifest: A connected MCP server and its tools
    - ModelSpec: A specific LLM model's specs and limits

    These manifests implement RULE 10 (Capability-First Protocol) from
    GLOBAL_GENESIS_RULES.md — agents MUST audit their capabilities before
    any mission.

CAPABILITY MANIFEST FILE:
    Written to: /mnt/e/genesis-system/data/context_state/capability_manifest.json
    Updated by: .claude/hooks/capability_audit.py at session start
    Read by: All Genesis agents at startup

RELATED FILES:
    /mnt/e/genesis-system/KNOWLEDGE_GRAPH/entities/genesis_capability_state.jsonl
    /mnt/e/genesis-system/.claude/hooks/capability_audit.py
    /mnt/e/genesis-system/data/context_state/capability_manifest.json

TODO:
    - Implement AgentManifest Pydantic model
    - Implement CapabilityManifest Pydantic model
    - Implement MCPServerManifest Pydantic model
    - Implement ModelSpec Pydantic model
    - Add load_capability_manifest() helper function
    - Write tests for manifest loading + validation
    - Write tests for backward compatibility (older manifest versions)
"""

from __future__ import annotations

from datetime import datetime
from typing import Any

# TODO: from pydantic import BaseModel, Field


# ---------------------------------------------------------------------------
# TODO: Pydantic models
# ---------------------------------------------------------------------------

# class ModelSpec(BaseModel):
#     """Specification for a single LLM model."""
#     model_id: str
#     provider: str  # "anthropic" | "google" | "openrouter"
#     context_limit_tokens: int
#     output_limit_tokens: int
#     supports_thinking: bool
#     supports_vision: bool
#     supports_function_calling: bool
#     cost_per_mtok_input_usd: float
#     cost_per_mtok_output_usd: float
#     latency_class: str  # "realtime" | "fast" | "standard" | "slow"
#
# class MCPServerManifest(BaseModel):
#     """A connected MCP server and its exposed tools."""
#     server_name: str
#     transport: str  # "stdio" | "http" | "websocket"
#     tools: list[str]
#     tool_count: int
#     status: str  # "connected" | "degraded" | "disconnected"
#     last_ping: str | None
#
# class AgentManifest(BaseModel):
#     """Describes a specific Genesis agent instance."""
#     agent_id: str
#     agent_class: str  # "orchestrator" | "builder" | "researcher" | "qa"
#     model: ModelSpec
#     mcp_servers: list[MCPServerManifest]
#     context_tokens_used: int
#     context_tokens_limit: int
#     context_state: str  # "healthy" | "warming" | "caution" | "critical"
#     spawned_at: str
#     session_id: str
#
# class CapabilityManifest(BaseModel):
#     """Full runtime capability state of Genesis OS."""
#     version: str
#     generated_at: str
#     session_id: str
#     primary_model: ModelSpec
#     available_models: list[ModelSpec]
#     mcp_servers: list[MCPServerManifest]
#     beta_features: list[str]  # e.g. ["1m_context", "computer_use"]
#     agent_teams_enabled: bool
#     total_mcp_tools: int
#     genesis_env: str  # "development" | "staging" | "production"


# def load_capability_manifest(path: str | None = None) -> "CapabilityManifest":
#     """
#     TODO: Load the current capability manifest from disk.
#
#     Args:
#         path: Override manifest path (default: data/context_state/capability_manifest.json)
#
#     Returns:
#         CapabilityManifest instance
#
#     Raises:
#         FileNotFoundError: If manifest file doesn't exist
#         ValidationError: If manifest is malformed
#     """
#     raise NotImplementedError("TODO: load_capability_manifest()")
