# composer.py

from datetime import datetime
from typing import Optional, Tuple
from zoneinfo import ZoneInfo

from app.bot.utils.tg_escape_chars import escape_telegram_chars  # или твоя функция, если кастомная
from config import ZABBIX_TZ


def compose_telegram_message(data: dict) -> Tuple[str, Optional[str]]:
    """
    Формирует сообщение для Telegram и возвращает его вместе со ссылкой (если есть).

    Args:
        data (dict): сообщение из очереди

    Returns:
        Tuple[str, Optional[str]]: текст сообщения и ссылка для кнопки (если есть)
    """
    try:
        priority_map = {
            'High': '⚠️',
            'Disaster': '⛔️'
        }
        convert_time_format = {
            "h": "ч",
            "m": "м",
            "s": "с"
        }

        priority = priority_map.get(data.get('severity', ''), '')
        msg = escape_telegram_chars(data.get('msg', ''))
        host = escape_telegram_chars(data.get('host', ''))
        ip = escape_telegram_chars(data.get('ip', ''))
        severity = escape_telegram_chars(data.get('severity', ''))
        status = data.get('status', '').upper()
        timestamp = int(data.get('date_reception', 0))
        dt = datetime.fromtimestamp(timestamp, tz=ZoneInfo(ZABBIX_TZ))
        time_str = dt.strftime('%d.%m.%Y %H:%M:%S')

        if status == "PROBLEM":
            message = (
                f"{priority} {host} ({ip})\n"
                f"<b>Описание</b>: {msg}\n"
                f"<b>Критичность</b>: {severity}\n"
                f"<b>Время возникновения</b>: {time_str} Мск\n"
            )
        else:
            event_duration = data.get('event_duration', '')
            duration = ' '.join(
                f"{part[:-1]}{convert_time_format.get(part[-1], part[-1])}"
                for part in event_duration.split()
            )

            # Переформатируем event_date из '2025.06.27 16:46:04' в '27.06.2025 16:46:04'
            event_date_str = data.get('event_date', '')
            if event_date_str:
                try:
                    dt_start = datetime.strptime(event_date_str, "%Y.%m.%d %H:%M:%S")
                    # не меняем timezone, просто меняем формат
                    time_start = dt_start.strftime('%d.%m.%Y %H:%M:%S')
                except Exception:
                    time_start = event_date_str  # fallback — оставляем как есть
            else:
                time_start = ''

            message = (
                f"✅ {host} ({ip})\n"
                f"<b>Описание</b>: {msg}\n"
                f"<b>Критичность</b>: {severity}\n"
                f"<b>Проблема устранена!</b>\n"
                f"<b>Время начала</b>: {time_start} Мск\n"
                f"<b>Время устранения</b>: {time_str} Мск\n"
                f"<b>Длительность проблемы</b>: {duration}\n"
            )

        link = data.get("link")
        return message, link

    except KeyError as e:
        raise ValueError(f"Missing key in data: {e}")