# pylint: disable=C0111,R0903

"""Print the branch and git status for the
currently focused window.

Requires:
    * xcwd
    * Python module 'pygit2'
"""

import os
import string
import logging
try:
    import pygit2
except ImportError:
    pass

import bumblebee.input
import bumblebee.output
import bumblebee.engine
import bumblebee.util

class Module(bumblebee.engine.Module):
    def __init__(self, engine, config):
        widgets = []
        super(Module, self).__init__(engine, config, widgets)
        self._engine = engine
        self._error = False
        self.update(self.widgets())

    def hidden(self):
        return self._error

    def update(self, widgets):
        state = {}
        new_widgets = []
        try:
            directory = bumblebee.util.execute("xcwd").strip()
            directory = self._get_git_root(directory)
            repo = pygit2.Repository(directory)

            new_widgets.append(bumblebee.output.Widget(name='git.main', full_text=repo.head.shorthand))

            for filepath, flags in repo.status().items():
                if flags == pygit2.GIT_STATUS_WT_NEW or \
                    flags == pygit2.GIT_STATUS_INDEX_NEW:
                    state['new'] = True
                if flags == pygit2.GIT_STATUS_WT_DELETED or \
                    flags == pygit2.GIT_STATUS_INDEX_DELETED:
                    state['deleted'] = True
                if flags == pygit2.GIT_STATUS_WT_MODIFIED or \
                    flags == pygit2.GIT_STATUS_INDEX_MODIFIED:
                    state['modified'] = True
            self._error = False
            if 'new' in state:
                new_widgets.append(bumblebee.output.Widget(name='git.new'))
            if 'modified' in state:
                new_widgets.append(bumblebee.output.Widget(name='git.modified'))
            if 'deleted' in state:
                new_widgets.append(bumblebee.output.Widget(name='git.deleted'))

            while len(widgets) > 0:
                del widgets[0]
            for widget in new_widgets:
                widgets.append(widget)
            
        except Exception as e:
            self._error = True

    def state(self, widget):
        return widget.name.split('.')[1]

    def _get_git_root(self, directory):
        while len(directory) > 1:
            if os.path.exists(os.path.join(directory, ".git")):
                return directory
            directory = "/".join(directory.split("/")[0:-1])
        return "/" 

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