#
#
#

import sys


def usage():
    print "python pytowiki.py module_name output_file"


class CodeplexFormatter:

    def endl( self ):
        return "\n"

    def header1( self, s ):
        return "! " + s + self.endl()

    def header2( self, s ):
        return "!! " + s + self.endl()

    def header3( self, s ):
        return "!!! " + s + self.endl()

    def header4( self, s ):
        return "!!!! " + s + self.endl()

    def bulletItem( self, s ):
        return "* " + s + self.endl()

    def escapeMarkup( self, s ):
        return "{\"" + s + "\"}"

    def link( self, text, link ):
        return "[" + text + "|#" + link + "]"

    def anchor( self, link ):
        return "{anchor:" + link + "}" + self.endl()



class ModuleInfo:

    def __init__ (self, module):
        self.funcs = sorted( [ item for item in module.__dict__.values() if type(item).__name__ == "function" ], key=lambda x: x.__name__ ) 
        self.classes = sorted( [ item for item in module.__dict__.values() if type(item).__name__ == "class" ],  key=lambda x: x.__name__ )      

        for cls in  self.classes:
            cls.methods = sorted( [ item for item in cls.__dict__.values() if type(item).__name__ == "function" ], key=lambda x: x.__name__ ) 


def buildDoc( ioStream, formatter, apiInfo ):
  
    ioStream.write( formatter.header2( "Functions" ) )

    for func in apiInfo.funcs:
        ioStream.write( formatter.bulletItem( formatter.link( func.__name__, func.__name__ ) ) )

    ioStream.write( formatter.header2( "Classes" ) )

    for cls in apiInfo.classes:
        ioStream.write( formatter.bulletItem( formatter.link( cls.__name__, cls.__name__ ) ) )


    for func in apiInfo.funcs:
        ioStream.write( formatter.anchor( func.__name__ ) )
        ioStream.write( formatter.header3( "Function " +  func.__name__ ) )
        if func.__doc__ != None:
            ioStream.write( formatter.escapeMarkup( func.__doc__) + formatter.endl() )


    for cls in apiInfo.classes:
        ioStream.write( formatter.anchor( cls.__name__ ) )
        ioStream.write( formatter.header3( "Class " + cls.__name__ ) )
        if cls.__doc__ != None:
            ioStream.write( formatter.escapeMarkup( cls.__doc__)  + formatter.endl() )

        for m in cls.methods:
            if m.__doc__ != None:
                ioStream.write( formatter.bulletItem( formatter.link( m.__name__,  cls.__name__ + "." + m.__name__) ) )

        for m in cls.methods:
            if m.__doc__ != None:
                ioStream.write( formatter.anchor( cls.__name__ + "." + m.__name__ ) )
                ioStream.write( formatter.header4( formatter.escapeMarkup( cls.__name__  + "."  + m.__name__ ) ) )
                ioStream.write( formatter.escapeMarkup( m.__doc__ ) + formatter.endl() )


def main():

    if len(sys.argv) < 3:
        usage()
        return

    moduleName = sys.argv[1]
    fileName = sys.argv[2]

    try:

        module = __import__( moduleName )

        with file( fileName, "w" ) as wikiIo:

            apiInfo = ModuleInfo( module )

            formatter = CodeplexFormatter()

            buildDoc( wikiIo, formatter, apiInfo )         

    except ImportWarning:

        print "failed to import module " + moduleName


if __name__ == "__main__":
    main()