# pylint: disable=C0111,R0903

"""Displays the unread GitHub notifications for a GitHub user

Requires the following library:
    * requests

Parameters:
    * github.token: GitHub user access token, the token needs to have the 'notifications' scope.
    * github.interval: Interval in minutes between updates, default is 5.

contributed by `yvesh <https://github.com/yvesh>`_ - many thanks!
"""

import shutil
import requests

import core.module
import core.widget
import core.decorators
import core.input


class Module(core.module.Module):
    @core.decorators.every(minutes=5)
    def __init__(self, config, theme):
        super().__init__(config, theme, core.widget.Widget(self.github))

        self.__count = 0
        self.__requests = requests.Session()
        self.__requests.headers.update(
            {"Authorization": "token {}".format(self.parameter("token", ""))}
        )

        cmd = "xdg-open"
        if not shutil.which(cmd):
            cmd = "x-www-browser"

        core.input.register(
            self,
            button=core.input.LEFT_MOUSE,
            cmd="{} https://github.com/notifications".format(cmd),
        )
        core.input.register(self, button=core.input.RIGHT_MOUSE, cmd=self.update)

    def github(self, _):
        return str(self.__count)

    def update(self):
        try:
            self.__count = 0
            url = "https://api.github.com/notifications"
            while True:
                notifications = self.__requests.get(url)
                self.__count += len(
                    list(
                        filter(
                            lambda notification: notification["unread"],
                            notifications.json(),
                        )
                    )
                )
                next_link = notifications.links.get("next")
                if next_link is not None:
                    url = next_link.get("url")
                else:
                    break

        except Exception:
            self.__count = "n/a"


# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4