import re
from src import EventManager, ModuleManager, utils

REGEX_URL = re.compile("https?://\S+", re.I)

@utils.export("channelset", {"setting": "auto-title",
    "help": "Disable/Enable automatically getting info titles from URLs",
    "validate": utils.bool_or_none})
class Module(ModuleManager.BaseModule):
    def _get_title(self, url):
        try:
            page = utils.http.request(url, soup=True)
        except utils.http.HTTPWrongContentTypeException:
            return None
        except Exception as e:
            self.log.error("failed to get URL title", [], exc_info=True)
            return None
        if page.data.title:
            return page.data.title.text.replace("\n", " ").replace(
                "\r", "").replace("  ", " ").strip()
        else:
            return None

    @utils.hook("received.message.channel",
        priority=EventManager.PRIORITY_MONITOR)
    def channel_message(self, event):
        match = re.search(REGEX_URL, event["message"])
        if match and event["channel"].get_setting("auto-title", False):
            title = self._get_title(match.group(0))
            if title:
                self.events.on("send.stdout").call(target=event["channel"],
                    message=title, module_name="Title",
                    server=event["server"])

    @utils.hook("received.command.t", alias_of="title")
    @utils.hook("received.command.title", usage="[URL]")
    def title(self, event):
        """
        :help: Get the title of a URL
        :usage: [URL]
        """
        url = None
        if len(event["args"]) > 0:
            url = event["args_split"][0]
        else:
            url = event["target"].buffer.find(REGEX_URL)
            if url:
                url = re.search(REGEX_URL, url.message).group(0)
        if not url:
            raise utils.EventError("No URL provided/found.")

        title = self._get_title(url)

        if title:
            event["stdout"].write(title)
        else:
            event["stderr"].write("Failed to get title")