from dataclasses import dataclass
from typing import Optional
from django.conf import settings
import os
import logging

logger = logging.getLogger(__name__)


@dataclass
class AIConfig:
    """
    Конфигурация для интеграции с ИИ-сервисами
    """
    api_key: str
    api_url: str
    model_name: str
    temperature: float
    is_coding_endpoint: bool = False
    max_tokens: int = 1000
    timeout: int = 30
    
    @classmethod
    def from_integration_model(cls, integration_model):
        """
        Создать конфигурацию из модели интеграции
        """
        logger.info(f"=== Создание конфигурации из модели интеграции ===")
        logger.info(f"Тип модели: {type(integration_model)}")
        logger.info(f"Атрибуты модели: {dir(integration_model)}")
        
        try:
            api_key = integration_model.api_key
            logger.info(f"API key (первые 10 символов): {api_key[:10] if api_key else 'None'}...")
        except AttributeError as e:
            logger.error(f"Ошибка при получении api_key: {str(e)}")
            raise
        
        # Всегда используем общий эндпоинт
        api_url = "https://api.z.ai/api/paas/v4"
        logger.info(f"Используем общий endpoint: {api_url}")
        
        try:
            model_name = integration_model.model_name
            logger.info(f"Model name: {model_name}")
        except AttributeError as e:
            logger.error(f"Ошибка при получении model_name: {str(e)}")
            raise
        
        try:
            temperature = float(integration_model.temperature)
            logger.info(f"Temperature: {temperature}")
        except AttributeError as e:
            logger.error(f"Ошибка при получении temperature: {str(e)}")
            raise
        
        return cls(
            api_key=api_key,
            api_url=api_url,
            model_name=model_name,
            temperature=temperature,
            is_coding_endpoint=False,  # Всегда False, так как используем общий endpoint
        )
    
    @classmethod
    def from_env(cls):
        """
        Создать конфигурацию из переменных окружения
        """
        return cls(
            api_key=os.getenv('ZAI_API_KEY', ''),
            api_url=os.getenv('ZAI_API_URL', 'https://api.z.ai/api/paas/v4'),
            model_name=os.getenv('ZAI_MODEL_NAME', 'glm-4.7'),
            temperature=float(os.getenv('ZAI_TEMPERATURE', '0.7')),
            is_coding_endpoint=os.getenv('ZAI_CODING_ENDPOINT', 'false').lower() == 'true',
        )


def get_glm_config(integration_model=None):
    """
    Получить конфигурацию GLM из модели интеграции или из .env
    """
    if integration_model:
        return AIConfig.from_integration_model(integration_model)
    else:
        return AIConfig.from_env()


@dataclass
class OpenRouterConfig:
    """
    Конфигурация для интеграции с OpenRouter
    """
    api_key: str
    api_url: str
    model_name: str
    temperature: float
    max_tokens: int = 1000
    timeout: int = 30
    
    @classmethod
    def from_integration_model(cls, integration_model):
        """
        Создать конфигурацию из модели интеграции
        """
        logger.info(f"=== Создание конфигурации OpenRouter из модели интеграции ===")
        logger.info(f"Тип модели: {type(integration_model)}")
        
        try:
            api_key = integration_model.api_key
            logger.info(f"API key (первые 10 символов): {api_key[:10] if api_key else 'None'}...")
        except AttributeError as e:
            logger.error(f"Ошибка при получении api_key: {str(e)}")
            raise
        
        api_url = getattr(integration_model, 'api_url', 'https://openrouter.ai/api/v1')
        logger.info(f"API URL: {api_url}")
        
        try:
            model_name = integration_model.model_name
            logger.info(f"Model name: {model_name}")
        except AttributeError as e:
            logger.error(f"Ошибка при получении model_name: {str(e)}")
            raise
        
        try:
            temperature = float(integration_model.temperature)
            logger.info(f"Temperature: {temperature}")
        except AttributeError as e:
            logger.error(f"Ошибка при получении temperature: {str(e)}")
            raise
        
        max_tokens = getattr(integration_model, 'max_tokens', 1000)
        logger.info(f"Max tokens: {max_tokens}")
        
        return cls(
            api_key=api_key,
            api_url=api_url,
            model_name=model_name,
            temperature=temperature,
            max_tokens=max_tokens,
        )
    
    @classmethod
    def from_env(cls):
        """
        Создать конфигурацию из переменных окружения
        """
        return cls(
            api_key=os.getenv('OPENROUTER_API_KEY', ''),
            api_url=os.getenv('OPENROUTER_API_URL', 'https://openrouter.ai/api/v1'),
            model_name=os.getenv('OPENROUTER_MODEL_NAME', 'xiaomi/mimo-v2-flash:free'),
            temperature=float(os.getenv('OPENROUTER_TEMPERATURE', '0.7')),
            max_tokens=int(os.getenv('OPENROUTER_MAX_TOKENS', '1000')),
        )


def get_openrouter_config(integration_model=None):
    """
    Получить конфигурацию OpenRouter из модели интеграции или из .env
    """
    if integration_model:
        return OpenRouterConfig.from_integration_model(integration_model)
    else:
        return OpenRouterConfig.from_env()