"""Roll dice when asked, intended for RPGs."""
import logging
import random
import re

from django.conf import settings

from irc.client import NickMask

from dice.roller import DiceRoller
from ircbot.lib import Plugin

logger = logging.getLogger(__name__)


class Dice(Plugin):
    """Roll simple or complex dice strings."""

    def __init__(self, bot, connection, event):
        """Set up the plugin."""
        self.roller = DiceRoller()

        super(Dice, self).__init__(bot, connection, event)

    def start(self):
        """Set up the handlers."""
        self.connection.reactor.add_global_regex_handler(['pubmsg', 'privmsg'], r'^!roll\s+(.*)$',
                                                         self.handle_roll, -20)
        self.connection.reactor.add_global_regex_handler(['pubmsg', 'privmsg'], r'^!random\s+(.*)$',
                                                         self.handle_random, -20)

        super(Dice, self).start()

    def stop(self):
        """Tear down handlers."""
        self.connection.reactor.remove_global_regex_handler(['pubmsg', 'privmsg'], self.handle_roll)
        self.connection.reactor.remove_global_regex_handler(['pubmsg', 'privmsg'], self.handle_random)

        super(Dice, self).stop()

    def handle_random(self, connection, event, match):
        """Handle the !random command which picks an item from a list."""
        nick = NickMask(event.source).nick
        choices = match.group(1)

        choices_list = choices.split(' ')
        choice = random.SystemRandom().choice(choices_list)

        logger.debug(event.recursing)
        if event.recursing:
            reply = "{0:s}".format(choice)
        elif settings.DICE_PREFIX_ROLLER:
            reply = "{0:s}: {1:s}".format(nick, choice)
        else:
            reply = "{0:s}".format(choice)
        return self.bot.reply(event, reply)

    def handle_roll(self, connection, event, match):
        """Handle the !roll command which covers most common dice stuff."""
        nick = NickMask(event.source).nick
        dicestr = match.group(1)

        logger.debug(event.recursing)
        try:
            reply_str = self.roller.do_roll(dicestr)
        except AssertionError as aex:
            reply_str = f"Could not roll dice: {aex}"
        except ValueError:
            reply_str = "Unable to parse roll"

        if event.recursing:
            reply = "{0:s}".format(reply_str)
        elif settings.DICE_PREFIX_ROLLER:
            reply = "{0:s}: {1:s}".format(nick, reply_str)
        else:
            reply = "{0:s}".format(reply_str)
        return self.bot.reply(event, re.sub(r'(\d+)(.*?\s+)(\(.*?\))', r'\1\214\3', reply))


plugin = Dice