from __future__ import annotations

import logging
from typing import Any

from app.models.telegram_schemas import TelegramResponse, TelegramServiceStatus
from app.modules.integrations.infrastructure.adapters.telegram_adapter import (
    TelegramHttpAdapter,
)
from app.modules.operations.application.ai_site_diary_service import (
    AISiteDiaryService,
)

logger = logging.getLogger("dscons.telegram.client")


class TelegramClientMixin:
    """Core communication client for Telegram API (Application Facade)."""

    def __init__(
        self,
        bot_token: str | None = None,
        default_chat_id: str | None = None,
        site_diary_service: AISiteDiaryService | None = None,
        adapter: TelegramHttpAdapter | None = None,
    ) -> None:
        self.adapter = adapter or TelegramHttpAdapter(
            bot_token=bot_token, default_chat_id=default_chat_id
        )
        self.site_diary_service = site_diary_service or AISiteDiaryService()

    @property
    def bot_token(self) -> str | None:
        return self.adapter.bot_token

    @bot_token.setter
    def bot_token(self, val: str | None) -> None:
        self.adapter.bot_token = val

    @property
    def default_chat_id(self) -> str | None:
        return self.adapter.default_chat_id

    @default_chat_id.setter
    def default_chat_id(self, val: str | None) -> None:
        self.adapter.default_chat_id = val

    @property
    def enabled(self) -> bool:
        return self.adapter.enabled

    @enabled.setter
    def enabled(self, val: bool) -> None:
        self.adapter.enabled = val

    async def send_message(
        self,
        text: str,
        chat_id: str | None = None,
        parse_mode: str = "HTML",
        disable_web_page_preview: bool = False,
        reply_markup: dict[str, Any] | None = None,
    ) -> TelegramResponse:
        """Send a formatted message to a Telegram chat or channel via Adapter."""
        return await self.adapter.send_message(
            text=text,
            chat_id=chat_id,
            parse_mode=parse_mode,
            disable_web_page_preview=disable_web_page_preview,
            reply_markup=reply_markup,
        )

    def get_status(self) -> TelegramServiceStatus:
        """Return operational status and connectivity metrics of Telegram Suite."""
        return self.adapter.get_status()
