from django.db import models
from integrations.models.base import BaseIntegration, IntegrationType
from django.core.exceptions import ValidationError
from integrations.fields import EncryptedCharField


def validate_temperature(value):
    """Валидатор для температуры, принимает значения от 0 до 1"""
    if value < 0 or value > 1:
        raise ValidationError('Температура должна быть в диапазоне 0.0-1.0')


# Список доступных моделей GLM (включая бесплатные)
GLM_MODEL_CHOICES = [
    ('glm-4', 'GLM-4 (Платная, дешевле)'),
    ('glm-4.7', 'GLM-4.7 (Платная)'),
    ('charglm-3', 'ChargLM-3 (Платная)'),
    ('glm-4.6v', 'GLM-4.6V (Бесплатная)'),
    ('glm-4.5v', 'GLM-4.5V (Бесплатная)'),
    ('glm-4.5-air', 'GLM-4.5-Air (Бесплатная)'),
    ('glm-4.5-flash', 'GLM-4.5-Flash (Бесплатная)'),
    ('glm-4.5-flashx', 'GLM-4.5-FlashX (Бесплатная)'),
]


class AIIntegration(BaseIntegration):
    """
    Базовая модель для интеграций с ИИ-сервисами
    """
    class Meta:
        abstract = True


class GLMIntegration(AIIntegration):
    """
    Интеграция с GLM от Z.AI
    """
    integration_type = IntegrationType.AI_SERVICE

    api_key = EncryptedCharField(
        max_length=500,
        blank=True,
        verbose_name="API ключ",
        help_text="Ключ для доступа к API GLM от Z.AI (шифруется в БД)"
    )

    api_url = models.URLField(
        max_length=500,
        default="https://api.z.ai/api/paas/v4",
        verbose_name="URL API",
        help_text="URL для обращения к API GLM (обычно https://api.z.ai/api/paas/v4)"
    )

    model_name = models.CharField(
        max_length=100,
        default="glm-4",
        choices=GLM_MODEL_CHOICES,
        verbose_name="Название модели",
        help_text="Название используемой модели GLM (например, glm-4.7, glm-4)"
    )

    temperature = models.FloatField(
        default=0.7,
        validators=[validate_temperature],
        verbose_name="Температура",
        help_text="Параметр температуры для генерации (0.0-1.0)"
    )

    is_coding_endpoint = models.BooleanField(
        default=False,
        verbose_name="Использовать эндпоинт для кодинга",
        help_text="Отметьте, если используете специальный эндпоинт для задач программирования"
    )

    class Meta:
        verbose_name = "Интеграция GLM"
        verbose_name_plural = "Интеграции GLM"

    @property
    def is_configured(self) -> bool:
        return bool(self.api_key)

    def clean(self):
        super().clean()
        if self.temperature < 0 or self.temperature > 1:
            raise ValidationError({'temperature': 'Температура должна быть в диапазоне 0.0-1.0'})

        # Всегда используем общий эндпоинт
        self.api_url = "https://api.z.ai/api/paas/v4"