from typing import Dict, Any, List, Optional
from pydantic import BaseModel, Field
import os


class MenuExtractionServiceConfig(BaseModel):
    enabled: bool = True

    # OpenAI Configuration
    openai_api_key: str
    openai_api_keys: List[str] = Field(default_factory=list)
    menu_extraction_model: str
    max_tokens: int = 1500
    temperature: float = 0
    timeout: float = 25.0
    max_retries: int = 3

    # Service Configuration
    max_images_per_batch: Optional[int] = 8
    max_tokens_per_batch: int = 95000
    schema_tokens_estimate: int = 600
    max_file_size_mb: int = 20
    image_tokens_estimate: int = 4000

    @classmethod
    def from_config(cls, config: Dict[str, Any]) -> "MenuExtractionServiceConfig":
        """Create config from YAML with environment variable resolution"""
        service_config = config["services"]["menu_extraction"]

        # Get API key from environment
        api_key_env = service_config["openai"].get("api_key_env", "OPENAI_API_KEY")
        pool_envs = service_config["openai"].get("api_key_pool_envs", [])

        api_keys: List[str] = []
        seen: set[str] = set()

        def add_key(value: Optional[str]):
            if value and value not in seen:
                api_keys.append(value)
                seen.add(value)

        for env_name in pool_envs:
            add_key(os.getenv(env_name))

        # Fallback chain
        add_key(os.getenv(api_key_env))
        add_key(os.getenv("OPENAI_API_KEY"))

        if not api_keys:
            raise ValueError(f"No OpenAI API keys found. Ensure {api_key_env} or api_key_pool_envs are set.")

        limits = service_config.get("limits", {})

        return cls(
            enabled=service_config.get("enabled", True),
            openai_api_key=api_keys[0],
            openai_api_keys=api_keys,
            menu_extraction_model=service_config["openai"]["models"]["menu_extraction"],
            max_tokens=service_config["openai"].get("max_tokens", 1500),
            temperature=service_config["openai"].get("temperature", 0),
            timeout=service_config["openai"].get("timeout", 25.0),
            max_retries=service_config["openai"].get("max_retries", 3),
            max_images_per_batch=limits.get("max_images_per_batch", 8),
            max_tokens_per_batch=limits.get("max_tokens_per_batch", 95000),
            schema_tokens_estimate=limits.get("schema_tokens_estimate", 600),
            max_file_size_mb=limits.get("max_file_size_mb", 20),
            image_tokens_estimate=limits.get("image_tokens_estimate", 4000)
        )
