#! /usr/bin/env python
# encoding: utf-8
# hhaim, 2014 (IL) base on WAF book

"""
call 'waf --targets=waf.pdf' or use 'waf list' to see the targets available
"""

VERSION='0.0.1'
APPNAME='wafdocs'

import os, re, shutil
import shlex
import subprocess


top = '.'
out = 'build'

re_xi = re.compile('''^(include|image)::([^.]*.(asciidoc|\\{PIC\\}))\[''', re.M)
def ascii_doc_scan(self):
	p = self.inputs[0].parent
	node_lst = [self.inputs[0]]
	seen = []
	depnodes = []
	while node_lst:
		nd = node_lst.pop(0)
		if nd in seen: continue
		seen.append(nd)

		code = nd.read()
		for m in re_xi.finditer(code):
			name = m.group(2)
			if m.group(3) == '{PIC}':

				ext = '.eps'
				if self.generator.rule.rfind('A2X') > 0:
					ext = '.png'

				k = p.find_resource(name.replace('{PIC}', ext))
				if k:
					depnodes.append(k)
			else:
				k = p.find_resource(name)
				if k:
					depnodes.append(k)
					node_lst.append(k)
	return [depnodes, ()]
        
        

import re
def scansize(self):
	name = 'image::%s\\{PIC\\}\\[.*,(width|height)=(\\d+)' % self.inputs[0].name[:-4]
	re_src = re.compile(name)
	lst = self.inputs[0].parent.get_src().ant_glob('*.txt')
	for x in lst:
		m = re_src.search(x.read())
		if m:
			val = str(int(1.6 * int(m.group(2))))
			if m.group(1) == 'width':
				w = val
				h = "800"
			else:
				w = "800"
				h = val

			ext = self.inputs[0].name[-3:]
			if ext == 'eps':
				code = '-geometry %sx%s' % (w, h)
			elif ext == 'dia':
				if m.group(1) == 'width':
					h = ''
				else:
					w = ''
				code = '--size %sx%s' % (w, h)
			else:
				code = '-Gsize="%s,%s"' % (w, h)
			break
	else:
		return ([], '')

	return ([], code)

def options(opt):
	opt.add_option('--exe', action='store_true', default=False, help='Execute the program after it is compiled')

def configure(conf):
	conf.find_program('asciidoc', path_list='/usr/bin/', var='ASCIIDOC')
	conf.find_program('sphinx-build', path_list='/usr/local/bin/', var='SPHINX')
	pass;

def convert_to_pdf(task):
    input_file = task.outputs[0].abspath()
    out_dir = task.outputs[0].parent.get_bld().abspath()
    os.system('a2x --no-xmllint -v -f pdf  -d  article %s -D %s ' %(task.inputs[0].abspath(),out_dir ) )
    return (0)

def convert_to_pdf_book(task):
    input_file = task.outputs[0].abspath()
    out_dir = task.outputs[0].parent.get_bld().abspath()
    os.system('a2x --no-xmllint -v -f pdf  -d book %s -D %s ' %(task.inputs[0].abspath(),out_dir ) )
    return (0)


def ensure_dir(f):
    if not os.path.exists(f):
        os.makedirs(f)
	

def my_copy(task):
    input_file=task.outputs[0].abspath()
    out_dir=task.outputs[0].parent.get_bld().abspath()
    ensure_dir(out_dir)
    shutil.copy2(input_file, out_dir+ os.sep+task.outputs[0].name)
    return (0)


def do_visio(bld):
	for x in bld.path.ant_glob('visio\\*.vsd'):
		tg = bld(rule='${VIS} -i ${SRC} -o ${TGT} ', source=x, target=x.change_ext('.png'))

#def build_cp_docs (trex_src_dir, dest_dir = "_build", builder = "html"):
def build_cp_docs (task):
    out_dir = task.outputs[0].abspath()
    export_path = os.path.join(os.getcwd(), 'build', 'cp_docs')
    trex_core_git_path = os.path.join(os.getcwd(), os.pardir, "trex-core")
    if not os.path.isdir(trex_core_git_path):
        trex_core_git_path = os.getenv('TREX_CORE_GIT', None)
    if trex_core_git_path: # there exists a default directory or the desired ENV variable.
        trex_core_docs_path = os.path.abspath(os.path.join(trex_core_git_path, 'scripts', 'automation', 'trex_control_plane', 'doc'))
        build_doc_cmd = shlex.split("/usr/local/bin/sphinx-build -W -b {bld} {src} {dst}".format(
            bld= "html", 
            src= ".", 
            dst= out_dir)
        )
        return subprocess.call(build_doc_cmd, cwd = trex_core_docs_path)
    return (1)


def build(bld):
	bld(rule=my_copy, target='symbols.lang')

	for x in bld.path.ant_glob('images\\**\**.png'):
        	bld(rule=my_copy, target=x)
                bld.add_group() 


	for x in bld.path.ant_glob('yaml\\**\**.yaml'):
        	bld(rule=my_copy, target=x)
                bld.add_group() 


	for x in bld.path.ant_glob('video\\**\**.mp4'):
        	bld(rule=my_copy, target=x)
                bld.add_group() 


	for x in bld.path.ant_glob('images\\**\**.jpg'):
		bld(rule=my_copy, target=x)
                bld.add_group() 

	bld(rule=my_copy, target='my_chart.js')

	bld.add_group() # separator, the documents may require any of the pictures from above

	bld(rule='${ASCIIDOC}  -b deckjs -o ${TGT} ${SRC[0].abspath()}',
		source='trex_config.asciidoc ', target='trex_config_guide.html', scan=ascii_doc_scan)


	bld(rule='${ASCIIDOC}  -b deckjs -o ${TGT} ${SRC[0].abspath()}',
		source='trex_preso.asciidoc ', target='trex_preso.html', scan=ascii_doc_scan)

	bld(rule='${ASCIIDOC}  -a stylesheet=${SRC[1].abspath()} -a  icons=true -a max-width=55em  -o ${TGT} ${SRC[0].abspath()}',
		source='release_notes.asciidoc waf.css', target='release_notes.html', scan=ascii_doc_scan)
                

	bld(rule='${ASCIIDOC} -a docinfo -a stylesheet=${SRC[1].abspath()} -a  icons=true -a toc2 -a max-width=55em  -d book   -o ${TGT} ${SRC[0].abspath()}',
		source='trex_book.asciidoc waf.css', target='trex_manual.html', scan=ascii_doc_scan)

        bld(rule=convert_to_pdf_book,
		source='trex_book.asciidoc waf.css', target='trex_book.pdf', scan=ascii_doc_scan)
                

	bld(rule=convert_to_pdf_book,
		source='trex_vm_manual.asciidoc waf.css', target='trex_vm_manual.pdf', scan=ascii_doc_scan)

	bld(rule=convert_to_pdf_book,
		source='trex_control_plane_peek.asciidoc waf.css', target='trex_control_plane_peek.pdf', scan=ascii_doc_scan)
	
	bld(rule=convert_to_pdf_book,
		source='trex_control_plane_design_phase1.asciidoc waf.css', target='trex_control_plane_design_phase1.pdf', scan=ascii_doc_scan)

	bld(rule='${ASCIIDOC}   -a stylesheet=${SRC[1].abspath()} -a  icons=true -a toc2 -a max-width=55em  -o ${TGT} ${SRC[0].abspath()}',
		source='trex_vm_manual.asciidoc waf.css', target='trex_vm_manual.html', scan=ascii_doc_scan)

	bld(rule='${ASCIIDOC}   -a stylesheet=${SRC[1].abspath()} -a  icons=true -a toc2 -a max-width=55em  -o ${TGT} ${SRC[0].abspath()}',
		source='vm_doc.asciidoc waf.css', target='vm_doc.html', scan=ascii_doc_scan)

	bld(rule='${ASCIIDOC}   -a stylesheet=${SRC[1].abspath()} -a  icons=true -a toc2 -a max-width=55em  -o ${TGT} ${SRC[0].abspath()}',
		source='packet_builder_yaml.asciidoc waf.css', target='packet_builder_yaml.html', scan=ascii_doc_scan)
		
	bld(rule='${ASCIIDOC}   -a stylesheet=${SRC[1].abspath()} -a  icons=true -a toc2 -a max-width=55em  -o ${TGT} ${SRC[0].abspath()}',
		source='trex_rpc_server_spec.asciidoc waf.css', target='trex_rpc_server_spec.html', scan=ascii_doc_scan)

	bld(rule='${ASCIIDOC}   -a stylesheet=${SRC[1].abspath()} -a  icons=true -a toc2 -a max-width=55em  -o ${TGT} ${SRC[0].abspath()}',
		source='trex_control_plane_design_phase1.asciidoc waf.css', target='trex_control_plane_design_phase1.html', scan=ascii_doc_scan)
		
	bld(rule='${ASCIIDOC}   -a stylesheet=${SRC[1].abspath()} -a  icons=true -a toc2 -a max-width=55em  -o ${TGT} ${SRC[0].abspath()}',
		source='trex_control_plane_peek.asciidoc waf.css', target='trex_control_plane_peek.html', scan=ascii_doc_scan)

	bld(rule='${ASCIIDOC}   -a stylesheet=${SRC[1].abspath()} -a  icons=true -a toc2 -a max-width=55em  -o ${TGT} ${SRC[0].abspath()}',
		source='trex_console.asciidoc waf.css', target='trex_console.html', scan=ascii_doc_scan)

#   bld(rule=build_cp_docs,
#   	source='1.txt', target='cp_docs', scan=ascii_doc_scan)

	# generate control plane documentation
	export_path = os.path.join(os.getcwd(), 'build', 'cp_docs')
	trex_core_git_path = os.path.join(os.getcwd(), os.pardir, "trex-core")
	if not os.path.isdir(trex_core_git_path):
		trex_core_git_path = os.getenv('TREX_CORE_GIT', None)
	if trex_core_git_path: # there exists a default directory or the desired ENV variable.
		trex_core_docs_path = os.path.join(trex_core_git_path, 'scripts', 'automation', 'trex_control_plane', 'doc', 'index.rst')
		bld(rule=build_cp_docs,
#   		source = '1.txt',#trex_core_docs_path,
			target = 'cp_docs')
    #       build_cp_docs(trex_core_git_path, dest_dir= export_path)
	else:
		raise NameError("Environment variable 'TREX_CORE_GIT' is not defined.")


class Env(object):
    @staticmethod
    def get_env(name) :
        s= os.environ.get(name);
        if s == None:
            print "You should define $",name
            raise Exception("Env error");
        return (s);
    
    @staticmethod
    def get_release_path () :
        s= Env().get_env('TREX_LOCAL_PUBLISH_PATH');
        s +=get_build_num ()+"/"
        return  s;

    @staticmethod
    def get_remote_release_path () :
        s= Env().get_env('TREX_REMOTE_PUBLISH_PATH');
        return  s;

    @staticmethod
    def get_local_web_server () :
        s= Env().get_env('TREX_WEB_SERVER');
        return  s;

    # extral web 
    @staticmethod
    def get_trex_ex_web_key() :
        s= Env().get_env('TREX_EX_WEB_KEY');
        return  s;

    @staticmethod
    def get_trex_ex_web_path() :
        s= Env().get_env('TREX_EX_WEB_PATH');
        return  s;

    @staticmethod
    def get_trex_ex_web_user() :
        s= Env().get_env('TREX_EX_WEB_USER');
        return  s;

    @staticmethod
    def get_trex_ex_web_srv() :
        s= Env().get_env('TREX_EX_WEB_SRV');
        return  s;

    @staticmethod
    def get_trex_core() :
        s= Env().get_env('TREX_CORE_GIT');
        return  s;



def release(bld):
    # copy all the files to our web server 
    core_dir = Env().get_trex_core()
    release_dir = core_dir +"/scripts/doc/";
    os.system('mkdir -p '+release_dir)
    os.system('cp -rv build/release_notes.* '+ release_dir)


def publish(bld):
    # copy all the files to our web server 
    remote_dir = "%s:%s" % ( Env().get_local_web_server(), Env().get_remote_release_path ()+'../doc/')
    os.system('rsync -av --rsh=ssh build/ %s' % (remote_dir))


def publish_ext(bld):
   from_ = 'build/'
   os.system('rsync -avz -e "ssh -i %s" --rsync-path=/usr/bin/rsync %s %s@%s:%s/doc/' % (Env().get_trex_ex_web_key(),from_, Env().get_trex_ex_web_user(),Env().get_trex_ex_web_srv(),Env().get_trex_ex_web_path() ) )