#!/usr/bin/env python
import os.path, sys
from optparse import OptionParser, OptionGroup
from countershape import doc, blog, analysis, model

class CSDoc:
    usage = "usage: %prog [options] src [dst]"
    description = "Renders a Countershape documentation tree."
    def main(self):
        parser = OptionParser(self.usage, description=self.description)
        parser.add_option("-o", "--option", type="str",
                          action="append", dest="options",
                          default = [],
                          help="Add option to document namespace."),
        parser.add_option("-d", "--dummy",
                          action="store_true", dest="dummy", default=False,
                          help="Perform a dummy run - don't render any files.")

        group = OptionGroup(parser, "Analysis")
        group.add_option("-s", "--structure",
                          action="store_true", dest="structure", default=False,
                          help="Show site structure.")
        group.add_option("--blog-tags",
                          action="store_true", dest="blogtags", default=False,
                          help="Show blog tag histogram.")
        group.add_option("--blog-notags",
                          action="store_true", dest="blognotags", default=False,
                          help="Show blog posts with no tags.")
        group.add_option("--blog-has-option",
                          action="store", type="str", dest="bloghasoption", default=False,
                          help="Show blog posts with option.")
        group.add_option("--blog-has-no-option",
                          action="store", type="str", dest="bloghasnooption", default=False,
                          help="Show blog posts without option.")
        parser.add_option_group(group)

        options, args = parser.parse_args()

        analysis_options = ["structure", "blogtags", "blognotags", "bloghasoption", "bloghasnooption"]

        if any(getattr(options, i) for i in analysis_options):
            if len(args) < 1:
                parser.error("Please pass a source for analysis.")
            elif len(args) > 1:
                parser.error("Analysis options take a single argument.")
        else:
            if len(args) != 2:
                parser.error("Please pass source and destination.")
            if os.path.abspath(args[0]) == os.path.abspath(args[1]):
                parser.error("Refusing to render documentation source onto itself.")

        d = doc.Doc(args[0], options.options)
        if options.structure:
            d.root.dump()
        elif options.blogtags:
            analysis.blog_tags(d)
        elif options.blognotags:
            analysis.blog_notags(d)
        elif options.bloghasoption:
            analysis.blog_has_option(d, options.bloghasoption)
        elif options.bloghasnooption:
            analysis.blog_has_no_option(d, options.bloghasnooption)
        elif not options.dummy:
            try:
                d.render(args[1])
            except model.ApplicationError, v:
                print >> sys.stderr, "Error in %s"%v.page.src
                print >> sys.stderr, "\t", v
                sys.exit(1)
            lst = filter(
                    lambda x: isinstance(x, blog.Post), d.root.preOrder()
                )
            for i in lst:
                if i.changed:
                    print >> sys.stderr, "Rewriting %s"%i.src
                    i.rewrite()


def main():
    c = CSDoc()
    c.main()


if __name__ == "__main__":
    main()
