"""Reaction learning — admins teach & boost by reacting to messages."""
from __future__ import annotations

import logging

from telegram import Update
from telegram.constants import ChatMemberStatus
from telegram.ext import ContextTypes, MessageReactionHandler

from bot import db

logger = logging.getLogger(__name__)

# اموجی و عملکردشون
REACTIONS = {
    "👍": ("learn", "یاد گرفتم! هرکی اینو بگه جواب میدم"),
    "❤️": ("boost", "وزن این پاسخ رو زیاد کردم! احتمال جواب بیشتر شد"),
    "🔥": ("boost_more", "آتیش گرفتم! وزن پاسخ حسابی زیاد شد!"),
    "💪": ("boost_max", "قوی‌ترین پاسخ! وزن به حداکثر رسید!"),
    "👎": ("unlearn", "این رو فراموش کردم!"),
    "💔": ("unboost", "وزن این پاسخ رو کم کردم!"),
    "🧹": ("cleanup", "بی‌استفاده‌ها رو پاکسازی کردم!"),
}


async def _is_admin(bot, chat_id: int, user_id: int) -> bool:
    try:
        member = await bot.get_chat_member(chat_id, user_id)
        return member.status in (ChatMemberStatus.ADMINISTRATOR, ChatMemberStatus.CREATOR)
    except Exception:
        return False


async def reaction_learn(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Handle reactions for smart learning:
    👍 = ذخیره این پیام به عنوان پاسخ
    ❤️ = افزایش وزن یک پاسخ یادگرفته شده
    👎 = حذف پاسخ
    """
    if not update.message_reaction or not update.effective_chat:
        return

    reaction = update.message_reaction
    chat = update.effective_chat
    user = reaction.user

    if not await _is_admin(context.bot, chat.id, user.id):
        return

    # Get the emoji
    new_emoji = [r.emoji for r in reaction.new_reaction if r.emoji]
    if not new_emoji:
        return
    emoji = new_emoji[0]

    action, msg_template = REACTIONS.get(emoji, (None, None))
    if not action:
        return

    # Look up original message content
    from bot.msg_store import get as _get_msg

    msg_data = _get_msg(chat.id, reaction.message_id)
    if not msg_data:
        logger.debug(f"No stored message for {reaction.message_id}")
        return

    original_text, original_user_id = msg_data

    if action == "learn":
        # Learn the original message as a response
        trigger = original_text.strip().lower()[:30]
        response = original_text
        if trigger:
            await db.brain.add(
                chat.id, trigger, response,
                created_by=user.id, media_type="text",
            )
            try:
                await context.bot.send_message(
                    chat.id,
                    f"✅ یاد گرفتم! هرکی بگه «{trigger}» جواب میدم:\n{response[:80]}",
                )
            except Exception:
                pass

    elif action in ("boost", "boost_more", "boost_max"):
        # Boost weight: find which trigger this matches and increase weight
        results = await db.brain.search(chat.id, original_text)
        if results:
            match = results[0]
            deltas = {"boost": 0.5, "boost_more": 1.5, "boost_max": 3.0}
            delta = deltas.get(action, 0.5)
            await db.adjust_learned_weight(chat.id, match.trigger, delta)
            icons = {"boost": "❤️", "boost_more": "🔥", "boost_max": "💪"}
            icon = icons.get(action, "❤️")
            msg = match.response[:60] if match.media_type == "text" else f"[{match.media_type}]"
            try:
                await context.bot.send_message(
                    chat.id,
                    f"{icon} وزن «{match.trigger}» زیاد شد! ({msg})",
                )
            except Exception:
                pass

    elif action == "unlearn":
        # Remove: find and forget
        count = await db.brain.remove(chat.id, original_text.strip().lower()[:30])
        if count > 0:
            try:
                await context.bot.send_message(chat.id, f"👎 فراموشش کردم!")
            except Exception:
                pass

    elif action == "unboost":
        # Reduce weight
        results = await db.brain.search(chat.id, original_text)
        if results:
            match = results[0]
            await db.adjust_learned_weight(chat.id, match.trigger, -0.5)
            try:
                await context.bot.send_message(
                    chat.id,
                    f"💔 وزن «{match.trigger}» رو کم کردم!",
                )
            except Exception:
                pass

    elif action == "cleanup":
        # Smart forget for this chat
        count = await db.smart_forget(chat.id, days=7)
        if count > 0:
            try:
                await context.bot.send_message(
                    chat.id,
                    f"🧹 {count} تا پاسخ کم‌استفاده رو پاکسازی کردم!",
                )
            except Exception:
                pass
        else:
            try:
                await context.bot.send_message(
                    chat.id,
                    "🧹 چیزی برای پاکسازی نبود! همه پاسخ‌ها فعالن.",
                )
            except Exception:
                pass


def register(app) -> None:
    try:
        app.add_handler(MessageReactionHandler(reaction_learn, block=False))
        logger.info("Reaction learning handler registered")
    except Exception as e:
        logger.warning(f"Could not register reaction handler: {e}")
