# ruff: noqa: E501, W291
import logging

from django.conf import settings
from yandex_cloud_ml_sdk import YCloudML
from yandex_cloud_ml_sdk.exceptions import YCloudMLError

logger = logging.getLogger(__name__)

AD_PROMPT_TEMPLATE = """
Сгенерируй креативный рекламный текст для рекламодателя: "{advertiser_name}", 
который проводит рекламную кампанию с названием: "{ad_title}"

Требования:
1. Текст должен быть максимально привлекательным и продающим
2. Использовать современные маркетинговые приемы
3. Включить призыв к действию
4. Соблюдать структуру: заголовок - основной текст - заключение
5. Длина: 3-6 коротких предложений
6. Ответ должен содержать только текст рекламы без дополнительных комментариев

Пример хорошего текста:
Запустите свой бизнес в космос с {{advertiser_name}}! Кампания "{{ad_title}}" предлагает 
уникальные решения для цифрового продвижения. Присоединяйтесь к лидерам рынка - получите 
персональную консультацию сегодня!
""".strip()


class YandexAIAdTextGenerator:
    def __init__(self) -> None:
        self.sdk = YCloudML(
            folder_id=settings.YANDEX_CLOUD_FOLDER_ID,
            auth=settings.YANDEX_CLOUD_API_KEY,
        )

    def generate_ad_text(
        self, advertiser_name: str, ad_title: str
    ) -> str | None:
        try:
            prompt = AD_PROMPT_TEMPLATE.format(
                advertiser_name=advertiser_name, ad_title=ad_title
            )

            promise = (
                self.sdk.models.completions(
                    "yandexgpt-lite", model_version="latest"
                )
                .configure(max_tokens=400, temperature=1.0)
                .run_deferred([{"role": "user", "text": prompt}])
            )

            result = promise.wait()
            logger.debug("Generated ad text: %s", result)

            return self._clean_response(result.alternatives[0].text)

        except YCloudMLError:
            return None

    def _clean_response(self, text: str) -> str:
        cleaned = text.strip()
        cleaned = cleaned.replace('"', "")
        return " ".join(cleaned.splitlines())
