"""Typed update objects used by the disposable Telegram engine."""

from __future__ import annotations

from dataclasses import dataclass
from typing import Final, final

from telegram import Bot, InlineKeyboardMarkup, Message

from scripts.nutricoach_v140_fake_telegram import (
    CallbackUnavailableError,
    FakeTelegramEngine,
)


@dataclass(frozen=True, slots=True)
class FakeUser:
    id: str
    first_name: str


@dataclass(frozen=True, slots=True)
class FakeChat:
    id: str
    type: str


@dataclass(frozen=True, slots=True)
class FakeMessage:
    chat_id: str
    message_id: int
    message_thread_id: str | None
    chat: FakeChat
    text: str


@final
class FakeCallbackQuery:
    """Production-handler-shaped callback using real PTB Bot methods."""

    def __init__(
        self,
        bot: Bot,
        engine: FakeTelegramEngine,
        *,
        data: str,
        user_id: str,
        chat_id: str,
        message_id: str,
        topic_id: str | None,
        chat_type: str = "private",
        source_chat_id: str | None = None,
    ) -> None:
        self._bot = bot
        self.data = data
        self.from_user = FakeUser(user_id, "Operator")
        self.message = FakeMessage(
            chat_id, int(message_id), topic_id, FakeChat(chat_id, chat_type),
            engine.message(source_chat_id or chat_id, message_id).text,
        )
        self.answers: list[str] = []

    async def answer(self, text: str = "") -> None:
        self.answers.append(text)

    async def edit_message_text(
        self, text: str, reply_markup: InlineKeyboardMarkup | None = None,
    ) -> Message:
        result = await self._bot.edit_message_text(
            chat_id=int(self.message.chat_id), message_id=self.message.message_id,
            text=text, reply_markup=reply_markup,
        )
        if not isinstance(result, Message):
            raise CallbackUnavailableError
        return result


FORBIDDEN_TRANSCRIPT_VALUES: Final = (
    "• 체중: 70",
    "• 칼로리: 2300",
    "• 단백질·탄수화물·지방(기존 입력 순서): 150 280 65",
    "• 식사(끼니별 Meal 기록): planned meals",
    "• 수분: 2.5",
    "• 수면 시간: 7",
    "• 수면 질: 4",
    "• 소화·배변: 특이 불편 없음",
    "• 컨디션: 4",
    "• 식욕·스트레스: appetite stable",
    "• 운동: lower body",
)