import asyncio
import random
import logging
from database import db_session, ReactionRule, log_system_event

logger = logging.getLogger("AutoReaction")

class AutoReactionEngine:
    def __init__(self, client):
        self.client = client
        self._register_handlers()

    def _register_handlers(self):
        from pyrogram import handlers
        
        # Add handler for channel posts and group messages
        self.client.add_handler(
            handlers.MessageHandler(self.handle_incoming_message)
        )
        logger.info("AutoReaction message handlers registered.")

    async def handle_incoming_message(self, client, message):
        """Handler for new messages in channels and groups"""
        if not message or not message.chat:
            return

        chat_id = message.chat.id
        chat_username = f"@{message.chat.username}" if message.chat.username else str(chat_id)

        # Check DB for matching active reaction rules
        rules = db_session.query(ReactionRule).filter(
            ReactionRule.is_enabled == True
        ).all()

        matched_rule = None
        for rule in rules:
            target = rule.target_chat.strip()
            if not target:
                continue
            
            # Match by username (@channel) or numerical chat_id
            if (target.startswith("@") and message.chat.username and target.lower() == f"@{message.chat.username}".lower()) \
               or (target == str(chat_id)) \
               or (target.lower() in (message.chat.title or "").lower()):
                matched_rule = rule
                break

        if not matched_rule:
            return

        # Perform auto reaction with delay
        try:
            if matched_rule.delay_seconds > 0:
                await asyncio.sleep(matched_rule.delay_seconds)

            emoji_list = [e.strip() for e in matched_rule.emojis.split(",") if e.strip()]
            if not emoji_list:
                emoji_list = ["👍", "❤️", "🔥"]

            selected_emoji = random.choice(emoji_list)

            # Send reaction via Pyrogram
            await self.client.send_reaction(
                chat_id=message.chat.id,
                message_id=message.id,
                emoji=selected_emoji
            )

            log_system_event(
                f"Auto-reacted {selected_emoji} to message {message.id} in {chat_username}"
            )
            logger.info(f"Auto-reacted {selected_emoji} to message {message.id} in {chat_username}")

        except Exception as e:
            error_msg = f"Failed auto reaction in {chat_username}: {str(e)}"
            logger.error(error_msg)
            # Log error if not harmless Telegram restriction
            if "REACTION_INVALID" in str(e) or "CHAT_ADMIN_REQUIRED" in str(e):
                log_system_event(error_msg, level="WARNING")
