# inspired by code by Hans-Martin von Gaudecker, 2012

import os
from waflib import Node, Task, TaskGen, Errors, Logs, Build, Utils

class sphinx_build(Task.Task):
    color = 'BLUE'
    run_str = '${SPHINX_BUILD} -D ${VERSION} -D ${RELEASE} -q -b ${BUILDERNAME} -d ${DOCTREEDIR} ${SRCDIR} ${OUTDIR}'

    def __str__(self):
        env = self.env
        src_str = ' '.join([a.path_from(a.ctx.launch_node()) for a in self.inputs])
        tgt_str = ' '.join([a.path_from(a.ctx.launch_node()) for a in self.outputs])
        if self.outputs: sep = ' -> '
        else: sep = ''
        return'%s [%s]: %s%s%s\n'%(self.__class__.__name__.replace('_task',''),
                                   self.env['BUILDERNAME'], src_str, sep, tgt_str)

@TaskGen.extension('.py', '.rst')
def sig_hook(self, node):
    node.sig=Utils.h_file(node.abspath())

@TaskGen.feature("sphinx")
@TaskGen.before_method("process_source")
def apply_sphinx(self):
    """Set up the task generator with a Sphinx instance and create a task."""

    inputs = []
    for i in Utils.to_list(self.source):
        if not isinstance(i, Node.Node):
            node = self.path.find_node(node)
        else:
            node = i
        if not node:
            raise ValueError('[%s] file not found' % i)
        inputs.append(node)

    task = self.create_task('sphinx_build', inputs)

    conf = self.path.find_node(self.config)
    task.inputs.append(conf)

    confdir = conf.parent.abspath()
    buildername = getattr(self, 'builder', 'html')
    srcdir = getattr(self, 'srcdir', confdir)
    outdir = self.path.find_or_declare(getattr(self, 'outdir', buildername)).get_bld()
    doctreedir = getattr(self, 'doctreedir', os.path.join(outdir.abspath(), '.doctrees'))

    task.env['BUILDERNAME'] = buildername
    task.env['SRCDIR'] = srcdir
    task.env['DOCTREEDIR'] = doctreedir
    task.env['OUTDIR'] = outdir.abspath()
    task.env['VERSION'] = 'version=%s' % self.version
    task.env['RELEASE'] = 'release=%s' % getattr(self, 'release', self.version)

    import imp
    confData = imp.load_source('sphinx_conf', conf.abspath())

    if buildername == 'man':
        for i in confData.man_pages:
            target = outdir.find_or_declare('%s.%d' % (i[1], i[4]))
            task.outputs.append(target)

            if self.install_path:
                self.bld.install_files('%s/man%d/' % (self.install_path, i[4]), target)
    else:
        task.outputs.append(outdir)

def configure(conf):
    conf.find_program('sphinx-build', var='SPHINX_BUILD', mandatory=False)

# sphinx docs
from waflib.Build import BuildContext
class sphinx(BuildContext):
    cmd = "sphinx"
    fun = "sphinx"
