"""
Lab 5.9: Set Up Agent Observability

Trace every tool call + LLM completion to a local SQLite database.
"""

import sqlite3
import json
from datetime import datetime, timezone
from typing import Any


# TODO 1: Define the database schema
DB_SCHEMA = """
CREATE TABLE IF NOT EXISTS tool_calls (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    session_id TEXT NOT NULL,
    turn_number INTEGER NOT NULL,
    tool_name TEXT NOT NULL,
    tool_params TEXT NOT NULL,
    tool_result TEXT,
    duration_ms INTEGER,
    timestamp TEXT NOT NULL
);

CREATE TABLE IF NOT EXISTS llm_completions (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    session_id TEXT NOT NULL,
    turn_number INTEGER NOT NULL,
    input_tokens INTEGER,
    output_tokens INTEGER,
    cached_tokens INTEGER,
    cost_cents REAL,
    timestamp TEXT NOT NULL
);

-- TODO: Add a sessions table with total cost, total tokens, status
"""


class ObservabilityTracker:
    """Tracks agent observability data to SQLite."""
    
    def __init__(self, db_path: str = "agent_observability.db"):
        self.db_path = db_path
        self.session_id = f"session_{datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S')}"
        self._init_db()
    
    def _init_db(self):
        """Initialize database with schema."""
        # TODO: Connect to SQLite and create tables
        pass
    
    def log_tool_call(self, turn: int, tool_name: str, params: dict, 
                      result: str, duration_ms: int):
        """Log a tool call."""
        # TODO: Insert tool call record
        pass
    
    def log_llm_completion(self, turn: int, input_tokens: int, 
                           output_tokens: int, cost_cents: float):
        """Log an LLM completion with token counts."""
        # TODO: Insert LLM completion record
        pass
    
    def get_session_summary(self) -> dict:
        """Get total cost, tool calls, tokens for this session."""
        # TODO: Query and return summary
        pass


# TODO: Decorate your agent with observability
def with_observability(agent_func):
    """Decorator that wraps an agent with observability tracking."""
    def wrapper(prompt: str):
        tracker = ObservabilityTracker()
        # TODO: Wrap the agent execution with tracking
        result = agent_func(prompt)
        return result
    return wrapper


if __name__ == "__main__":
    # Test the tracker
    tracker = ObservabilityTracker()
    tracker.log_tool_call(1, "read_file", {"path": "test.txt"}, "file contents", 150)
    tracker.log_llm_completion(1, 500, 200, 0.003)
    
    summary = tracker.get_session_summary()
    print(f"Session: {tracker.session_id}")
    print(f"Summary: {json.dumps(summary, indent=2)}")
