from typing import Union, Dict, Any, Optional, Iterable, List, Iterator, Type
from dapr_agents.prompt.base import PromptTemplateBase
from dapr_agents.prompt.prompty import Prompty
from pydantic import BaseModel, Field
from abc import ABC, abstractmethod
from pathlib import Path

class ChatClientBase(BaseModel, ABC):
    """
    Base class for chat-specific functionality.
    Handles Prompty integration and provides abstract methods for chat client configuration.
    """
    prompty: Optional[Prompty] = Field(default=None, description="Instance of the Prompty object (optional).")
    prompt_template: Optional[PromptTemplateBase] = Field(default=None, description="Prompt template for rendering (optional).")

    @classmethod
    @abstractmethod
    def from_prompty(cls, prompty_source: Union[str, Path], timeout: Union[int, float, Dict[str, Any]] = 1500) -> 'ChatClientBase':
        """
        Abstract method to load a Prompty source and configure the chat client.

        Args:
            prompty_source (Union[str, Path]): Source of the Prompty, either a file path or inline Prompty content.
            timeout (Union[int, float, Dict[str, Any]]): Timeout for requests.

        Returns:
            ChatClientBase: Configured chat client instance.
        """
        pass

    @abstractmethod
    def generate(
        self,
        messages: Union[str, Dict[str, Any], BaseModel, Iterable[Union[Dict[str, Any], BaseModel]]] = None,
        input_data: Optional[Dict[str, Any]] = None,
        model: Optional[str] = None,
        tools: Optional[List[Union[Dict[str, Any]]]] = None,
        response_format: Optional[Type[BaseModel]] = None,
        structured_mode: Optional[str] = None,
        **kwargs
    ) -> Union[Iterator[Dict[str, Any]], Dict[str, Any]]:
        """
        Abstract method to generate chat completions.

        Args:
            messages (Optional): Either pre-set messages or None if using input_data.
            input_data (Optional[Dict[str, Any]]): Input variables for prompt templates.
            model (Optional[str]): Specific model to use for the request, overriding the default.
            tools (Optional[List[Union[Dict[str, Any]]]]): List of tools for the request.
            response_format (Optional[Type[BaseModel]]): Optional Pydantic model for structured response parsing.
            structured_mode (Optional[str]): Mode for structured output.
            **kwargs: Additional parameters for the chat completion API.

        Returns:
            Union[Iterator[Dict[str, Any]], Dict[str, Any]]: The chat completion response(s).
        """
        pass