from dataclasses import dataclass
from typing import Dict, Any, Optional
from ...shared.config.loader import get_env_var


@dataclass
class InsertMenuItemsServiceConfig:
    """Configuration for insert_menu_items service"""

    enabled: bool
    bearer_token: Optional[str]
    create_menu_url: str
    timeout: float
    max_retries: int
    temp_directory: str
    cleanup_after_seconds: int
    observability_public_directory: str
    observability_public_url_prefix: str
    public_base_url: str
    observability_webhook_url: Optional[str]
    observability_timeout: float
    observability_notify_email: str
    observability_bearer_token: Optional[str]

    @classmethod
    def from_config(cls, config: Dict[str, Any]) -> "InsertMenuItemsServiceConfig":
        """Create config from loaded YAML configuration"""
        service_config = config["services"].get("insert_menu_items", {})

        if not service_config.get("enabled", False):
            raise ValueError("insert_menu_items service is not enabled")

        auth_config = service_config.get("auth", {})
        external_api_config = service_config.get("external_api", {})
        storage_config = service_config.get("storage", {})
        observability_config = service_config.get("observability", {})

        return cls(
            enabled=service_config["enabled"],
            bearer_token=get_env_var(
                auth_config.get("bearer_token_env", "INSERT_MENU_ITEMS_SERVICE_KEY"),
                required=False
            ),
            create_menu_url=external_api_config.get(
                "create_menu_url",
                "https://zavedenia.com/apps/orderapprestaurant/api/createMenu.php"
            ),
            timeout=external_api_config.get("timeout", 30.0),
            max_retries=external_api_config.get("max_retries", 3),
            temp_directory=storage_config.get("temp_directory", "/tmp/menu_images"),
            cleanup_after_seconds=storage_config.get("cleanup_after_seconds", 3600),
            observability_public_directory=storage_config.get(
                "observability_public_directory",
                "observability"
            ),
            observability_public_url_prefix=storage_config.get(
                "observability_public_url_prefix",
                "/observability"
            ),
            public_base_url=get_env_var(
                storage_config.get("public_base_url_env", "AI_MENU_PUBLIC_BASE_URL"),
                required=False
            ) or storage_config.get("public_base_url", "https://ai.zavedenia.com"),
            observability_webhook_url=get_env_var(
                observability_config.get("webhook_url_env", "INSERT_MENU_ITEMS_OBSERVABILITY_WEBHOOK_URL"),
                required=False
            ) or observability_config.get("webhook_url"),
            observability_timeout=observability_config.get("timeout", 10.0),
            observability_notify_email=observability_config.get(
                "notify_email",
                "zavedenia@gmail.com,darko@appfactory.bg"
            ),
            observability_bearer_token=get_env_var(
                observability_config.get("bearer_token_env", "MENU_EXTRACTION_SERVICE_KEY"),
                required=False
            )
        )
