"""
Agent configuration and model setup for Karishye AI.

This module contains:
- Model configuration classes
- AI model initialization (Gemini/OpenAI)
- Agent definitions (general_agent for internal use, karishye_agent for user interaction)
- ChatContext class for passing dependencies to tools
"""

import os
import logging
from dotenv import load_dotenv
from typing import Optional
from pydantic import BaseModel, validator
from pydantic_ai import Agent
from pydantic_ai.models.openai import OpenAIChatModel
from pydantic_ai.providers.openai import OpenAIProvider
from app.system_prompts import SYSTEM_PROMPT, KARISHYE_AGENT_TOOL_INFO_PROMPT

# -------------------------------
# Logger setup
# -------------------------------
logger = logging.getLogger(__name__)

load_dotenv()

# -------------------------------
# Context class for agent dependencies
# -------------------------------
class ChatContext:
    """
    Context for passing dependencies to agent tools.
    
    Attributes:
        user_id: User identifier
        session_id: Session identifier
        phone_number: Pre-collected phone number from WhatsApp
        user_name: Pre-collected user name from WhatsApp
    """
    def __init__(self, user_id: str, session_id: str, phone_number: str = None, user_name: str = None):
        self.user_id = user_id
        self.session_id = session_id
        self.phone_number = phone_number  # From WhatsApp
        self.user_name = user_name  # From WhatsApp


# -------------------------------
# Model Configuration
# -------------------------------
class ModelConfig(BaseModel):
    """Configuration for AI model providers."""

    model_name: str
    base_url: str
    api_key: Optional[str] = None  # Optional for local proxies

    @validator("base_url")
    def base_url_must_not_be_empty(cls, v):
        if not v:
            raise ValueError("base_url must not be empty")
        return v


def _create_model(config: ModelConfig) -> OpenAIChatModel:
    """Create an OpenAIChatModel from configuration."""
    provider_kwargs = {"base_url": config.base_url}
    if config.api_key:
        provider_kwargs["api_key"] = config.api_key
    provider = OpenAIProvider(**provider_kwargs)
    
    # Create model with settings that encourage tool usage
    model = OpenAIChatModel(
        model_name=config.model_name, 
        provider=provider
    )
    return model


# -------------------------------
# Model Setup
# -------------------------------
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "")
OPENAI_API_BASE = os.getenv("OPENAI_API_BASE_URL", "https://api.openai.com/v1")

# Gemini model configuration
model_config = ModelConfig(
    model_name="gpt-4o-mini",
    base_url=OPENAI_API_BASE,
    api_key=OPENAI_API_KEY,
    stream=True
)

model = _create_model(model_config)

# -------------------------------
# Agent Definitions
# -------------------------------

# Gemini agent is used for internal AI calls (KB summarization, intent scoring)
# It should NOT have access to tools - it's just for text generation
general_agent = Agent(
    model=model,
    name="karishye-bot",
    # No deps_type - this agent doesn't use tools
)

# Karishye agent is the main agent with tools for user interaction
# Tools will be registered in karishye_agent_tools.py
# CRITICAL: System prompt starts with tool requirements to ensure model sees them first
karishye_agent = Agent(
    model=model,
    system_prompt=SYSTEM_PROMPT + "\n\n" + KARISHYE_AGENT_TOOL_INFO_PROMPT,  # Tool instructions FIRST
    name="karishye-agent",
    deps_type=ChatContext
)
