#!/usr/bin/env python

import os

from PageTemplate import PageTemplate
from options import options

# XXX change to ignore? Use hide to only hide from nav, but still process
# content (ie. push to web site)?
def hidden(dirpath,filenames,_hide=['']):
    """ Marks a directory as hidden. Doesn't show up in SiteMap or even get
        copied/rendered to live area. Used as a way to mark areas I'm messing
        with/working on.
    """
    if _hide[0]:
        if not dirpath.count(_hide[0]):
            _hide[0] = ''
    elif 'hide' in filenames:
        _hide[0] = dirpath
    return _hide[0]

def breadth_first_tree(root,
        _join=os.path.join, _getmtime=os.path.getmtime):
    """ Build a list of lists of each level in the sites heirarchy.
    """
    levels = {}
    files = {}
    hide = ''
    for dirpath,dirnames,filenames in os.walk(root):
#        for dirname in dirnames:
#            if os.path.islink(os.path.join(dirpath,dirname)):
#                # lets treat sym-links to directories as files
#                filenames.append(dirname)
        lvl = dirpath.count('/')
        levels.setdefault(lvl,[]).append(dirpath)
        files[dirpath]=dict([(f,None) for f in filenames])
    tiers = [levels[i] for i in range(len(levels))]
    tiers.reverse() # make bottom_up
    return tiers, files

def template_tree(template, root):
    """ Loop through site tree creating PageTemplate instances for each
        directory. Also build sitemap.
    """
    render = []
    parents = {}
    tiers, files = breadth_first_tree(root)
    dirname = os.path.dirname
    for tier in tiers:
        for path in tier:
            # children don't survive the pickling process
            page = PageTemplate(template,path,files[path])
            page.setChildren(parents.get(path,[]))
            page.pingSitemap()
            #
            parent_path = dirname(path)
            parents.setdefault(parent_path,[]).append(page)
            # 
            #if not hidden(path,files[path]):
            render.append(page)

    render.reverse()
    return render

def run():
    root = options.root
    template = options.template
    dest = options.dest
    for page in template_tree(template,root):
        if not page.hidden():
            page.render(dest)

if __name__=='__main__':
    run()
#    import profile
#    profile.run('run()')


