"""Recover wrong-target corrections: DM/message → public post (0.2.2.60)."""

from __future__ import annotations

import re
from dataclasses import dataclass


_CORRECTION_MARKERS_RE = re.compile(
    r"(?:"
    r"неправильн\w*|"
    r"не\s+так|"
    r"не\s+то|"
    r"wrong|"
    r"incorrect|"
    r"вместо\s+этого|"
    r"instead|"
    r"исправ\w*|"
    r"нужно\s+было|"
    r"должен\s+был|"
    r"следовало|"
    r"ты\s+(?:выполнил|сделал)\s+(?:задачу\s+)?неправильн"
    r")",
    re.IGNORECASE,
)
_WRONG_MESSAGE_TARGET_RE = re.compile(
    r"(?:"
    r"сообщен\w*|"
    r"message|"
    r"\bdm\b|"
    r"direct\s+message|"
    r"личк\w*|"
    r"чат\w*|"
    r"другому\s+пользовател"
    r")",
    re.IGNORECASE,
)
_WANT_POST_RE = re.compile(
    r"(?:"
    r"\bпост\b|"
    r"\bpost\b|"
    r"публичн\w*|"
    r"канал\w*|"
    r"лент\w*|"
    r"feed|"
    r"composer|"
    r"опублик"
    r")",
    re.IGNORECASE,
)
_NOT_MESSAGE_RE = re.compile(
    r"(?:"
    r"а\s+не\s+(?:сообщен|message|dm|личк|чат)|"
    r"не\s+(?:сообщен|message|dm)|"
    r"not\s+(?:a\s+)?(?:message|dm)|"
    r"вместо\s+(?:сообщен|message|dm)"
    r")",
    re.IGNORECASE,
)


@dataclass(frozen=True)
class WebPostCorrection:
    """User says previous action hit DM/chat instead of a public post."""

    acknowledged: bool
    prefer_feed_composer: bool
    recovery_prompt: str


def is_web_post_wrong_target_correction(text: str) -> bool:
    raw = str(text or "").strip()
    if not raw:
        return False
    if not _CORRECTION_MARKERS_RE.search(raw):
        # Soft form: «это сообщение а не пост» without explicit «неправильно»
        if _WRONG_MESSAGE_TARGET_RE.search(raw) and _WANT_POST_RE.search(raw) and (
            _NOT_MESSAGE_RE.search(raw) or "а не" in raw.lower()
        ):
            return True
        return False
    if _WRONG_MESSAGE_TARGET_RE.search(raw) and _WANT_POST_RE.search(raw):
        return True
    if _NOT_MESSAGE_RE.search(raw) and _WANT_POST_RE.search(raw):
        return True
    return False


def build_web_post_correction(
    text: str,
    *,
    prior_user_text: str | None = None,
    memory_site: str = "",
    memory_goal: str = "",
) -> WebPostCorrection | None:
    if not is_web_post_wrong_target_correction(text):
        return None

    prior = str(prior_user_text or "").strip()
    site = str(memory_site or "").strip()
    goal = str(memory_goal or "").strip()

    parts = [
        "Переделай предыдущую задачу: опубликуй как публичный пост в ленте (feed/composer), "
        "не как личное сообщение (DM/chat) другому пользователю.",
    ]
    if prior:
        parts.append(f"Исходная задача: {prior}")
    elif goal:
        parts.append(f"Исходная цель: {goal}")
    if site:
        parts.append(f"Сайт: {site}")
    parts.append(f"Уточнение пользователя: {str(text or '').strip()}")
    parts.append("Открой composer создания поста (Создать / New post / лента), не поле чата.")

    return WebPostCorrection(
        acknowledged=True,
        prefer_feed_composer=True,
        recovery_prompt=" ".join(parts),
    )
