default_official_url = 'http://www.wxpython.org/docs/api/'
default_official_url += 'wx.CLASSNAME-class.html'
default_sphinx_url = 'http://xoomer.virgilio.it/infinity77/wxPython/Widgets/'
default_sphinx_url += 'wx.CLASSNAME.html'
default_widgets_url = 'http://docs.wxwidgets.org/stable/'
default_widgets_url += 'wx_wxCLASSNAME.html#wxCLASSNAME'


USE_DEFAULT = 1


class wxFeature:

    banner_shade = '#FFFFFF'
    indent = 0

    def __init__(self, name, official_url=USE_DEFAULT,
                             sphinx_url=USE_DEFAULT,
                             widgets_url=USE_DEFAULT):

        self.name = name
        self.description = ''
        self.notes = []

        self.official_url = official_url if official_url else None
        self.sphinx_url = sphinx_url if sphinx_url else None
        self.widgets_url = widgets_url if widgets_url else None

        self.indent = self.indent * ' '

    def get_official_url(self):
        pass

    def get_sphinx_url(self):
        pass

    def get_widgets_url(self):
        pass

    def wikify_url(self, url, label):
        return '[[' + url + '|' + label + ']]'

    def link_urls(self, urls):
        return ' - '.join(urls)

    def url_str(self):
        urls = [(self.get_official_url(), 'wxPython'),
                (self.get_sphinx_url(), 'Sphinx'),
                (self.get_widgets_url(), 'wxWidgets')]
        urls = [url for url in urls if url[0] is not None]
        urls = [self.wikify_url(*url) for url in urls]
        return self.link_urls(urls)

    def title_str(self):

        return "~+'''{{{" + self.name + "}}}'''+~"

    def banner_str(self):
        s = '||<tablewidth="100%" width="40%" bgcolor="'
        s += self.banner_shade + '">' + self.title_str()
        s += '||<) ' + self.banner_shade + '>'
        s += self.url_str() + '||\n'
        return s


class wxClass(wxFeature):

    banner_shade = '#BBBBBB'
    indent = 1

    def __init__(self, name, official_docs=USE_DEFAULT,
                             sphinx_docs=USE_DEFAULT,
                             widget_docs=USE_DEFAULT):
        wxFeature.__init__(self, name, official_docs, sphinx_docs,
                                                            widget_docs)
        self.name = self.name
        self.events = []
        self.methods = []
        self.notes = []

    def get_url(self, source):
        if self.__dict__[source] != USE_DEFAULT:
            return self.__dict__[source]

        name = self.name
        if source == 'widgets_url':
            name = name.lower()

        template = eval('default_' + source)
        if source == 'sphinx_url' and 'event' in name.lower():
            template = template.replace('/Widgets/', '/Events/')

        return template.replace('CLASSNAME', name)

    def get_official_url(self):
        return self.get_url('official_url')

    def get_sphinx_url(self):
        return self.get_url('sphinx_url')

    def get_widgets_url(self):
        return self.get_url('widgets_url')

    def title_str(self):
        return "~+'''{{{wx." + self.name + "}}}'''+~"

    def toc_str(self):
        return '[[#' + self.name + '|' + self.name + ']]'

    def anchor_str(self):
        return '<<Anchor(' + self.name + ')>>'

    def __str__(self):
        s = self.anchor_str() + '\n'
        s += self.banner_str() + '\n'
        description = ''
        if self.description:
            description = self.indent + self.description
        events = ''
        if self.events:
            events = self.indent + "'''Events:''' "
            events += '~-' + ', '.join(self.events) + '-~'
        notes = ''
        if self.notes:
            notes = self.indent + "'''Notes:'''"
            for note in self.notes:
                notes += '\n' + self.indent + ' *' + note 
        blurbits = [description, events, notes]
        blurbits = [b for b in blurbits if b]
        if blurbits:
            s += '<<BR>>\n'.join(blurbits) + '<<BR>>\n'
        for m in self.methods:
            s += str(m) + '\n'
        s += "||~-[[#Top|Back to Top]]-~||\n"
        return s


class wxMethod(wxFeature):

    banner_shade = '#DDDDDD'
    indent = 2

    def __init__(self, name, wxclass, official_url=USE_DEFAULT,
                             sphinx_url=USE_DEFAULT,
                             widgets_url=USE_DEFAULT):
        wxFeature.__init__(self, name, official_url, sphinx_url,
                                                       widgets_url)
        self.wxclass = wxclass
        self.args = []
        self.args_of_interest = []
        self.styles = []
        self.default_styles = []
        wxclass.methods.append(self)

    def add_args(self, *args):
        self.args += args

    def get_official_url(self):
        if self.official_url is None:
            return None
        official = self.wxclass.get_official_url()
        if not official:
            return official
        else:
            return official + '#' + self.name

    def get_sphinx_url(self):
        if self.sphinx_url is None:
            return None
        sphinx = self.wxclass.get_sphinx_url()
        if not sphinx:
            return sphinx
        else:
            return sphinx + '#' + self.name

    def get_widgets_url(self):
        if self.widgets_url is None:
            return None
        widgets = self.wxclass.get_widgets_url()
        if not widgets:
            return widgets        
        if self.name == '__init__':
            name = 'ctor'
        else:
            name = self.name
        return widgets + name.lower()

    def args_str(self):
        argstrings = []
        for argstr in self.args:
            argstr = '{{{' + argstr + '}}}'
            for aoi in self.args_of_interest:
                if aoi in argstr:
                    argstr = "'''" + argstr + "'''"
                    break
            argstrings.append(argstr)
        return '(' + ', '.join(argstrings) + ')'

    def link_urls(self, urls):
        return '~-' + '<<BR>>'.join(urls) + '-~'

    def banner_str(self):
        s = ' ||<tablewidth="100%"' + self.banner_shade + ' 1%>'
        s += self.title_str()
        s += "||<( " + self.banner_shade + ' width="80%">' + self.args_str()
        s += "||<) " + self.banner_shade + ' width="20%">' + self.url_str() + '||\n'
        return s

    def __str__(self):
        s = self.banner_str() + '\n'
        s += self.indent + self.description + '\n'
        if self.styles:
            s += self.indent + "'''Styles: '''"
            styles = []
            for style in self.styles:
                if style in self.default_styles:
                    styles.append(style + '*')
                else:
                    styles.append(style)
            s += '~-' + ', '.join(styles) + '-~<<BR>>\n'
        if self.notes:
            for i in range(len(self.notes)):
                s += self.indent
                s += '~-note' + str(i + 1) + ': ' + self.notes[i] + '-~<<BR>>\n'

        return s
